[
  {
    "path": ".dir-locals.el",
    "content": ";;; This file contains project-specific emacs configuration\n((python-mode . ((apheleia-formatter . (black isort)))))\n"
  },
  {
    "path": ".djlintrc",
    "content": "{\n\"custom_blocks\": \"element,slot,setvar\"\n}\n"
  },
  {
    "path": ".editorconfig",
    "content": "# http://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 2\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n[*.ini]\nindent_size = 4\n\n[*.py]\nindent_size = 4\n\n[*.html]\nindent_size = 4\n\n[Makefile]\nindent_style = tab\nindent_size = 8\n\n[*.md]\ninsert_final_newline = false\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": ".envrc",
    "content": "export DIRENV_WARN_TIMEOUT=20s\n\neval \"$(devenv direnvrc)\"\n\n# The use_devenv function supports passing flags to the devenv command\n# For example: use devenv --impure --option services.postgres.enable:bool true\nuse devenv\n"
  },
  {
    "path": ".gitea/ISSUE_TEMPLATE/discussion.md",
    "content": "---\nname: \"Discussion\"\nabout: \"Overall discussions and general questions\"\ntitle: \"\"\nassignees: []\nlabels:\n- \"Discussion\"\n\n---"
  },
  {
    "path": ".gitea/ISSUE_TEMPLATE/issue.md",
    "content": "---\nname: \"Issue\"\nabout: \"For cases clearly pointing to an issue in django-allauth\"\ntitle: \"\"\nlabels: \"\"\nassignees: []\n\n---"
  },
  {
    "path": ".gitea/pull_request_template.md",
    "content": "# Submitting Pull Requests\n\n## General\n\n - [ ] Make sure you use [semantic commit messages](https://seesparkbox.com/foundry/semantic_commit_messages).\n       Examples: `\"fix(google): Fixed foobar bug\"`, `\"feat(accounts): Added foobar feature\"`.\n - [ ] All Python code must formatted using Black, and clean from pep8 and isort issues.\n - [ ] JavaScript code should adhere to [StandardJS](https://standardjs.com).\n - [ ] If your changes are significant, please update `ChangeLog.rst`.\n - [ ] If your change is substantial, feel free to add yourself to `AUTHORS`.\n\n ## Provider Specifics\n\n In case you add a new provider:\n\n- [ ] Make sure unit tests are available.\n- [ ] Ensure your provider is tested by adding an entry over at `tests/projects/common/settings.py::INSTALLED_SOCIALACCOUNT_APPS`.\n- [ ] Provide provider specific documentation at `docs/socialaccount/providers/<provider name>.rst`.\n- [ ] Link to your provider specific documentation at `docs/insocialaccount/providers/index.rst`.\n- [ ] Add an entry for your provider in the quickstart, over at `docs/installation/quickstart.rst::INSTALLED_APPS`."
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: pennersr\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: # Replace with a single Ko-fi username\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\ncustom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/issue.md",
    "content": "---\nname: \"Issue (when not using Codeberg)\"\nabout: \"\\U0001F6D1 Please use https://codeberg.org/allauth/django-allauth/issues\"\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n# 🛑 Stop\n\nThe issue tracker has been moved to https://codeberg.org/allauth/django-allauth/issues.\nPlease submit your issue there."
  },
  {
    "path": ".github/SECURITY.md",
    "content": "# Security Policy\n\nPlease report security issues only to security@allauth.org.\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n- package-ecosystem: \"github-actions\"\n  directory: \"/\"\n  groups:\n    GitHub_Actions:\n      patterns:\n        - \"*\"  # Group all Actions updates into a single larger pull request\n  schedule:\n    interval: weekly\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "# 🛑 Stop\n\nThe project has been moved to https://codeberg.org/allauth/django-allauth.\nPlease submit your pull request there.\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  test:\n    runs-on: ubuntu-24.04\n    strategy:\n      matrix:\n        include:\n          - python-version: \"3.10\"\n            debian-version: trixie\n          - python-version: \"3.12\"\n            debian-version: trixie\n          - python-version: \"3.13\"\n            debian-version: trixie\n          - python-version: \"3.14\"\n            debian-version: trixie\n    container:\n      image: python:${{ matrix.python-version }}-${{ matrix.debian-version }}\n    steps:\n      - uses: actions/checkout@v6\n      - name: Install dependencies\n        run: |\n          apt-get update\n          apt-get install -y --no-install-recommends gettext make\n      - name: Install nox\n        run: pip install nox\n      - name: Run tests\n        run: nox -x --session \"test-${{ matrix.python-version }}\"\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n  docs:\n    runs-on: ubuntu-22.04\n    needs: []\n    strategy:\n      matrix:\n        python-version: [3.14]\n    container:\n      image: python:3.14-trixie\n    steps:\n      - uses: actions/checkout@v6\n      - name: Install nox\n        run: pip install nox\n      - name: Build docs\n        run: nox -x --session \"docs\"\n\n  lint:\n    runs-on: ubuntu-22.04\n    needs: []\n    strategy:\n      matrix:\n        python-version: [3.14]\n    container:\n      image: python:3.14-trixie\n    steps:\n      - uses: actions/checkout@v6\n      - name: Install nox\n        run: pip install nox\n      - name: Run linter\n        run: nox -x -t lint\n\n  standardjs:\n    runs-on: ubuntu-24.04\n    needs: []\n    strategy:\n      matrix:\n        python-version: [3.14]\n    container:\n      image: node:22-trixie\n    steps:\n      - uses: actions/checkout@v6\n      - name: Install standardjs dependencies\n        run: make ci-install-standardjs\n      - name: Run standardjs\n        run: make standardjs\n"
  },
  {
    "path": ".gitignore",
    "content": "*.pyc\n*~\n.idea\n.project\n.pydevproject\n*.geany\ndocs/_build\nbuild\ndist\n*.egg*\nexamples/**/local_settings.py\nnode_modules/\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.coverage\n.coverage.*\ncoverage.xml\n.mypy_cache/\n.nox/\n\n.ropeproject/*\npep8.txt\n*.bak\n.#*\n\\#*\n*.db\n*.tmp\nvirtualenv\n.DS_Store\n\n*.prefs\n*.mo\n/.stfolder\n.direnv/\nexamples/react-spa/docker-compose.override.yml\n\n# Devenv\n.devenv*\ndevenv.local.nix\n\n# direnv\n.direnv\n\n# pre-commit\n.pre-commit-config.yaml\n"
  },
  {
    "path": ".readthedocs.yaml",
    "content": "# Read the Docs configuration file for Sphinx projects\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details\n\n# Required\nversion: 2\n\n# Set the OS, Python version and other tools you might need\nbuild:\n  os: ubuntu-22.04\n  tools:\n    python: \"3.11\"\n\n# Build documentation in the \"docs/\" directory with Sphinx\nsphinx:\n  configuration: docs/conf.py\n\n# Optional but recommended, declare the Python requirements required\n# to build your documentation\n# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html\npython:\n   install:\n   - requirements: docs/requirements.txt\n"
  },
  {
    "path": ".woodpecker.yaml",
    "content": "when:\n  - event: pull_request\n  - event: [push, tag, manual]\n    branch: main\n\nsteps:\n  test:\n    image: python:${PYTHON_VERSION}-${DEBIAN_VERSION}\n    commands:\n      - apt-get update\n      - apt-get install -y --no-install-recommends gettext make\n      - pip install nox\n      - nox -x --session \"test-${PYTHON_VERSION}\"\n\n  docs:\n    image: python:${PYTHON_VERSION}-${DEBIAN_VERSION}\n    commands:\n      - pip install nox\n      - nox -x --session \"docs\"\n    depends_on: []\n    when:\n      - matrix:\n          PYTHON_VERSION: 3.14\n\n  lint:\n    image: python:${PYTHON_VERSION}-${DEBIAN_VERSION}\n    commands:\n      - pip install nox\n      - nox -x -t lint\n    depends_on: []\n    when:\n      - matrix:\n          PYTHON_VERSION: 3.14\n\n  standardjs:\n    image: node:22-${DEBIAN_VERSION}\n    commands:\n      - make ci-install-standardjs\n      - make standardjs\n    depends_on: []\n    when:\n      - matrix:\n          PYTHON_VERSION: 3.14\n\nmatrix:\n  include:\n    # To cut down on CI pipeline duration, test oldest/latest Python only.\n    - PYTHON_VERSION: 3.10\n      DEBIAN_VERSION: trixie\n    - PYTHON_VERSION: 3.14\n      DEBIAN_VERSION: trixie\n"
  },
  {
    "path": "AUTHORS",
    "content": "django-allauth was started by Raymond Penners\n(<raymond.penners@intenct.nl> or @pennersr) in October 2010, inspired\nby and partly based on existing projects such as Pinax (account app),\nDjango-Socialauth, django-socialregistration.\n\n# Contributors\n\nAarni Koskela\nAaron van Derlip\nAbhinav Johri\nAbhishek Kumar Jaiswal\nAdam Johnson\nAdam McKerlie\nAgustin Perez Paladini\nAhmet Emre Aladağ\nAiden Lu\nAldiantoro Nugroho\nAlexander Gaevsky\nAlfredo Altamirano\nAndrean Franc\nAndrei Satsevich\nAndrew Chen Wang\nAndrey Akolpakov\nAndrey Balandin\nAndy Matthews\nAni Vera\nAnna Sirota\nAnton Goncharov\nAntonin Delpeuch\nAron Griffis\nBas ten Berge\nBasil Shubin\nBen Timby\nBenjamin Howes\nBenjamin Jorand\nBhavani Ravi\nBiel Massot\nBjörn Andersson\nBojan Mihelac\nBrandon Kong\nBruno Alla\nChris Beaven\nChris Davis\nChristian Carter\nChristopher Grebs\nDan LaManna\nDani Hodovic\nDaniel Eriksson\nDaniel Widerin\nDavid Ascher\nDavid Cain\nDavid D. Lowe\nDavid Evans\nDavid Friedman\nDavid Hummel\nDimitris Tsimpitas\nDmytro Litvinov\nEgor Poderyagin\nEran Rundstein\nEric Amador\nEric Delord\nFabio Caritas Barrionuevo da Luz\nFacundo Gaich\nFelipe Faria\nFilip Dobrovolný\nFrancis Brito\nFrantisek Malina\nFred Palmer\nFábio Santos\nGeorge Whewell\nGriffith Rees\nGuignard Javier\nGuilhem Saurel\nGuillaume Schurck\nGuillaume Vincent\nGuoyu Hao\nHaesung Park\nHatem Nassrat\nHyunwoo Shim\nIan R-P\nIgnacio Ocampo\nIllia Volochii\nJ. Erm\nJ. Fernando Sánchez\nJack Shedd\nJakob Gerhard Martinussen\nJames Rivett-Carnac\nJames Thompson\nJannis Leidel\nJannis Vajen\nJason Wallace\nJeff Bowen\nJeff Triplett\nJeremy Satterfield\nJerome Leclanche\nJesse Gerard Brands\nJihoon Park\nJiyoon Ha\nJoe Vanderstelt\nJoel Fernandes\nJohn Bazik\nJohn Whitlock\nJonas Aule\nJoonHwan Kim\nJosh Owen\nJosh Wright\nJoshua Butler\nJoshua Sorenson\nJulen Ruiz Aizpuru\nJustin Michalicek\nJustin Pogrob\nKarthikeyan Singaravelan\nKarun Shrestha\nKevin Dice\nKimsia Sim\nKoichi Harakawa\nKun Liu\nKyle Harrison\nLee Semel\nLev Predan Kowarski\nLuis Diego García\nLuiz Guilherme Pais dos Santos\nLuke Burden\nLuke Crouch\nMaksim Rukomoynikov\nMarcin Skarbek\nMarcin Spoczynski\nMarco Fucci\nMarjori Pomarole\nMarkus Kaiserswerth\nMarkus Thielen\nMartin Bächtold\nMatt Nishi-Broach\nMauro Stettler\nMikhail Mitiaev\nMorgante Pell\nNariman Gharib\nNathan Strobbe\nNicolas Acosta\nNiklas A Emanuelsson\nOleg Sergeev\nPatrick Paul\nPaul Juergen Fischer\nPaulo Eduardo Neves\nPavel Oborin\nPavel Savchenko\nPeter Bittner\nPeter Rowlands\nPeter Stein\nPhilip John James\nRabi Alam\nRadek Czajka\nRense VanderHoek\nRick Westera\nRobert Balfre\nRoberto Novaes\nRod Xavier Bondoc\nRoman Tomjak\nRoumen Antonov\nRyan Jarvis\nRyan Verner\nSafwan Rahman\nSam Solomon\nSanghyeok Lee\nSeizan Shimazaki\nSerafeim Papastefanos\nSergey Silaev\nShane Rice\nStephen Kent\nStuart Ross\nTerry Jones\nTiago Loureiro\nTim Gates\nTom Hacohen\nTomas Babej\nTomas Marcik\nTrey Corple\nTuk Bredsdorff\nUdi Oron\nVadim Meshcheryakov\nVeljko Jovanovic\nVictor Semionov\nVlad Dmitrievich\nVolodymyr Yatsyk\nVuong Nguyen\nWendy Edwards\nWill Gordon\nWill Ross\nWilliam Li\nYaroslav Muravsky\nYoucef Mammar\nYuri Kriachko\nMohamed BEN MAKHLOUF\n"
  },
  {
    "path": "CONTRIBUTING.rst",
    "content": "Contributing to django-allauth\n==============================\n\n.. begin-contributing\n\nThank you for considering contributing to django-allauth! This document outlines the process for contributing to the project and sets up your development environment.\n\nCode of Conduct\n---------------\n\nIn the interest of fostering an open and welcoming community, we as contributors and maintainers pledge to make participation in our project a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.\n\nGetting Started\n---------------\n\nSetting Up Your Development Environment\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThere are two primary ways to set up your development environment:\n\nOption 1: Standard Python Virtual Environment (Recommended for Beginners)\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n1. **Install system dependencies**\n\n   Before creating a virtual environment, you'll need to install some system dependencies:\n\n   **On macOS:**\n\n   .. code-block:: bash\n\n      # Using Homebrew\n      brew install libxml2 libxmlsec1 pkg-config openssl\n\n   **On Ubuntu/Debian:**\n\n   .. code-block:: bash\n\n      sudo apt-get install libxml2-dev libxmlsec1-dev libxmlsec1-openssl pkg-config\n\n   **On RHEL/CentOS/Fedora:**\n\n   .. code-block:: bash\n\n      sudo dnf install libxml2-devel xmlsec1-devel xmlsec1-openssl-devel libtool-ltdl-devel\n\n2. **Create and activate a virtual environment**\n\n   .. code-block:: bash\n\n      # Create a virtual environment\n      python -m venv virtualenv\n\n      # Activate it\n      # On Windows:\n      virtualenv\\Scripts\\activate\n      # On macOS/Linux:\n      source virtualenv/bin/activate\n\n3. **Install django-allauth in development mode**\n\n   .. code-block:: bash\n\n      # Install development dependencies\n      pip install -r requirements-dev.txt\n\nOption 2: Using devenv/Nix (Recommended for Advanced Users)\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf you prefer a more isolated and reproducible development environment, you can use Nix-based `devenv <https://devenv.sh>`_:\n\n1. **Install devenv** (If you don't have it already)\n\n   Follow the `official installation instructions <https://devenv.sh/getting-started/>`_.\n\n2. **Activate the developer environment**\n\n   .. code-block:: bash\n\n      # This will create an isolated environment with all required dependencies\n      devenv shell\n\n   Note: The first time you run this command, it may take a significant amount of time as it builds all dependencies. Subsequent launches will be much faster.\n\n\nRunning Tests\n-------------\n\ndjango-allauth uses a comprehensive test suite. You can run tests in several ways:\n\nUsing pytest directly\n~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: bash\n\n   # Run all tests for the default setup\n   pytest allauth/\n\n   # Run tests with a specific Django settings module\n   pytest --ds=tests.projects.regular.settings tests/\n\n   # Run a specific test file\n   pytest tests/apps/account/test_login.py\n\nNote, if you are using MacOS, using pip and get this error when run tests:\n\n.. code-block:: bash\n\n   import xmlsec\n   ImportError: dlopen( ...  symbol not found in flat namespace '_xmlSecOpenSSLTransformHmacRipemd160GetKlass')\n\nYou can try:\n\n.. code-block:: bash\n\n   pip uninstall xmlsec lxml\n   pip install --no-binary :all: xmlsec\n   # Ref: https://github.com/xmlsec/python-xmlsec/issues/320\n\nUsing nox (recommended)\n~~~~~~~~~~~~~~~~~~~~~~~\n\nNox automates testing across different Python and Django versions:\n\n.. code-block:: bash\n\n   # List all available sessions\n   nox --list\n\n   # Run tests for a specific Python version\n   nox -x --session \"test-3.11\"\n\n   # Run tests for specific environment\n   nox -x --session \"test-3.11\" --python 3.11 -- --ds=tests.projects.regular.settings tests/apps/account/test_login.py\n\nRun Code Quality Checks\n~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: bash\n\n   # Run all linting checks\n   nox -t lint\n\n   # Run specific check\n   nox --session black\n   nox --session isort\n   nox --session flake8\n   nox --session bandit\n   nox --session djlint\n\nBuilding Documentation\n----------------------\n\nDocumentation is built using Sphinx:\n\n.. code-block:: bash\n\n   # Build the documentation\n   nox --session docs\n\nThe built documentation will be available in the ``docs/_build/html`` directory.\n\nDevelopment Workflow\n--------------------\n\n1. **Create a new branch for your feature or bugfix**\n\n   .. code-block:: bash\n\n      git checkout -b feature/your-feature-name\n\n2. **Make your changes and add tests**\n\n   All new features should include proper tests.\n\n3. **Run tests locally to ensure everything passes**\n\n   .. code-block:: bash\n\n      nox -x --session \"test-3.11\"\n\n4. **Run code quality checks**\n\n   .. code-block:: bash\n\n      nox -t lint\n\n5. **Commit your changes with meaningful commit messages**\n\n6. **Submit a pull request to the main repository**\n\nPull Request Guidelines\n-----------------------\n\n- Update documentation for significant changes\n- Add tests for new functionality\n- Ensure all tests pass\n- Follow the project's code style\n- Keep pull requests focused on a single topic\n- Write clear, descriptive commit messages\n\nAdditional Resources\n--------------------\n\n- `Official Documentation <https://docs.allauth.org/en/latest/>`_\n- `Issue Tracker <https://codeberg.org/allauth/django-allauth/issues>`_\n- `Project Source <https://codeberg.org/allauth/django-allauth>`_\n\nThank you for your contributions!\n\n.. end-contributing\n"
  },
  {
    "path": "ChangeLog.rst",
    "content": "65.15.0 (2025-03-09)\n********************\n\n.. note::\n\n    💙 **Is django-allauth's authentication the entrance to your business?**\n    Please consider supporting its continued development by becoming a sponsor at\n    https://allauth.org/sponsors/. Your support helps keep this project thriving!\n\nNote worthy changes\n-------------------\n\n- All user facing codes (e.g. those that the user needs to manually input over\n  at password reset, email/phone verification, login code, OIDC device codes)\n  now follow the recommendations over at `RFC 8628, Section 6.1\n  <https://datatracker.ietf.org/doc/html/rfc8628#section-6.1>`_.  It uses dashed\n  codes, such as \"WDJB-MJHT\", by default. You can control the format of all codes\n  via a new setting `ALLAUTH_USER_CODE_FORMAT``, or, adjust the format per use\n  case via one of ``ACCOUNT_LOGIN_BY_CODE_FORMAT``,\n  ``ACCOUNT_PHONE_VERIFICATION_CODE_FORMAT``,\n  ``ACCOUNT_PASSWORD_RESET_BY_CODE_FORMAT``,\n  ``ACCOUNT_EMAIL_VERIFICATION_BY_CODE_FORMAT``, ``IDP_OIDC_USER_CODE_FORMAT``.\n\n- Added optional support for requesting new login codes. See\n  ``ACCOUNT_LOGIN_BY_CODE_SUPPORTS_RESEND``.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Dropped support for Python 3.8 and 3.9. Both these Python versions are\n  end-of-life.\n\n\n65.14.3 (2026-02-13)\n********************\n\nFixes\n-----\n\n- Version 65.14.2 was not compatible with Python 3.8/3.9 due to use of an\n  unsupported typing construct, fixed.\n\n\n65.14.2 (2026-02-13)\n********************\n\nSecurity notice\n---------------\n\n- Rate limiting and IP address detection: as Django applications cannot reliably\n  determine client IP addresses out of the box, you must override\n  ``get_client_ip()`` to match your deployment architecture. If you omitted to\n  do so, the default implementation trusted ``X-Forwarded-For``, which can be\n  spoofed to bypass rate limits. Now, ``X-Forwarded-For`` is distrusted by\n  default. You must either configure ``ALLAUTH_TRUSTED_PROXY_COUNT``, rely on\n  ``ALLAUTH_TRUSTED_CLIENT_IP_HEADER``, or override ``get_client_ip()``. Thanks\n  to Ayato Shitomi for reporting.\n\n\n65.14.1 (2026-02-07)\n********************\n\nFixes\n-----\n\n- When using ``ACCOUNT_CHANGE_EMAIL = True``, if the user initiating the change\n  email process had no verified email address, ``user.email`` would still\n  reflect the old email address while the verification process was pending.\n\nSecurity notice\n---------------\n\n- SAML: When IdP initiated SSO was enabled (it is by default disabled), any URL\n  found in the SAML ``RelayState`` parameter would be used to redirect to,\n  potentially redirecting the authenticated user to a wrong site. Thanks to\n  Ayato Shitomi and Funabiki Keisuke for reporting.\n\n\n65.14.0 (2026-01-17)\n********************\n\nNote worthy changes\n-------------------\n\n- Steam: the provider now supports initiating headless logins per\n  redirect.\n\n- Shopify: if ``email_verified`` is present in the user payload, it will be used\n  to mark the email address retrieved as verified accordingly.\n\n- IdP: added support for JWT based access tokens (see\n  ``IDP_OIDC_ACCESS_TOKEN_FORMAT``).\n\n- IdP: added support for pointing to a custom userinfo endpoint (see\n  ``IDP_OIDC_USERINFO_ENDPOINT``)\n\n- For OpenID Connect providers, you can now configure the field to be used as\n  the account ID by setting ``\"uid_field\"`` in the relevant\n  ``SocialApp.settings``.\n\n- Headless: the JWT algorithm is now configurable, supporting HS256.\n\n\nFixes\n-----\n\n- IdP: Access tokens without a user attached (client credentials) were no longer\n  recognized in DRF/Ninja endpoints.\n\n- ``requests`` sessions are now disposed of after use to avoid resource leaks.\n\n\n65.13.1 (2025-11-20)\n********************\n\nNote worthy changes\n-------------------\n\n- Django 6.0 is now officially supported.\n\n\nFixes\n-----\n\n- Internal imports related to headless token strategies were causing (harmless)\n  deprecation warnings, fixed.\n\n- Pending social signups stored in the session by allauth versions prior to\n  65.5.0 are not resumable by newer versions. This could cause 500s while\n  upgrading, fixed.\n\n- Headless: the reauthentication-required response in the OpenAPI specification\n  was wrongly nested and did not match the actual implementation, fixed.\n\n\n65.13.0 (2025-10-31)\n********************\n\nNote worthy changes\n-------------------\n\n- IdP: Added support for RP-Initiated Logout.\n\n- Headless: added JWT token strategy.\n\n- Added support for \"Trust this browser?\" functionality for logging in by code.\n  See ``ACCOUNT_LOGIN_BY_CODE_TRUST_ENABLED``.\n\n- OpenID Connect: to avoid issues with client IDs containing colons,\n  ``client_secret_post`` is now preferred above ``client_secret_basic``.\n\n\nSecurity notice\n---------------\n\n- Both Okta and NetIQ were using ``preferred_username`` as the identifier for\n  third-party provider accounts.  That value may be mutable and should therefore\n  be avoided for authorization decisions.  The providers are now using ``sub``\n  instead.\n\n- IdP: marking a user as ``is_active=False`` after having handed tokens for that\n  user while the account was still active had no effect. Fixed -- the\n  access/refresh tokens are now rejected. Thanks to Joshua Rogers for reporting\n  this and the previous issue.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Headless now requires the ``headless`` extra to be installed. For example:\n  ``pip install django-allauth[headless]``.\n\n- Okta and NetIQ: see the security notice on Okta and NetIQ. Already existing\n  ``SocialAccount`` records will no longer be linked due to the switch to\n  ``sub``.  You will need to manually handle this situation either, by\n  populating ``SocialAccount.uid`` based on ``sub`` located in\n  ``SocialAccount.extra_data``,or, if you are absolutely certain the security\n  notice is of no concern for your use case, by setting ``\"uid_field\":\n  \"preferred_username\"`` in the relevant ``SocialApp.settings``.\n\n\n65.12.1 (2025-10-16)\n********************\n\nSecurity notice\n---------------\n\n- There was a flaw in the email verification process when using\n  ``ACCOUNT_CHANGE_EMAIL = True``.  If you are using this configuration, you are\n  advised to upgrade as soon as possible.  Note that the default value is\n  ``False``.\n\n\n65.12.0 (2025-10-05)\n********************\n\nNote worthy changes\n-------------------\n\n- Updated VK urls from \"vk.com\" to \"vk.ru\".\n\n- Added new socialaccount provider: Discogs.\n\n- MediaWiki: you can now setup a custom user agent to avoid getting blocked,\n  see: https://phabricator.wikimedia.org/T400119\n\n- IdP: Added optional support for wildcards in redirect URIs and CORS origins.\n  To support this, a new field was added to the ``Client`` model. Therefore, you\n  need to run migrations for the ``allauth.idp.oidc`` app.\n\n- Headless: an email address that was in the process of being verified by code\n  was presented in the list of email address, but could not be deleted. Now, a\n  ``DELETE`` will actually abort the process, effectively removing the pending\n  email address from the list.\n\n\n65.11.2 (2025-09-09)\n********************\n\nFixes\n-----\n\n- OpenID Connect: the OpenID Connect provider was using the wrong key lookup\n  mechanism, resulting in login failures.\n\n\n65.11.1 (2025-08-27)\n********************\n\nSecurity notice\n---------------\n\n- If you configured password to be optional (e.g. using ``ACCOUNT_SIGNUP_FIELDS\n  = [\"email*\", \"password1\"]``), then accounts would be created having a blank\n  password instead of an unusable password. If you were using this configuration\n  then you may need to manually set an unusable password for accounts created.\n\n\n65.11.0 (2025-08-15)\n********************\n\nNote worthy changes\n-------------------\n\n- OpenID Connect: using ``fetch_userinfo=False`` you can now skip the additional\n  call to the userinfo endpoint. Instead, the ID token will be used.\n\n\nFixes\n-----\n\n- Headless: passwordless signup was not supported, fixed.\n\n- Headless: when serializing the user nested dataclasses, as well as optional\n  types ended up as ``string`` type, fixed.\n\n- When signing up with a social account no authentication record was added to\n  the session, fixed.\n\n\nBackwards incompatible changes\n------------------------------\n\n- OpenID Connect: the ID token and userinfo (when present) are now stored in\n  ``SocialAccount.extra_data``, below the respective ``\"id_token\"`` and\n  ``\"userinfo\"`` keys. Compatibility with ``extra_data`` from existing accounts\n  that do not have this new structure is retained. However, if your own project\n  expects ``extra_data`` to be in a certain format this change may impact you.\n\n\n65.10.0 (2025-07-10)\n********************\n\nNote worthy changes\n-------------------\n\n- IdP: Added support for the device authorization grant.\n\n- Headless: custom user payloads can now be properly reflected in the OpenAPI\n  specification by provider a user ``dataclass``. See the newly introduced\n  ``get_user_dataclass()`` and ``user_as_dataclass()`` adapter methods.\n\n- Added a new signal (``authentication_step_completed``) that is emitted when an\n  individual authentication step is completed.\n\n- MFA: Added a setting (``MFA_ALLOW_UNVERIFIED_EMAIL``) to allow unverified\n  email addresses in combination with MFA.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Soundcloud: as per https://developers.soundcloud.com/blog/urn-num-to-string,\n  the provider now uses the user ``urn`` instead of the ``id`` as the ID for\n  social accounts. This change is backward incompatible. Instructions on\n  how to migrate existing social accounts can be found in the allauth provider\n  documentation for SoundCloud.\n\n\nFixes\n-----\n\n- Phone: The recently added support for phone (SMS) authentication did fully integrate\n  with third-party provider signups. For example, whether or not the phone\n  number is required was not respected during signup. Fixed.\n\n- IdP: Token revocation failed when a single ``token_type_hint`` was passed,\n  fixed.\n\n- The ``verified_email_required`` decorator did not support email verification\n  by code. Additionally, it did not rate limit verification emails\n  in case of GET requests. Both are fixed.\n\n- The account adapter ``clean_email()`` method was not called when a social account\n  auto signup took place, fixed.\n\n\n65.9.0 (2025-06-01)\n*******************\n\nNote worthy changes\n-------------------\n\n- Added ``allauth.idp`` to the project, offering out of the box OpenID Connect\n  provider support, as well as integration with Django REST framework and Django\n  Ninja.\n\n- Headless: the OpenAPI specification now more accurately reflects single client\n  configurations set via ``HEADLESS_CLIENTS``. When a single client is active,\n  the redundant ``{client}`` path parameter and its global definition are\n  removed from the generated schema.\n\n\n65.8.1 (2025-05-21)\n*******************\n\nFixes\n-----\n\n- Fixed a compatibility issue with the newly released fido2 2.0.0 package.\n\n\nSecurity notice\n---------------\n\n- After a successful login, the rate limits for that login were cleared,\n  allowing a succesful login on a specific IP address to be used as a means to\n  clear the login failed rate limit for that IP address. Fixed.\n\n\n65.8.0 (2025-05-08)\n*******************\n\nNote worthy changes\n-------------------\n\n- Fixed VK (a.k.a VK ID) social account provider. Improved its documentation.\n\n- Added optional support for requesting new email/phone verification codes during\n  signup.  See ``ACCOUNT_EMAIL_VERIFICATION_SUPPORTS_RESEND`` and\n  ``ACCOUNT_PHONE_VERIFICATION_SUPPORTS_RESEND``.\n\n- Added optional support for changing your email or phone at the verification stage while signing up.\n  See ``ACCOUNT_EMAIL_VERIFICATION_SUPPORTS_CHANGE`` and\n  ``ACCOUNT_PHONE_VERIFICATION_SUPPORTS_CHANGE``.\n\n- Added support for Mailcow OAuth2.\n\n\n65.7.0 (2025-04-03)\n*******************\n\nNote worthy changes\n-------------------\n\n- Officially support Django 5.2.\n\n- Headless: the URL to the OpenID configuration of the provider is now exposed\n  in the provider configuration.\n\n\nFixes\n-----\n\n- Headless: when multiple login methods were enabled (e.g. both username and\n  email), the login endpoint would incorrectly return a 400\n  ``invalid_login``. Fixed.\n\n\n65.6.0 (2025-03-27)\n*******************\n\nNote worthy changes\n-------------------\n\n- MFA: Added support for \"Trust this browser?\" functionality, which presents users with MFA\n  enabled the choice to trust their browser allowing them to skip authenticating\n  per MFA on each login.\n\n\nFixes\n-----\n\n- A check is in place to verify that ``ACCOUNT_LOGIN_METHODS`` is aligned with\n  ``ACCOUNT_SIGNUP_FIELDS``.  The severity level of that check has now been\n  lowered from \"critical\" to \"warning\", as there may be valid use cases for\n  configuring a login method that you are not able to sign up with. This check\n  (``account.W001``) can be silenced using Django's ``SILENCED_SYSTEM_CHECKS``.\n\n- The setting ``ACCOUNT_LOGIN_ON_PASSWORD_RESET = True`` was not respected when using\n  password reset by code.\n\n\n65.5.0 (2025-03-14)\n*******************\n\nNote worthy changes\n-------------------\n\n- Added support for phone (SMS) authentication.\n\n- Added support for resetting passwords by code, instead of a link\n  (``ACCOUNT_PASSWORD_RESET_BY_CODE_ENABLED``).\n\n- Added support for Tumblr OAuth2.\n\n- Simplified signup form configuration. The following settings all controlled\n  signup form: ``ACCOUNT_EMAIL_REQUIRED``, ``ACCOUNT_USERNAME_REQUIRED``,\n  ``ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE``, ``ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE``.\n  This setup had its issues. For example, when email was not required it was\n  still available as an optional field, whereas the username field disappeared\n  when not required. Also, for phone/SMS support, additional settings\n  would have been required.  The settings are now all deprecated, and replaced by one\n  new setting: ``ACCOUNT_SIGNUP_FIELDS``, which can be configured to\n  e.g. ``['username*', 'email', 'password1*', 'password2*']`` to indicate which\n  fields are present and required (``'*'``). This change is performed in a\n  backwards compatible manner.\n\n- Headless: if, while signing up using a third-party provider account, there is\n  insufficient information received from the provider to automatically complete\n  the signup process, an additional step is needed to complete the missing data\n  before the user is fully signed up and authenticated.  You can now perform a\n  ``GET`` request to ``/_allauth/{client}/v1/auth/provider/signup`` to obtain\n  information on the pending signup.\n\n- Headless: OpenID Connect providers now support token authentication.\n\n- The \"Forgot your password?\" help text can now be more easily customized by\n  providing your own ``\"account/password_reset_help_text.html\"`` template.\n\n- Removed inline scripts, so that it becomes possible to use a strong Content\n  Security Policy.\n\n- Headless: The OpenAPI specification now dynamically reflects the\n  ``ACCOUNT_SIGNUP_FIELDS`` configuration, as well as any custom fields you have\n  in ``ACCOUNT_SIGNUP_FORM_CLASS``.\n\n- Added official support for Python 3.13.\n\n\nFixes\n-----\n\n- Headless: In case you had multiple apps of the same provider configured,\n  you could run into a ``MultipleObjectsReturned``. Fixed.\n\n\n65.4.1 (2025-02-07)\n*******************\n\nFixes\n-----\n\n- To make way for a future ``\"phone\"`` method, ``AUTHENTICATION_METHOD`` was\n  removed in favor of a new ``LOGIN_METHODS``. While this change was done in a\n  backwards compatible manner within allauth scope, other packages accessing\n  ``allauth.account.app_settings.AUTHENTICATION_METHOD`` would break. Fixed.\n\n\n65.4.0 (2025-02-06)\n*******************\n\nNote worthy changes\n-------------------\n\n- The setting ``ACCOUNT_AUTHENTICATION_METHOD: str`` (with values\n  ``\"username\"``, ``\"username_email\"``, ``\"email\"``) has been replaced by\n  ``ACCOUNT_LOGIN_METHODS: set[str]``. which is a set of values including\n  ``\"username\"`` or ``\"email\"``. This change is performed in a backwards\n  compatible manner.\n\n- Headless: when ``HEADLESS_SERVE_SPECIFICATION`` is set to ``True``, the API\n  specification will be served dynamically, over at\n  ``/_allauth/openapi.(yaml|json|html)``.  The\n  ``HEADLESS_SPECIFICATION_TEMPLATE_NAME`` can be configured to choose between\n  Redoc (``\"headless/spec/redoc_cdn.html\"``) and Swagger (\n  (``\"headless/spec/swagger_cdn.html\"``).\n\n- Headless: added a new setting, ``HEADLESS_CLIENTS`` which you can use to limit\n  the types of API clients (app/browser).\n\n- Headless: expanded the React SPA example to showcase integration with\n  Django Ninja as well as Django REST framework.\n\n- Headless: added out of the box support for being able to use the headless\n  session tokens with Django Ninja and Django REST framework.\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2010-2026 Raymond Penners and contributors\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Makefile",
    "content": "PYTHON = python\n\n.PHONY: usage\nusage:\n\t@echo 'Usage: make [target]'\n\n.PHONY: po\npo:\n\t( cd allauth ; $(PYTHON) ../manage.py makemessages -a -e html,txt,py )\n\n.PHONY: mo\nmo:\n\t( cd allauth ; $(PYTHON) ../manage.py compilemessages )\n\n.PHONY: isort\nisort:\n\tisort --check-only --diff allauth/ tests/\n\n.PHONY: bandit\nbandit:\n\tbandit -q -c pyproject.toml -r allauth/\n\n.PHONY: black\nblack:\n\tblack --check -q .\n\n.PHONY: test\ntest:\n\tpytest allauth/\n\n\n.PHONY: djlint\ndjlint:\n\tdjlint --quiet --check allauth examples\n\n.PHONY: flake8\nflake8:\n\tflake8 allauth\n\n.PHONY: qa\nqa: validate-api-spec mypy djlint bandit black isort flake8\n\n.PHONY: mypy\nmypy:\n\tmypy allauth/\n\n.PHONY: validate-api-spec\nvalidate-api-spec:\n\t@if command -v swagger-cli >/dev/null 2>&1; then\t\t\t\\\n\t\tswagger-cli validate allauth/headless/spec/doc/openapi.yaml;\t\\\n\telse\t\t\t\t\t\t\t\t\t\\\n\t\techo \"WARNING: swagger-cli not found in PATH.\";\t\t\t\\\n\tfi\n\n.PHONY: ci\nci:\n\twoodpecker-cli exec .woodpecker.yaml\n\n\n.PHONY: standardjs\nstandardjs:\n\tfind ./allauth -name '*.js' | xargs ./node_modules/.bin/standard --ignore allauth/mfa/static/mfa/js/webauthn-json.js\n\n\n.PHONY: docs\ndocs:\n\t$(MAKE) -C docs html\n\n.PHONY: ci-install-standardjs\nci-install-standardjs:\n\tnpm install standard --no-lockfile --no-progress --non-interactive --silent\n\n.PHONY: clean\nclean:\n\t-rm -rf build/ django_allauth.egg-info/\n\n.PHONY: dist\ndist: clean mo\n\tpython -m build --sdist\n\tpython -m build --wheel\n"
  },
  {
    "path": "README.rst",
    "content": "\n==========================\nWelcome to django-allauth!\n==========================\n\n.. image:: https://codeberg.org/allauth/allauth.org/raw/commit/da3b56390e1b18eaec09b05cd89dfa7812212dfc/content/news/2024/04/website-redesign/logo-light.png\n   :target: https://allauth.org\n   :align: right\n   :alt: django-allauth logo\n   :width: 250px\n\n\n.. |ci| image:: https://img.shields.io/github/actions/workflow/status/pennersr/django-allauth/ci.yml.svg\n   :target: https://github.com/pennersr/django-allauth/actions\n.. |pypi| image:: https://img.shields.io/pypi/v/django-allauth\n   :target: https://pypi.python.org/pypi/django-allauth\n.. |cov| image:: https://img.shields.io/coverallsCoverage/github/pennersr/django-allauth\n   :alt: Coverage Status\n   :target: https://coveralls.io/r/pennersr/django-allauth\n.. |btc| image:: https://img.shields.io/badge/bitcoin-donate-yellow\n   :target: https://blockchain.info/address/1AJXuBMPHkaDCNX2rwAy34bGgs7hmrePEr\n.. |liberapay| image:: https://img.shields.io/liberapay/receives/pennersr\n   :target: https://en.liberapay.com/pennersr\n.. |pystyle| image:: https://img.shields.io/badge/code_style-pep8-green\n   :target: https://www.python.org/dev/peps/pep-0008/\n.. |jsstyle| image:: https://img.shields.io/badge/code_style-standard-brightgreen\n   :target: http://standardjs.com\n.. |editor| image:: https://img.shields.io/badge/editor-emacs-purple\n   :target: https://www.gnu.org/software/emacs/\n.. |i18n| image:: https://img.shields.io/weblate/progress/allauth\n   :target: https://hosted.weblate.org/projects/allauth/django-allauth/\n.. |pypidl| image:: https://img.shields.io/pypi/dm/django-allauth\n   :target: https://pypistats.org/packages/django-allauth\n   :alt: PyPI - Downloads\n.. |djangodemo| image:: https://img.shields.io/badge/%E2%96%B6_demo-Django_project-red\n   :target: https://django.demo.allauth.org/\n   :alt: View Django Demo\n.. |reactdemo| image:: https://img.shields.io/badge/%E2%96%B6_demo-React_SPA-red\n   :target: https://react.demo.allauth.org/\n   :alt: View React SPA Demo\n\n|ci| |pypi| |cov| |btc| |liberapay| |pystyle| |jsstyle| |editor| |i18n| |pypidl| |djangodemo| |reactdemo|\n\n\nIntegrated set of Django applications addressing authentication,\nregistration, account management as well as 3rd party (social) account\nauthentication.\n\nHome page\n  https://allauth.org/\n\nSource code\n  https://codeberg.org/allauth/django-allauth\n\nIssue Tracker\n  https://codeberg.org/allauth/django-allauth/issues\n\nDocumentation\n  https://docs.allauth.org/en/latest/\n\nStack Overflow\n  https://stackoverflow.com/questions/tagged/django-allauth\n\nDemo\n  https://django.demo.allauth.org and https://react.demo.allauth.org\n\nTranslations\n  https://hosted.weblate.org/projects/allauth/django-allauth/\n\n.. end-welcome\n\nRationale\n=========\n\n.. begin-rationale\n\nMost existing Django apps that address the problem of social\nauthentication unfortunately focus only on one dimension - the social.\nMost developers end up integrating another app in order to support authentication\nflows that are locally generated.\n\nThis approach creates a development gap between local and social\nauthentication flows. It has remained an issue in spite of numerous common\nscenarios that both require. For example, an email address passed along by an\nOpenID provider may not be verified. Therefore, prior to hooking up\nan OpenID account to a local account the email address must be\nverified. This essentially is one of many use cases that mandate email\nverification to be present in both worlds.\n\nIntegrating both is a humongous and tedious process. It is not as\nsimple as adding one social authentication app, and one\nlocal account registration app to your ``INSTALLED_APPS`` list.\n\nThis inadequacy is the reason for this project's existence  -- to offer a fully\nintegrated authentication app that allows for both local and social\nauthentication, with flows that just work, beautifully!\n\n.. end-rationale\n\n\nFeatures\n========\n\n.. begin-features\n\n**🔑 Comprehensive account functionality**\n    Supports multiple authentication\n    schemes (e.g. login by user name, or by email), as well as multiple\n    strategies for account verification (ranging from none to mandatory email\n    verification).\n\n**👥 Social Login**\n    Login using external identity providers, supporting any *Open ID Connect\n    compatible* provider, many *OAuth 1.0/2.0* providers, as well as\n    custom protocols such as, for example, *Telegram* authentication.\n\n**💼 Enterprise ready**\n    Supports SAML 2.0, which is often used in a B2B context.\n\n**🕵️ Battle-tested**\n    The package has been out in the open since 2010. It is in use by many\n    commercial companies whose business depends on it and has hence been\n    subjected to various penetration testing attempts.\n\n**⏳Rate limiting**\n    When you expose an authentication-enabled web service to\n    the internet, it is important to be prepared for potential brute force\n    attempts. Therefore, rate limiting is enabled out of the box.\n\n**🔒 Private**\n    Many sites leak information. For example, on many sites you can\n    check whether someone you know has an account by input their email address\n    into the password forgotten form, or trying to signup with it. We offer\n    account enumeration prevention, making it impossible to tell whether or not\n    somebody already has an account.\n\n**🧩 Customizable**\n    As a developer, you have the flexibility to customize the core functionality\n    according to your specific requirements. By employing the adapter pattern, you\n    can effortlessly introduce interventions at the desired points to deviate from\n    the standard behavior. This level of customization empowers you to tailor the\n    software to meet your unique needs and preferences.\n\n**⚙️ Configuration**\n    The required consumer keys and secrets for interacting with Facebook,\n    X (Twitter) and the likes can be configured using regular settings, or, can be\n    configured in the database via the Django admin. Here, optional support for\n    the Django sites framework is available, which is helpful for larger\n    multi-domain projects, but also allows for easy switching between a\n    development (localhost) and production setup without messing with your\n    settings and database.\n\n\n.. end-features\n\n\nCommercial Support\n==================\n\n.. begin-support\n\nCommercial support is available. If you find certain functionality missing, or\nrequire assistance on your project(s), please contact us: info@intenct.nl.\n\n.. end-support\n"
  },
  {
    "path": "allauth/__init__.py",
    "content": "r\"\"\"\n    _        ___      __    __  .___________. __    __\n /\\| |/\\    /   \\    |  |  |  | |           ||  |  |  |\n \\ ` ' /   /  ^  \\   |  |  |  | `---|  |----`|  |__|  |\n|_     _| /  /_\\  \\  |  |  |  |     |  |     |   __   |\n / , . \\ /  _____  \\ |  `--'  |     |  |     |  |  |  |\n \\/|_|\\//__/     \\__\\ \\______/      |__|     |__|  |__|\n\n\"\"\"\n\nVERSION = (65, 15, 0, \"final\", 0)\n\n__title__ = \"django-allauth\"\n__version_info__ = VERSION\n__version__ = \".\".join(map(str, VERSION[:3])) + (\n    f\"-{VERSION[3]}{VERSION[4] or ''}\" if VERSION[3] != \"final\" else \"\"\n)\n__author__ = \"Raymond Penners\"\n__license__ = \"MIT\"\n__copyright__ = \"Copyright 2010-2026 Raymond Penners and contributors\"\n"
  },
  {
    "path": "allauth/account/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/account/adapter.py",
    "content": "import html\nimport inspect\nimport json\nimport warnings\nfrom http import HTTPStatus\nfrom urllib.parse import urlparse\n\nfrom django.conf import settings\nfrom django.contrib import messages\nfrom django.contrib.auth import (\n    authenticate,\n    get_backends,\n    get_user_model,\n    login as django_login,\n    logout as django_logout,\n)\nfrom django.contrib.auth.models import AbstractUser\nfrom django.contrib.auth.password_validation import (\n    MinimumLengthValidator,\n    validate_password,\n)\nfrom django.contrib.sites.shortcuts import get_current_site\nfrom django.core.exceptions import FieldDoesNotExist, PermissionDenied\nfrom django.core.mail import EmailMessage, EmailMultiAlternatives\nfrom django.http import HttpRequest, HttpResponse, HttpResponseRedirect\nfrom django.http.request import validate_host\nfrom django.shortcuts import resolve_url\nfrom django.template import TemplateDoesNotExist\nfrom django.template.loader import render_to_string\nfrom django.urls import reverse\nfrom django.utils import timezone\nfrom django.utils.crypto import get_random_string\nfrom django.utils.encoding import force_str\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.account import app_settings, signals\nfrom allauth.core import context\nfrom allauth.core.internal import ratelimit\nfrom allauth.core.internal.adapter import BaseAdapter\nfrom allauth.core.internal.cryptokit import generate_user_code\nfrom allauth.core.internal.httpkit import (\n    HTTP_USER_AGENT_MAX_LENGTH,\n    get_client_ip,\n    headed_redirect_response,\n    is_headless_request,\n)\nfrom allauth.utils import generate_unique_username, import_attribute\n\n\nclass DefaultAccountAdapter(BaseAdapter):\n    \"\"\"The adapter class allows you to override various functionality of the\n    ``allauth.account`` app.  To do so, point ``settings.ACCOUNT_ADAPTER`` to\n    your own class that derives from ``DefaultAccountAdapter`` and override the\n    behavior by altering the implementation of the methods according to your own\n    needs.\n    \"\"\"\n\n    error_messages = {\n        \"account_inactive\": _(\"This account is currently inactive.\"),\n        \"cannot_remove_primary_email\": _(\n            \"You cannot remove your primary email address.\"\n        ),\n        \"duplicate_email\": _(\n            \"This email address is already associated with this account.\"\n        ),\n        \"email_password_mismatch\": _(\n            \"The email address and/or password you specified are not correct.\"\n        ),\n        \"phone_password_mismatch\": _(\n            \"The phone number and/or password you specified are not correct.\"\n        ),\n        \"email_taken\": _(\"A user is already registered with this email address.\"),\n        \"enter_current_password\": _(\"Please type your current password.\"),\n        \"incorrect_code\": _(\"Incorrect code.\"),\n        \"incorrect_password\": _(\"Incorrect password.\"),\n        \"invalid_or_expired_key\": _(\"Invalid or expired key.\"),\n        \"invalid_login\": _(\"Invalid login.\"),\n        \"invalid_password_reset\": _(\"The password reset token was invalid.\"),\n        \"max_email_addresses\": _(\"You cannot add more than %d email addresses.\"),\n        \"phone_taken\": _(\"A user is already registered with this phone number.\"),\n        \"too_many_login_attempts\": _(\n            \"Too many failed login attempts. Try again later.\"\n        ),\n        \"unknown_email\": _(\"The email address is not assigned to any user account.\"),\n        \"unknown_phone\": _(\"The phone number is not assigned to any user account.\"),\n        \"unverified_primary_email\": _(\"Your primary email address must be verified.\"),\n        \"username_blacklisted\": _(\n            \"Username can not be used. Please use other username.\"\n        ),\n        \"username_password_mismatch\": _(\n            \"The username and/or password you specified are not correct.\"\n        ),\n        \"username_taken\": AbstractUser._meta.get_field(\"username\").error_messages[\n            \"unique\"\n        ],\n        \"select_only_one\": _(\"Please select only one.\"),\n        \"same_as_current\": _(\"The new value must be different from the current one.\"),\n        \"rate_limited\": _(\"Be patient, you are sending too many requests.\"),\n    }\n\n    def stash_verified_email(self, request, email):\n        request.session[\"account_verified_email\"] = email\n\n    def unstash_verified_email(self, request):\n        ret = request.session.get(\"account_verified_email\")\n        request.session[\"account_verified_email\"] = None\n        return ret\n\n    def is_email_verified(self, request, email):\n        \"\"\"\n        Checks whether or not the email address is already verified\n        beyond allauth scope, for example, by having accepted an\n        invitation before signing up.\n        \"\"\"\n        ret = False\n        verified_email = request.session.get(\"account_verified_email\")\n        if verified_email:\n            ret = verified_email.lower() == email.lower()\n        return ret\n\n    def can_delete_email(self, email_address) -> bool:\n        \"\"\"\n        Returns whether or not the given email address can be deleted.\n        \"\"\"\n        from allauth.account.models import EmailAddress\n\n        if not email_address.pk:\n            return True\n        has_other = (\n            EmailAddress.objects.filter(user_id=email_address.user_id)\n            .exclude(pk=email_address.pk)\n            .exists()\n        )\n        login_by_email = app_settings.LOGIN_METHODS == {app_settings.LoginMethod.EMAIL}\n        if email_address.primary:\n            if has_other:\n                # Don't allow, let the user mark one of the others as primary\n                # first.\n                return False\n            elif login_by_email:\n                # Last email & login is by email, prevent dangling account.\n                return False\n            return True\n        elif has_other:\n            # Account won't be dangling.\n            return True\n        elif login_by_email:\n            # This is the last email.\n            return False\n        else:\n            return True\n\n    def format_email_subject(self, subject) -> str:\n        \"\"\"\n        Formats the given email subject.\n        \"\"\"\n        prefix = app_settings.EMAIL_SUBJECT_PREFIX\n        if prefix is None:\n            site = get_current_site(context.request)\n            prefix = f\"[{site.name}] \"\n        return prefix + force_str(subject)\n\n    def get_from_email(self):\n        \"\"\"\n        This is a hook that can be overridden to programmatically\n        set the 'from' email address for sending emails\n        \"\"\"\n        return settings.DEFAULT_FROM_EMAIL\n\n    def render_mail(self, template_prefix, email, context, headers=None):\n        \"\"\"\n        Renders an email to `email`.  `template_prefix` identifies the\n        email that is to be sent, e.g. \"account/email/email_confirmation\"\n        \"\"\"\n        to = [email] if isinstance(email, str) else email\n        subject = render_to_string(f\"{template_prefix}_subject.txt\", context)\n        # remove superfluous line breaks\n        subject = \" \".join(subject.splitlines()).strip()\n        subject = self.format_email_subject(subject)\n\n        from_email = self.get_from_email()\n\n        bodies = {}\n        html_ext = app_settings.TEMPLATE_EXTENSION\n        for ext in [html_ext, \"txt\"]:\n            try:\n                template_name = f\"{template_prefix}_message.{ext}\"\n                bodies[ext] = render_to_string(\n                    template_name,\n                    context,\n                    globals()[\"context\"].request,\n                ).strip()\n            except TemplateDoesNotExist:\n                if ext == \"txt\" and not bodies:\n                    # We need at least one body\n                    raise\n        if \"txt\" in bodies:\n            msg = EmailMultiAlternatives(\n                subject, bodies[\"txt\"], from_email, to, headers=headers\n            )\n            if html_ext in bodies:\n                msg.attach_alternative(bodies[html_ext], \"text/html\")\n        else:\n            msg = EmailMessage(\n                subject, bodies[html_ext], from_email, to, headers=headers\n            )\n            msg.content_subtype = \"html\"  # Main content is now text/html\n        return msg\n\n    def send_mail(self, template_prefix: str, email: str, context: dict) -> None:\n        request = globals()[\"context\"].request\n        ctx = {\n            \"request\": request,\n            \"email\": email,\n            \"current_site\": get_current_site(request),\n        }\n        ctx.update(context)\n        msg = self.render_mail(template_prefix, email, ctx)\n        msg.send()\n\n    def get_signup_redirect_url(self, request):\n        \"\"\"\n        Returns the default URL to redirect to directly after signing up.\n        \"\"\"\n        return resolve_url(app_settings.SIGNUP_REDIRECT_URL)\n\n    def get_login_redirect_url(self, request):\n        \"\"\"\n        Returns the default URL to redirect to after logging in.  Note\n        that URLs passed explicitly (e.g. by passing along a `next`\n        GET parameter) take precedence over the value returned here.\n        \"\"\"\n        assert request.user.is_authenticated  # nosec\n        url = getattr(settings, \"LOGIN_REDIRECT_URLNAME\", None)\n        if url:\n            warnings.warn(\n                \"LOGIN_REDIRECT_URLNAME is deprecated, simply\"\n                \" use LOGIN_REDIRECT_URL with a URL name\",\n                DeprecationWarning,\n            )\n        else:\n            url = settings.LOGIN_REDIRECT_URL\n        return resolve_url(url)\n\n    def get_logout_redirect_url(self, request):\n        \"\"\"\n        Returns the URL to redirect to after the user logs out. Note that\n        this method is also invoked if you attempt to log out while no users\n        is logged in. Therefore, request.user is not guaranteed to be an\n        authenticated user.\n        \"\"\"\n        return resolve_url(app_settings.LOGOUT_REDIRECT_URL)\n\n    def get_email_verification_redirect_url(self, email_address):\n        \"\"\"\n        The URL to return to after email verification.\n        \"\"\"\n        get_url = getattr(self, \"get_email_confirmation_redirect_url\", None)\n        if get_url:\n            # Deprecated.\n            return get_url(self.request)\n\n        if self.request.user.is_authenticated:\n            if app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL:\n                return app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL\n            else:\n                return self.get_login_redirect_url(self.request)\n        else:\n            return app_settings.EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL\n\n    def get_password_change_redirect_url(self, request):\n        \"\"\"\n        The URL to redirect to after a successful password change/set.\n\n        NOTE: Not called during the password reset flow.\n        \"\"\"\n        return reverse(\"account_change_password\")\n\n    def is_open_for_signup(self, request):\n        \"\"\"\n        Checks whether or not the site is open for signups.\n\n        Next to simply returning True/False you can also intervene the\n        regular flow by raising an ImmediateHttpResponse\n        \"\"\"\n        return True\n\n    def new_user(self, request):\n        \"\"\"\n        Instantiates a new User instance.\n        \"\"\"\n        user = get_user_model()()\n        return user\n\n    def populate_username(self, request, user):\n        \"\"\"\n        Fills in a valid username, if required and missing.  If the\n        username is already present it is assumed to be valid\n        (unique).\n        \"\"\"\n        from .utils import user_email, user_field, user_username\n\n        first_name = user_field(user, \"first_name\")\n        last_name = user_field(user, \"last_name\")\n        email = user_email(user)\n        username = user_username(user)\n        if app_settings.USER_MODEL_USERNAME_FIELD:\n            user_username(\n                user,\n                username\n                or self.generate_unique_username(\n                    [first_name, last_name, email, username, \"user\"]\n                ),\n            )\n\n    def generate_unique_username(self, txts, regex=None):\n        return generate_unique_username(txts, regex)\n\n    def save_user(self, request, user, form, commit=True):\n        \"\"\"\n        Saves a new `User` instance using information provided in the\n        signup form.\n        \"\"\"\n        from .utils import user_email, user_field, user_username\n\n        data = form.cleaned_data\n        first_name = data.get(\"first_name\")\n        last_name = data.get(\"last_name\")\n        email = data.get(\"email\")\n        username = data.get(\"username\")\n        user_email(user, email)\n        user_username(user, username)\n        if first_name:\n            user_field(user, \"first_name\", first_name)\n        if last_name:\n            user_field(user, \"last_name\", last_name)\n\n        if \"password1\" in data:\n            password = data[\"password1\"]\n        elif \"password\" in data:\n            password = data[\"password\"]\n        else:\n            password = None\n        if password:\n            user.set_password(password)\n        else:\n            user.set_unusable_password()\n\n        self.populate_username(request, user)\n        if commit:\n            user.save()\n        if getattr(form, \"_has_phone_field\", False):\n            phone = form.cleaned_data.get(\"phone\")\n            if phone:\n                self.set_phone(user, phone, False)\n        return user\n\n    def clean_username(self, username, shallow=False):\n        \"\"\"\n        Validates the username. You can hook into this if you want to\n        (dynamically) restrict what usernames can be chosen.\n        \"\"\"\n        for validator in app_settings.USERNAME_VALIDATORS:\n            validator(username)\n\n        # TODO: Add regexp support to USERNAME_BLACKLIST\n        username_blacklist_lower = [\n            ub.lower() for ub in app_settings.USERNAME_BLACKLIST\n        ]\n        if username.lower() in username_blacklist_lower:\n            raise self.validation_error(\"username_blacklisted\")\n        # Skipping database lookups when shallow is True, needed for unique\n        # username generation.\n        if not shallow:\n            from .utils import filter_users_by_username\n\n            if filter_users_by_username(username).exists():\n                raise self.validation_error(\"username_taken\")\n        return username\n\n    def clean_email(self, email: str) -> str:\n        \"\"\"\n        Validates an email value. You can hook into this if you want to\n        (dynamically) restrict what email addresses can be chosen.\n        \"\"\"\n        return email\n\n    def clean_password(self, password, user=None):\n        \"\"\"\n        Validates a password. You can hook into this if you want to\n        restric the allowed password choices.\n        \"\"\"\n        min_length = app_settings.PASSWORD_MIN_LENGTH\n        if min_length:\n            MinimumLengthValidator(min_length).validate(password)\n        validate_password(password, user)\n        return password\n\n    def clean_phone(self, phone: str) -> str:\n        \"\"\"\n        Validates a phone number. You can hook into this if you want to\n        (dynamically) restrict what phone numbers can be chosen.\n        \"\"\"\n        return phone\n\n    def validate_unique_email(self, email):\n        return email\n\n    def add_message(\n        self,\n        request,\n        level,\n        message_template=None,\n        message_context=None,\n        extra_tags=\"\",\n        message=None,\n    ):\n        \"\"\"\n        Wrapper of `django.contrib.messages.add_message`, that reads\n        the message text from a template.\n        \"\"\"\n        if is_headless_request(request):\n            return\n        if \"django.contrib.messages\" in settings.INSTALLED_APPS:\n            if message:\n                messages.add_message(request, level, message, extra_tags=extra_tags)\n                return\n            try:\n                if message_context is None:\n                    message_context = {}\n                escaped_message = render_to_string(\n                    message_template,\n                    message_context,\n                    context.request,\n                ).strip()\n                if escaped_message:\n                    message = html.unescape(escaped_message)\n                    messages.add_message(request, level, message, extra_tags=extra_tags)\n            except TemplateDoesNotExist:\n                pass\n\n    def ajax_response(self, request, response, redirect_to=None, form=None, data=None):\n        resp = {}\n        status = response.status_code\n\n        if redirect_to:\n            status = HTTPStatus.OK\n            resp[\"location\"] = redirect_to\n        if form:\n            if request.method == \"POST\":\n                if form.is_valid():\n                    status = HTTPStatus.OK\n                else:\n                    status = HTTPStatus.BAD_REQUEST\n            else:\n                status = HTTPStatus.OK\n            resp[\"form\"] = self.ajax_response_form(form)\n            if hasattr(response, \"render\"):\n                response.render()\n            resp[\"html\"] = response.content.decode(\"utf8\")\n        if data is not None:\n            resp[\"data\"] = data\n        return HttpResponse(\n            json.dumps(resp), status=status, content_type=\"application/json\"\n        )\n\n    def ajax_response_form(self, form):\n        form_spec = {\n            \"fields\": {},\n            \"field_order\": [],\n            \"errors\": form.non_field_errors(),\n        }\n        for field in form:\n            field_spec = {\n                \"label\": force_str(field.label),\n                \"value\": field.value(),\n                \"help_text\": force_str(field.help_text),\n                \"errors\": [force_str(e) for e in field.errors],\n                \"widget\": {\n                    \"attrs\": {\n                        k: force_str(v) for k, v in field.field.widget.attrs.items()\n                    }\n                },\n            }\n            form_spec[\"fields\"][field.html_name] = field_spec\n            form_spec[\"field_order\"].append(field.html_name)\n        return form_spec\n\n    def pre_login(\n        self,\n        request,\n        user,\n        *,\n        email_verification,\n        signal_kwargs,\n        email,\n        signup,\n        redirect_url,\n    ):\n        if not user.is_active:\n            return self.respond_user_inactive(request, user)\n\n    def post_login(\n        self,\n        request,\n        user,\n        *,\n        email_verification,\n        signal_kwargs,\n        email,\n        signup,\n        redirect_url,\n    ):\n        from .utils import get_login_redirect_url\n\n        if is_headless_request(request):\n            from allauth.headless.base.response import AuthenticationResponse\n\n            response = AuthenticationResponse(request)\n        else:\n            response = HttpResponseRedirect(\n                get_login_redirect_url(request, redirect_url, signup=signup)\n            )\n\n        if signal_kwargs is None:\n            signal_kwargs = {}\n        signals.user_logged_in.send(\n            sender=user.__class__,\n            request=request,\n            response=response,\n            user=user,\n            **signal_kwargs,\n        )\n        self.add_message(\n            request,\n            messages.SUCCESS,\n            \"account/messages/logged_in.txt\",\n            {\"user\": user},\n        )\n        return response\n\n    def login(self, request, user):\n        # HACK: This is not nice. The proper Django way is to use an\n        # authentication backend\n        if not hasattr(user, \"backend\"):\n            from .auth_backends import AuthenticationBackend\n\n            backends = get_backends()\n            backend = None\n            for b in backends:\n                if isinstance(b, AuthenticationBackend):\n                    # prefer our own backend\n                    backend = b\n                    break\n                elif not backend and hasattr(b, \"get_user\"):\n                    # Pick the first valid one\n                    backend = b\n            backend_path = f\"{backend.__module__}.{backend.__class__.__name__}\"\n            user.backend = backend_path\n        django_login(request, user)\n\n    def logout(self, request):\n        django_logout(request)\n\n    def confirm_email(self, request, email_address):\n        \"\"\"\n        Marks the email address as confirmed on the db\n        \"\"\"\n        from allauth.account.internal.flows import email_verification\n\n        return email_verification.verify_email(request, email_address)\n\n    def set_password(self, user, password) -> None:\n        \"\"\"\n        Sets the password for the user.\n        \"\"\"\n        user.set_password(password)\n        user.save()\n\n    def get_user_search_fields(self):\n        ret = []\n        User = get_user_model()\n        candidates = [\n            app_settings.USER_MODEL_USERNAME_FIELD,\n            \"first_name\",\n            \"last_name\",\n            \"email\",\n        ]\n        for candidate in candidates:\n            try:\n                User._meta.get_field(candidate)\n                ret.append(candidate)\n            except FieldDoesNotExist:\n                pass\n        return ret\n\n    def is_safe_url(self, url):\n        from django.utils.http import url_has_allowed_host_and_scheme\n\n        # get_host already validates the given host, so no need to check it again\n        allowed_hosts = {context.request.get_host()} | set(settings.ALLOWED_HOSTS)\n\n        # Include hosts derived from CSRF_TRUSTED_ORIGINS\n        trusted_hosts = {\n            urlparse(origin).netloc for origin in settings.CSRF_TRUSTED_ORIGINS\n        }\n        allowed_hosts.update(trusted_hosts)\n\n        # ALLOWED_HOSTS supports wildcards, and subdomains using a '.' prefix.\n        # But, `url_has_allowed_host_and_scheme()` doesn't support that. So,\n        # let's check the domain using the ALLOWED_HOSTS logic, and if valid,\n        # add it as allowed so that we can then call\n        # `url_has_allowed_host_and_scheme()`.\n        parsed_host = urlparse(url).netloc\n        if parsed_host:\n            if validate_host(parsed_host, allowed_hosts):\n                allowed_hosts.add(parsed_host)\n\n        return url_has_allowed_host_and_scheme(url, allowed_hosts=allowed_hosts)\n\n    def send_password_reset_mail(self, user, email, context):\n        \"\"\"\n        Method intended to be overridden in case you need to customize the logic\n        used to determine whether a user is permitted to request a password reset.\n        For example, if you are enforcing something like \"social only\" authentication\n        in your app, you may want to intervene here by checking `user.has_usable_password`\n\n        \"\"\"\n        return self.send_mail(\"account/email/password_reset_key\", email, context)\n\n    def get_reset_password_from_key_url(self, key):\n        \"\"\"\n        Method intended to be overridden in case the password reset email\n        needs to be adjusted.\n        \"\"\"\n        from allauth.account.internal import flows\n\n        return flows.password_reset.get_reset_password_from_key_url(self.request, key)\n\n    def get_email_confirmation_url(self, request, emailconfirmation):\n        \"\"\"Constructs the email confirmation (activation) url.\n\n        Note that if you have architected your system such that email\n        confirmations are sent outside of the request context `request`\n        can be `None` here.\n        \"\"\"\n        from allauth.account.internal import flows\n\n        return flows.email_verification.get_email_verification_url(\n            request, emailconfirmation\n        )\n\n    def should_send_confirmation_mail(self, request, email_address, signup) -> bool:\n        return True\n\n    def send_account_already_exists_mail(self, email: str) -> None:\n        from allauth.account.internal import flows\n\n        signup_url = flows.signup.get_signup_url(context.request)\n        password_reset_url = flows.password_reset.get_reset_password_url(\n            context.request\n        )\n        ctx = {\n            \"signup_url\": signup_url,\n            \"password_reset_url\": password_reset_url,\n        }\n        self.send_mail(\"account/email/account_already_exists\", email, ctx)\n\n    def send_confirmation_mail(self, request, emailconfirmation, signup):\n        ctx = {\n            \"user\": emailconfirmation.email_address.user,\n        }\n        if app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED:\n            ctx.update({\"code\": emailconfirmation.key})\n        else:\n            ctx.update(\n                {\n                    \"key\": emailconfirmation.key,\n                    \"activate_url\": self.get_email_confirmation_url(\n                        request, emailconfirmation\n                    ),\n                }\n            )\n        if signup:\n            email_template = \"account/email/email_confirmation_signup\"\n        else:\n            email_template = \"account/email/email_confirmation\"\n        self.send_mail(email_template, emailconfirmation.email_address.email, ctx)\n\n    def respond_user_inactive(self, request, user):\n        return headed_redirect_response(\"account_inactive\")\n\n    def respond_email_verification_sent(self, request, user):\n        return headed_redirect_response(\"account_email_verification_sent\")\n\n    def _get_login_attempts_cache_key(self, request, **credentials):\n        site = get_current_site(request)\n        login = credentials.get(\"email\", credentials.get(\"username\", \"\")).lower()\n        return f\"{site.domain}:{login}\"\n\n    def _delete_login_attempts_cached_email(self, request, **credentials):\n        cache_key = self._get_login_attempts_cache_key(request, **credentials)\n        # Here, we wipe the login failed rate limit, completely. This is safe,\n        # as we only do this on a succesful password reset, which is rate limited\n        # on itself (e.g. sending of email etc.).\n        ratelimit.clear(\n            request,\n            config=app_settings.RATE_LIMITS,\n            action=\"login_failed\",\n            key=cache_key,\n        )\n\n    def _rollback_login_failed_rl_usage(self) -> None:\n        usage = getattr(self, \"_login_failed_rl_usage\", None)\n        if usage:\n            usage.rollback()\n\n    def pre_authenticate(self, request, **credentials):\n        cache_key = self._get_login_attempts_cache_key(request, **credentials)\n        self._login_failed_rl_usage = ratelimit.consume(\n            request,\n            config=app_settings.RATE_LIMITS,\n            action=\"login_failed\",\n            key=cache_key,\n        )\n        if not self._login_failed_rl_usage:\n            raise self.validation_error(\"too_many_login_attempts\")\n\n    def authenticate(self, request, **credentials):\n        \"\"\"Only authenticates, does not actually login. See `login`\"\"\"\n        from allauth.account.auth_backends import AuthenticationBackend\n\n        self.pre_authenticate(request, **credentials)\n        AuthenticationBackend.unstash_authenticated_user()\n        user = authenticate(request, **credentials)\n        alt_user = AuthenticationBackend.unstash_authenticated_user()\n        user = user or alt_user\n        if user:\n            # On a succesful login, we cannot just wipe the login failed rate\n            # limit. That consists of 2 parts, a per IP limit, and, a per\n            # key(email) limit. Wiping it completely would allow an attacker to\n            # insert periodic successful logins during a brute force\n            # process. So instead, we are rolling back our consumption.\n            self._rollback_login_failed_rl_usage()\n        else:\n            self.authentication_failed(request, **credentials)\n        return user\n\n    def authentication_failed(self, request, **credentials):\n        pass\n\n    def reauthenticate(self, user, password):\n        from allauth.account.models import EmailAddress\n        from allauth.account.utils import user_username\n\n        credentials = {\"password\": password}\n        username = user_username(user)\n        if username:\n            credentials[\"username\"] = username\n        email = EmailAddress.objects.get_primary_email(user)\n        if email:\n            credentials[\"email\"] = email\n        if app_settings.LoginMethod.PHONE in app_settings.LOGIN_METHODS:\n            phone_verified = self.get_phone(user)\n            if phone_verified:\n                credentials[\"phone\"] = phone_verified[0]\n        reauth_user = self.authenticate(context.request, **credentials)\n        return reauth_user is not None and reauth_user.pk == user.pk\n\n    def is_ajax(self, request):\n        return any(\n            [\n                request.META.get(\"HTTP_X_REQUESTED_WITH\") == \"XMLHttpRequest\",\n                request.content_type == \"application/json\",\n                request.META.get(\"HTTP_ACCEPT\") == \"application/json\",\n            ]\n        )\n\n    def get_client_ip(self, request) -> str:\n        \"\"\"\n        Returns the IP address of the client.\n        \"\"\"\n        ip = get_client_ip(request)\n        if not ip:\n            raise PermissionDenied(\"Unable to determine client IP address\")\n        return ip\n\n    def get_http_user_agent(self, request: HttpRequest) -> str:\n        return request.META.get(\"HTTP_USER_AGENT\", \"Unspecified\")\n\n    def generate_emailconfirmation_key(self, email):\n        key = get_random_string(64).lower()\n        return key\n\n    def get_login_stages(self):\n        ret = []\n        ret.append(\"allauth.account.stages.LoginByCodeStage\")\n        ret.append(\"allauth.account.stages.PhoneVerificationStage\")\n        ret.append(\"allauth.account.stages.EmailVerificationStage\")\n        if allauth_settings.MFA_ENABLED:\n            from allauth.mfa import app_settings as mfa_settings\n\n            ret.append(\"allauth.mfa.stages.AuthenticateStage\")\n            if mfa_settings._TRUST_STAGE_ENABLED:\n                ret.append(\"allauth.mfa.stages.TrustStage\")\n\n            if mfa_settings.PASSKEY_SIGNUP_ENABLED:\n                ret.append(\"allauth.mfa.webauthn.stages.PasskeySignupStage\")\n        return ret\n\n    def get_reauthentication_methods(self, user):\n        \"\"\"The order of the methods returned matters. The first method is the\n        default when using the `@reauthentication_required` decorator.\n        \"\"\"\n        from allauth.account.internal.flows.reauthentication import (\n            get_reauthentication_flows,\n        )\n\n        flow_by_id = {f[\"id\"]: f for f in get_reauthentication_flows(user)}\n        ret = []\n        if \"reauthenticate\" in flow_by_id:\n            entry = {\n                \"id\": \"reauthenticate\",\n                \"description\": _(\"Use your password\"),\n                \"url\": reverse(\"account_reauthenticate\"),\n            }\n            ret.append(entry)\n        if \"mfa_reauthenticate\" in flow_by_id:\n            types = flow_by_id[\"mfa_reauthenticate\"][\"types\"]\n            if \"recovery_codes\" in types or \"totp\" in types:\n                entry = {\n                    \"id\": \"mfa_reauthenticate\",\n                    \"description\": _(\"Use authenticator app or code\"),\n                    \"url\": reverse(\"mfa_reauthenticate\"),\n                }\n                ret.append(entry)\n            if \"webauthn\" in types:\n                entry = {\n                    \"id\": \"mfa_reauthenticate:webauthn\",\n                    \"description\": _(\"Use a security key\"),\n                    \"url\": reverse(\"mfa_reauthenticate_webauthn\"),\n                }\n                ret.append(entry)\n        return ret\n\n    def send_notification_mail(self, template_prefix, user, context=None, email=None):\n        from allauth.account.models import EmailAddress\n\n        if not app_settings.EMAIL_NOTIFICATIONS:\n            return\n        if not email:\n            email = EmailAddress.objects.get_primary_email(user)\n        if not email:\n            return\n        ctx = {\n            \"timestamp\": timezone.now(),\n            \"ip\": self.get_client_ip(self.request),\n            \"user_agent\": self.get_http_user_agent(self.request)[\n                :HTTP_USER_AGENT_MAX_LENGTH\n            ],\n        }\n        if context:\n            ctx.update(context)\n        self.send_mail(template_prefix, email, ctx)\n\n    def generate_login_code(self) -> str:\n        \"\"\"\n        Generates a new login code.\n        \"\"\"\n        return generate_user_code(**app_settings.LOGIN_BY_CODE_FORMAT)\n\n    def generate_password_reset_code(self) -> str:\n        \"\"\"\n        Generates a new password reset code.\n        \"\"\"\n        return generate_user_code(**app_settings.PASSWORD_RESET_BY_CODE_FORMAT)\n\n    def generate_email_verification_code(self) -> str:\n        \"\"\"\n        Generates a new email verification code.\n        \"\"\"\n        return generate_user_code(**app_settings.EMAIL_VERIFICATION_BY_CODE_FORMAT)\n\n    def generate_phone_verification_code(self, *, user, phone: str) -> str:\n        \"\"\"\n        Generates a new phone verification code.\n        \"\"\"\n        return generate_user_code(**app_settings.PHONE_VERIFICATION_CODE_FORMAT)\n\n    def _generate_phone_verification_code_compat(self, *, user, phone: str) -> str:\n        sig = inspect.signature(self.generate_phone_verification_code)\n        if len(sig.parameters) == 0:\n            warnings.warn(\n                \"generate_phone_verification_code(self) is deprecated, use generate_phone_verification_code(self, *, user, phone)\",\n                DeprecationWarning,\n            )\n            return self.generate_phone_verification_code()  # type: ignore[call-arg]\n\n        return self.generate_phone_verification_code(user=user, phone=phone)\n\n    def is_login_by_code_required(self, login) -> bool:\n        \"\"\"\n        Returns whether or not login-by-code is required for the given\n        login.\n        \"\"\"\n        from allauth.account import authentication\n\n        method = None\n        records = authentication.get_authentication_records(self.request)\n        if records:\n            method = records[-1][\"method\"]\n        if method == \"code\":\n            return False\n        value = app_settings.LOGIN_BY_CODE_REQUIRED\n        if isinstance(value, bool):\n            return value\n        if not value:\n            return False\n        return method is None or method in value\n\n    def phone_form_field(self, **kwargs):\n        \"\"\"\n        Returns a form field used to input phone numbers.\n        \"\"\"\n        from allauth.account.fields import PhoneField\n\n        return PhoneField(**kwargs)\n\n    def send_unknown_account_sms(self, phone: str, **kwargs) -> None:\n        \"\"\"\n        In case enumeration prevention is enabled, and, a verification code\n        is requested for an unlisted phone number, this method is invoked to\n        send a text explaining that no account is on file.\n        \"\"\"\n        pass\n\n    def send_account_already_exists_sms(self, phone: str) -> None:\n        pass\n\n    def send_verification_code_sms(self, user, phone: str, code: str, **kwargs):\n        \"\"\"\n        Sends a verification code.\n        \"\"\"\n        raise NotImplementedError\n\n    @property\n    def _has_phone_impl(self) -> bool:\n        \"\"\"\n        Checks whether the phone number adapter is fully implemented.\n        \"\"\"\n        methods = (\n            \"send_verification_code_sms\",\n            \"set_phone\",\n            \"get_phone\",\n            \"set_phone_verified\",\n            \"get_user_by_phone\",\n        )\n        return all(\n            getattr(self.__class__, method) != getattr(DefaultAccountAdapter, method)\n            for method in methods\n        )\n\n    def set_phone(self, user, phone: str, verified: bool):\n        \"\"\"\n        Sets the phone number (and verified status) for the given user.\n        \"\"\"\n        raise NotImplementedError\n\n    def get_phone(self, user) -> tuple[str, bool] | None:\n        \"\"\"\n        Returns the phone number stored for the given user. A tuple of the\n        phone number itself, and whether or not the phone number was verified is\n        returned.\n        \"\"\"\n        raise NotImplementedError\n\n    def set_phone_verified(self, user, phone: str):\n        \"\"\"\n        Marks the specified phone number for the given user as\n        verified. Note that the user is already expected to have\n        the phone number attached to the account.\n        \"\"\"\n        raise NotImplementedError\n\n    def get_user_by_phone(self, phone: str):\n        \"\"\"\n        Looks up a user given the specified phone number. Returns ``None`` if no user\n        was found.\n        \"\"\"\n        raise NotImplementedError\n\n\ndef get_adapter(request=None) -> DefaultAccountAdapter:\n    return import_attribute(app_settings.ADAPTER)(request)\n"
  },
  {
    "path": "allauth/account/admin.py",
    "content": "from django.contrib import admin, messages\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth.account import app_settings, signals\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.models import EmailAddress, EmailConfirmation\n\n\nclass EmailAddressAdmin(admin.ModelAdmin):\n    list_display = (\"email\", \"user\", \"primary\", \"verified\")\n    list_filter = (\"primary\", \"verified\")\n    search_fields = []\n    raw_id_fields = (\"user\",)\n    actions = [\"make_verified\"]\n\n    def get_search_fields(self, request):\n        base_fields = get_adapter().get_user_search_fields()\n        return [\"email\"] + list(map(lambda a: f\"user__{a}\", base_fields))\n\n    def make_verified(self, request, queryset):\n        for email_address in queryset.filter(verified=False).iterator():\n            if email_address.set_verified():\n                signals.email_confirmed.send(\n                    sender=EmailAddress,\n                    request=request,\n                    email_address=email_address,\n                )\n                self.message_user(\n                    request,\n                    _(\"Marked {email} as verified.\").format(email=email_address.email),\n                    level=messages.SUCCESS,\n                )\n            else:\n                self.message_user(\n                    request,\n                    _(\"Failed to mark {email} as verified.\").format(\n                        email=email_address.email\n                    ),\n                    level=messages.ERROR,\n                )\n\n    make_verified.short_description = _(\"Mark selected email addresses as verified\")  # type: ignore[attr-defined]\n\n\nclass EmailConfirmationAdmin(admin.ModelAdmin):\n    list_display = (\"email_address\", \"created\", \"sent\", \"key\")\n    list_filter = (\"sent\",)\n    raw_id_fields = (\"email_address\",)\n\n\nif not app_settings.EMAIL_CONFIRMATION_HMAC:\n    admin.site.register(EmailConfirmation, EmailConfirmationAdmin)\nadmin.site.register(EmailAddress, EmailAddressAdmin)\n"
  },
  {
    "path": "allauth/account/app_settings.py",
    "content": "import warnings\nfrom enum import Enum\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.core.internal.cryptokit import UserCodeFormat\n\n\nclass AppSettings:\n    class AuthenticationMethod(str, Enum):\n        USERNAME = \"username\"\n        EMAIL = \"email\"\n        USERNAME_EMAIL = \"username_email\"\n\n    class LoginMethod(str, Enum):\n        USERNAME = \"username\"\n        EMAIL = \"email\"\n        PHONE = \"phone\"\n\n    class EmailVerificationMethod(str, Enum):\n        # After signing up, keep the user account inactive until the email\n        # address is verified\n        MANDATORY = \"mandatory\"\n        # Allow login with unverified email (email verification is\n        # still sent)\n        OPTIONAL = \"optional\"\n        # Don't send email verification mails during signup\n        NONE = \"none\"\n\n    def __init__(self, prefix):\n        self.prefix = prefix\n\n    def _setting(self, name, dflt):\n        from allauth.utils import get_setting\n\n        return get_setting(self.prefix + name, dflt)\n\n    @property\n    def PREVENT_ENUMERATION(self):\n        return self._setting(\"PREVENT_ENUMERATION\", True)\n\n    @property\n    def DEFAULT_HTTP_PROTOCOL(self):\n        return self._setting(\"DEFAULT_HTTP_PROTOCOL\", \"http\").lower()\n\n    @property\n    def EMAIL_CONFIRMATION_EXPIRE_DAYS(self):\n        \"\"\"\n        Determines the expiration date of email confirmation mails (#\n        of days)\n        \"\"\"\n        from django.conf import settings\n\n        return self._setting(\n            \"EMAIL_CONFIRMATION_EXPIRE_DAYS\",\n            getattr(settings, \"EMAIL_CONFIRMATION_DAYS\", 3),\n        )\n\n    @property\n    def EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL(self):\n        \"\"\"\n        The URL to redirect to after a successful email confirmation, in\n        case of an authenticated user\n        \"\"\"\n        return self._setting(\"EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL\", None)\n\n    @property\n    def EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL(self):\n        \"\"\"\n        The URL to redirect to after a successful email confirmation, in\n        case no user is logged in\n        \"\"\"\n        from django.conf import settings\n\n        return self._setting(\n            \"EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL\", settings.LOGIN_URL\n        )\n\n    @property\n    def EMAIL_REQUIRED(self):\n        \"\"\"\n        The user is required to hand over an email address when signing up\n        \"\"\"\n        warnings.warn(\n            \"app_settings.EMAIL_REQUIRED is deprecated, use: app_settings.SIGNUP_FIELDS['email']['required']\",\n            stacklevel=3,\n        )\n        email = self.SIGNUP_FIELDS.get(\"email\")\n        return email and email[\"required\"]\n\n    @property\n    def EMAIL_VERIFICATION(self):\n        \"\"\"\n        See email verification method\n        \"\"\"\n        ret = self._setting(\"EMAIL_VERIFICATION\", self.EmailVerificationMethod.OPTIONAL)\n        # Deal with legacy (boolean based) setting\n        if ret is True:\n            ret = self.EmailVerificationMethod.MANDATORY\n        elif ret is False:\n            ret = self.EmailVerificationMethod.OPTIONAL\n        return self.EmailVerificationMethod(ret)\n\n    @property\n    def EMAIL_VERIFICATION_BY_CODE_ENABLED(self):\n        return self._setting(\"EMAIL_VERIFICATION_BY_CODE_ENABLED\", False)\n\n    @property\n    def EMAIL_VERIFICATION_BY_CODE_MAX_ATTEMPTS(self):\n        return self._setting(\"EMAIL_VERIFICATION_BY_CODE_MAX_ATTEMPTS\", 3)\n\n    @property\n    def EMAIL_VERIFICATION_BY_CODE_TIMEOUT(self):\n        return self._setting(\"EMAIL_VERIFICATION_BY_CODE_TIMEOUT\", 15 * 60)\n\n    @property\n    def EMAIL_VERIFICATION_MAX_CHANGE_COUNT(self) -> int:\n        \"\"\"\n        The maximum number of times the email can be changed after signup at\n        the email veriication stage.\n        \"\"\"\n        v = self._setting(\"EMAIL_VERIFICATION_SUPPORTS_CHANGE\", False)\n        if isinstance(v, bool):\n            v = 2 if v else 0\n        return v\n\n    @property\n    def EMAIL_VERIFICATION_MAX_RESEND_COUNT(self) -> int:\n        \"\"\"\n        The maximum number of times the user can request a new email verification code.\n        \"\"\"\n        v = self._setting(\"EMAIL_VERIFICATION_SUPPORTS_RESEND\", False)\n        if isinstance(v, bool):\n            v = 2 if v else 0\n        return v\n\n    @property\n    def MAX_EMAIL_ADDRESSES(self):\n        return self._setting(\"MAX_EMAIL_ADDRESSES\", None)\n\n    @property\n    def CHANGE_EMAIL(self):\n        return self._setting(\"CHANGE_EMAIL\", False)\n\n    @property\n    def AUTHENTICATION_METHOD(self):\n        warnings.warn(\n            \"app_settings.AUTHENTICATION_METHOD is deprecated, use: app_settings.LOGIN_METHODS\",\n            stacklevel=3,\n        )\n        methods = self.LOGIN_METHODS\n        if self.LoginMethod.EMAIL in methods and self.LoginMethod.USERNAME in methods:\n            return \"username_email\"\n        elif self.LoginMethod.EMAIL in methods:\n            return \"email\"\n        elif self.LoginMethod.USERNAME in methods:\n            return \"username\"\n        else:\n            raise NotADirectoryError\n\n    @property\n    def LOGIN_METHODS(self) -> frozenset[LoginMethod]:\n        methods = self._setting(\"LOGIN_METHODS\", None)\n        if methods is None:\n            auth_method = self._setting(\n                \"AUTHENTICATION_METHOD\", self.AuthenticationMethod.USERNAME\n            )\n            if auth_method == self.AuthenticationMethod.USERNAME_EMAIL:\n                methods = {self.LoginMethod.EMAIL, self.LoginMethod.USERNAME}\n            else:\n                methods = {self.LoginMethod(auth_method)}\n        return frozenset([self.LoginMethod(m) for m in methods])\n\n    @property\n    def EMAIL_MAX_LENGTH(self):\n        \"\"\"\n        Adjust max_length of email addresses\n        \"\"\"\n        return self._setting(\"EMAIL_MAX_LENGTH\", 254)\n\n    @property\n    def PHONE_VERIFICATION_ENABLED(self):\n        return self._setting(\"PHONE_VERIFICATION_ENABLED\", True)\n\n    @property\n    def PHONE_VERIFICATION_MAX_ATTEMPTS(self):\n        return self._setting(\"PHONE_VERIFICATION_MAX_ATTEMPTS\", 3)\n\n    @property\n    def PHONE_VERIFICATION_MAX_CHANGE_COUNT(self) -> int:\n        \"\"\"\n        The maximum number of times the phone number can be changed after\n        signup at the phone number verification stage.\n        \"\"\"\n        v = self._setting(\"PHONE_VERIFICATION_SUPPORTS_CHANGE\", False)\n        if isinstance(v, bool):\n            v = 2 if v else 0\n        return v\n\n    @property\n    def PHONE_VERIFICATION_MAX_RESEND_COUNT(self) -> int:\n        \"\"\"\n        The maximum number of times the user can request a new phone number\n        verification code.\n        \"\"\"\n        v = self._setting(\"PHONE_VERIFICATION_SUPPORTS_RESEND\", False)\n        if isinstance(v, bool):\n            v = 2 if v else 0\n        return v\n\n    @property\n    def PHONE_VERIFICATION_TIMEOUT(self):\n        return self._setting(\"PHONE_VERIFICATION_TIMEOUT\", 15 * 60)\n\n    @property\n    def UNIQUE_EMAIL(self):\n        \"\"\"\n        Enforce uniqueness of email addresses\n        \"\"\"\n        return self._setting(\"UNIQUE_EMAIL\", True)\n\n    @property\n    def SIGNUP_EMAIL_ENTER_TWICE(self):\n        \"\"\"\n        Signup email verification\n        \"\"\"\n        warnings.warn(\n            \"app_settings.SIGNUP_EMAIL_ENTER_TWICE is deprecated, use: 'email2' in app_settings.SIGNUP_FIELDS\",\n            stacklevel=3,\n        )\n        return \"email2\" in self.SIGNUP_FIELDS\n\n    @property\n    def SIGNUP_PASSWORD_ENTER_TWICE(self):\n        \"\"\"\n        Signup password verification\n        \"\"\"\n        warnings.warn(\n            \"app_settings.SIGNUP_PASSWORD_ENTER_TWICE is deprecated, use: 'password2' in app_settings.SIGNUP_FIELDS\",\n            stacklevel=3,\n        )\n        return \"password2\" in self.SIGNUP_FIELDS\n\n    @property\n    def SIGNUP_REDIRECT_URL(self):\n        from django.conf import settings\n\n        return self._setting(\"SIGNUP_REDIRECT_URL\", settings.LOGIN_REDIRECT_URL)\n\n    @property\n    def PASSWORD_MIN_LENGTH(self):\n        \"\"\"\n        Minimum password Length\n        \"\"\"\n        from django.conf import settings\n\n        ret = None\n        if not settings.AUTH_PASSWORD_VALIDATORS:\n            ret = self._setting(\"PASSWORD_MIN_LENGTH\", 6)\n        return ret\n\n    @property\n    def RATE_LIMITS(self):\n        rls = self._setting(\"RATE_LIMITS\", {})\n        if rls is False:\n            return {}\n        attempts_amount = self._setting(\"LOGIN_ATTEMPTS_LIMIT\", 5)\n        attempts_timeout = self._setting(\"LOGIN_ATTEMPTS_TIMEOUT\", 60 * 5)\n        login_failed_rl = None\n        if attempts_amount and attempts_timeout:\n            login_failed_rl = f\"10/m/ip,{attempts_amount}/{attempts_timeout}s/key\"\n\n        if self.EMAIL_VERIFICATION_BY_CODE_ENABLED:\n            confirm_email_rl = \"1/10s/key\"\n        else:\n            cooldown = self._setting(\"EMAIL_CONFIRMATION_COOLDOWN\", 3 * 60)\n            confirm_email_rl = None\n            if cooldown:\n                confirm_email_rl = f\"1/{cooldown}s/key\"\n        ret = {\n            # Change password view (for users already logged in)\n            \"change_password\": \"5/m/user\",  # nosec\n            # Change phone number\n            \"change_phone\": \"1/m/user\",\n            # Email management (e.g. add, remove, change primary)\n            \"manage_email\": \"10/m/user\",\n            # Request a password reset, global rate limit per IP\n            \"reset_password\": \"20/m/ip,5/m/key\",\n            # Reauthentication for users already logged in\n            \"reauthenticate\": \"10/m/user\",\n            # Password reset (the view the password reset email links to).\n            \"reset_password_from_key\": \"20/m/ip\",\n            # Signups.\n            \"signup\": \"20/m/ip\",\n            # Logins.\n            \"login\": \"30/m/ip\",\n            # Request a login code: key is the email.\n            \"request_login_code\": \"20/m/ip,3/m/key\",\n            # Logins.\n            \"login_failed\": login_failed_rl,\n            # Verify email (to be renamed to verify_email)\n            \"confirm_email\": confirm_email_rl,\n            # Verify phone\n            \"verify_phone\": \"1/30s/key,3/m/ip\",\n        }\n        ret.update(rls)\n        return ret\n\n    @property\n    def EMAIL_SUBJECT_PREFIX(self):\n        \"\"\"\n        Subject-line prefix to use for email messages sent\n        \"\"\"\n        return self._setting(\"EMAIL_SUBJECT_PREFIX\", None)\n\n    @property\n    def SIGNUP_FORM_CLASS(self):\n        \"\"\"\n        Signup form\n        \"\"\"\n        return self._setting(\"SIGNUP_FORM_CLASS\", None)\n\n    @property\n    def SIGNUP_FORM_HONEYPOT_FIELD(self):\n        \"\"\"\n        Honeypot field name. Empty string or ``None`` will disable honeypot behavior.\n        \"\"\"\n        return self._setting(\"SIGNUP_FORM_HONEYPOT_FIELD\", None)\n\n    @property\n    def SIGNUP_FIELDS(self) -> dict:\n        fields = self._setting(\"SIGNUP_FIELDS\", None)\n        if not fields:\n            fields = []\n            username = self._setting(\"USERNAME_REQUIRED\", True)\n            email = self._setting(\"EMAIL_REQUIRED\", False)\n            email2 = self._setting(\"SIGNUP_EMAIL_ENTER_TWICE\", False)\n            password2 = self._setting(\n                \"SIGNUP_PASSWORD_ENTER_TWICE\",\n                self._setting(\"SIGNUP_PASSWORD_VERIFICATION\", True),\n            )\n            if email:\n                fields.append(\"email*\")\n            else:\n                fields.append(\"email\")\n            if email2:\n                fields.append(\"email2*\" if email else \"email2\")\n            if username:\n                fields.append(\"username*\")\n            fields.append(\"password1*\")\n            if password2:\n                fields.append(\"password2*\")\n        ret = {}\n        for field in fields:\n            f, req, _ = field.partition(\"*\")\n            ret[f] = {\"required\": bool(req)}\n        return ret\n\n    @property\n    def USERNAME_REQUIRED(self):\n        \"\"\"\n        The user is required to enter a username when signing up\n        \"\"\"\n        warnings.warn(\n            \"app_settings.USERNAME_REQUIRED is deprecated, use: app_settings.SIGNUP_FIELDS['username']['required']\",\n            stacklevel=3,\n        )\n        username = self.SIGNUP_FIELDS.get(\"username\")\n        return username and username[\"required\"]\n\n    @property\n    def USERNAME_MIN_LENGTH(self):\n        \"\"\"\n        Minimum username Length\n        \"\"\"\n        return self._setting(\"USERNAME_MIN_LENGTH\", 1)\n\n    @property\n    def USERNAME_BLACKLIST(self):\n        \"\"\"\n        List of usernames that are not allowed\n        \"\"\"\n        return self._setting(\"USERNAME_BLACKLIST\", [])\n\n    @property\n    def PASSWORD_INPUT_RENDER_VALUE(self):\n        \"\"\"\n        render_value parameter as passed to PasswordInput fields\n        \"\"\"\n        return self._setting(\"PASSWORD_INPUT_RENDER_VALUE\", False)\n\n    @property\n    def ADAPTER(self):\n        return self._setting(\"ADAPTER\", \"allauth.account.adapter.DefaultAccountAdapter\")\n\n    @property\n    def CONFIRM_EMAIL_ON_GET(self):\n        return self._setting(\"CONFIRM_EMAIL_ON_GET\", False)\n\n    @property\n    def AUTHENTICATED_LOGIN_REDIRECTS(self):\n        return self._setting(\"AUTHENTICATED_LOGIN_REDIRECTS\", True)\n\n    @property\n    def LOGIN_ON_EMAIL_CONFIRMATION(self):\n        \"\"\"\n        Automatically log the user in once they confirmed their email address\n        \"\"\"\n        return self._setting(\"LOGIN_ON_EMAIL_CONFIRMATION\", False)\n\n    @property\n    def LOGIN_ON_PASSWORD_RESET(self):\n        \"\"\"\n        Automatically log the user in immediately after resetting\n        their password.\n        \"\"\"\n        return self._setting(\"LOGIN_ON_PASSWORD_RESET\", False)\n\n    @property\n    def LOGOUT_REDIRECT_URL(self):\n        from django.conf import settings\n\n        return self._setting(\"LOGOUT_REDIRECT_URL\", settings.LOGOUT_REDIRECT_URL or \"/\")\n\n    @property\n    def LOGOUT_ON_GET(self):\n        return self._setting(\"LOGOUT_ON_GET\", False)\n\n    @property\n    def LOGOUT_ON_PASSWORD_CHANGE(self):\n        return self._setting(\"LOGOUT_ON_PASSWORD_CHANGE\", False)\n\n    @property\n    def USER_MODEL_USERNAME_FIELD(self):\n        return self._setting(\"USER_MODEL_USERNAME_FIELD\", \"username\")\n\n    @property\n    def USER_MODEL_EMAIL_FIELD(self):\n        return self._setting(\"USER_MODEL_EMAIL_FIELD\", \"email\")\n\n    @property\n    def SESSION_COOKIE_AGE(self):\n        \"\"\"\n        Deprecated -- use Django's settings.SESSION_COOKIE_AGE instead\n        \"\"\"\n        from django.conf import settings\n\n        return self._setting(\"SESSION_COOKIE_AGE\", settings.SESSION_COOKIE_AGE)\n\n    @property\n    def SESSION_REMEMBER(self):\n        \"\"\"\n        Controls the life time of the session. Set to `None` to ask the user\n        (\"Remember me?\"), `False` to not remember, and `True` to always\n        remember.\n        \"\"\"\n        return self._setting(\"SESSION_REMEMBER\", None)\n\n    @property\n    def TEMPLATE_EXTENSION(self):\n        \"\"\"\n        A string defining the template extension to use, defaults to `html`.\n        \"\"\"\n        return self._setting(\"TEMPLATE_EXTENSION\", \"html\")\n\n    @property\n    def FORMS(self):\n        return self._setting(\"FORMS\", {})\n\n    @property\n    def EMAIL_CONFIRMATION_HMAC(self):\n        return self._setting(\"EMAIL_CONFIRMATION_HMAC\", True)\n\n    @property\n    def SALT(self):\n        return self._setting(\"SALT\", \"account\")\n\n    @property\n    def PRESERVE_USERNAME_CASING(self):\n        return self._setting(\"PRESERVE_USERNAME_CASING\", True)\n\n    @property\n    def USERNAME_VALIDATORS(self):\n        from django.contrib.auth import get_user_model\n        from django.core.exceptions import ImproperlyConfigured\n\n        from allauth.utils import import_attribute\n\n        path = self._setting(\"USERNAME_VALIDATORS\", None)\n        if path:\n            ret = import_attribute(path)\n            if not isinstance(ret, list):\n                raise ImproperlyConfigured(\n                    \"ACCOUNT_USERNAME_VALIDATORS is expected to be a list\"\n                )\n        else:\n            if self.USER_MODEL_USERNAME_FIELD is not None:\n                ret = (\n                    get_user_model()\n                    ._meta.get_field(self.USER_MODEL_USERNAME_FIELD)\n                    .validators\n                )\n            else:\n                ret = []\n        return ret\n\n    @property\n    def PASSWORD_RESET_BY_CODE_ENABLED(self):\n        return self._setting(\"PASSWORD_RESET_BY_CODE_ENABLED\", False)\n\n    @property\n    def PASSWORD_RESET_BY_CODE_MAX_ATTEMPTS(self):\n        return self._setting(\"PASSWORD_RESET_BY_CODE_MAX_ATTEMPTS\", 3)\n\n    @property\n    def PASSWORD_RESET_BY_CODE_TIMEOUT(self):\n        return self._setting(\"PASSWORD_RESET_BY_CODE_TIMEOUT\", 3 * 60)\n\n    @property\n    def PASSWORD_RESET_TOKEN_GENERATOR(self):\n        from allauth.account.forms import EmailAwarePasswordResetTokenGenerator\n        from allauth.utils import import_attribute\n\n        token_generator_path = self._setting(\"PASSWORD_RESET_TOKEN_GENERATOR\", None)\n        if token_generator_path is not None:\n            token_generator = import_attribute(token_generator_path)\n        else:\n            token_generator = EmailAwarePasswordResetTokenGenerator\n        return token_generator\n\n    @property\n    def EMAIL_UNKNOWN_ACCOUNTS(self):\n        return self._setting(\"EMAIL_UNKNOWN_ACCOUNTS\", True)\n\n    @property\n    def REAUTHENTICATION_TIMEOUT(self):\n        return self._setting(\"REAUTHENTICATION_TIMEOUT\", 300)\n\n    @property\n    def EMAIL_NOTIFICATIONS(self):\n        return self._setting(\"EMAIL_NOTIFICATIONS\", False)\n\n    @property\n    def REAUTHENTICATION_REQUIRED(self):\n        return self._setting(\"REAUTHENTICATION_REQUIRED\", False)\n\n    @property\n    def LOGIN_BY_CODE_ENABLED(self):\n        return self._setting(\"LOGIN_BY_CODE_ENABLED\", False)\n\n    @property\n    def LOGIN_BY_CODE_TRUST_ENABLED(self):\n        return self._setting(\"LOGIN_BY_CODE_TRUST_ENABLED\", False)\n\n    @property\n    def LOGIN_BY_CODE_MAX_ATTEMPTS(self):\n        return self._setting(\"LOGIN_BY_CODE_MAX_ATTEMPTS\", 3)\n\n    @property\n    def LOGIN_BY_CODE_MAX_RESEND_COUNT(self) -> int:\n        \"\"\"\n        The maximum number of times the user can request a new login code.\n        \"\"\"\n        v = self._setting(\"LOGIN_BY_CODE_SUPPORTS_RESEND\", False)\n        if isinstance(v, bool):\n            v = 2 if v else 0\n        return v\n\n    @property\n    def LOGIN_BY_CODE_TIMEOUT(self):\n        return self._setting(\"LOGIN_BY_CODE_TIMEOUT\", 3 * 60)\n\n    @property\n    def LOGIN_TIMEOUT(self):\n        \"\"\"\n        The maximum allowed time (in seconds) for a login to go through the\n        various login stages. This limits, for example, the time span that the\n        2FA stage remains available.\n        \"\"\"\n        return self._setting(\"LOGIN_TIMEOUT\", 15 * 60)\n\n    @property\n    def LOGIN_BY_CODE_REQUIRED(self) -> bool | set[str]:\n        \"\"\"\n        When enabled (in case of ``True``), every user logging in is\n        required to input a login confirmation code sent by email.\n        Alternatively, you can specify a set of authentication methods\n        (``\"password\"``, ``\"mfa\"``, or ``\"socialaccount\"``) for which login\n        codes are required.\n        \"\"\"\n        value = self._setting(\"LOGIN_BY_CODE_REQUIRED\", False)\n        if isinstance(value, bool):\n            return value\n        return set(value)\n\n    @property\n    def LOGIN_BY_CODE_FORMAT(self) -> UserCodeFormat:\n        \"\"\"\n        Controls the format of the login code.\n        \"\"\"\n        return self._setting(\"LOGIN_BY_CODE_FORMAT\", allauth_settings.USER_CODE_FORMAT)\n\n    @property\n    def PHONE_VERIFICATION_CODE_FORMAT(self) -> UserCodeFormat:\n        \"\"\"\n        Controls the format of the phone verification code.\n        \"\"\"\n        return self._setting(\n            \"PHONE_VERIFICATION_CODE_FORMAT\", allauth_settings.USER_CODE_FORMAT\n        )\n\n    @property\n    def PASSWORD_RESET_BY_CODE_FORMAT(self) -> UserCodeFormat:\n        \"\"\"\n        Controls the format of the password reset code.\n        \"\"\"\n        return self._setting(\n            \"PASSWORD_RESET_BY_CODE_CODE_FORMAT\", allauth_settings.USER_CODE_FORMAT\n        )\n\n    @property\n    def EMAIL_VERIFICATION_BY_CODE_FORMAT(self) -> UserCodeFormat:\n        \"\"\"\n        Controls the format of the email verification code.\n        \"\"\"\n        return self._setting(\n            \"EMAIL_VERIFICATION_BY_CODE_FORMAT\", allauth_settings.USER_CODE_FORMAT\n        )\n\n\n_app_settings = AppSettings(\"ACCOUNT_\")\n\n\ndef __getattr__(name):\n    # See https://peps.python.org/pep-0562/\n    return getattr(_app_settings, name)\n"
  },
  {
    "path": "allauth/account/apps.py",
    "content": "from django.apps import AppConfig\nfrom django.conf import settings\nfrom django.core.exceptions import ImproperlyConfigured\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth import app_settings\n\n\nclass AccountConfig(AppConfig):\n    name = \"allauth.account\"\n    verbose_name = _(\"Accounts\")\n    default_auto_field = app_settings.DEFAULT_AUTO_FIELD or \"django.db.models.AutoField\"\n\n    def ready(self):\n        from allauth.account import checks  # noqa\n\n        required_mw = \"allauth.account.middleware.AccountMiddleware\"\n        if required_mw not in settings.MIDDLEWARE:\n            raise ImproperlyConfigured(\n                f\"{required_mw} must be added to settings.MIDDLEWARE\"\n            )\n"
  },
  {
    "path": "allauth/account/auth_backends.py",
    "content": "from threading import local\n\nfrom django.contrib.auth import get_user_model\nfrom django.contrib.auth.backends import ModelBackend\n\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.app_settings import LoginMethod\n\nfrom . import app_settings\nfrom .utils import filter_users_by_email, filter_users_by_username\n\n\n_stash = local()\n\n\nclass AuthenticationBackend(ModelBackend):\n    def authenticate(self, request, **credentials):\n        password = credentials.get(\"password\")\n        if not password:\n            return None\n        self._did_check_password = False\n        user = self._authenticate(request, **credentials)\n        if not self._did_check_password:\n            self._mitigate_timing_attack(password)\n        return user\n\n    def _authenticate(self, request, **credentials):\n        password = credentials.get(\"password\")\n        username = credentials.get(\"username\")\n        if username:\n            if LoginMethod.EMAIL in app_settings.LOGIN_METHODS:\n                # Username/email ambiguity: even though allauth will pass along\n                # `email` explicitly, other apps may not respect this. For example,\n                # when using django-tastypie basic authentication, the login is\n                # always passed as `username`.  So let's play nice with other apps\n                # and use username as fallback.\n                user = self._authenticate_by_email(username, password)\n                if user:\n                    return user\n            user = self._authenticate_by_username(username, password)\n            if user:\n                return user\n\n        email = credentials.get(\"email\")\n        if email:\n            user = self._authenticate_by_email(email, password)\n            if user:\n                return user\n\n        phone = credentials.get(\"phone\")\n        if phone:\n            user = self._authenticate_by_phone(phone, password)\n            if user:\n                return user\n        return None\n\n    def _authenticate_by_phone(self, phone: str, password: str):\n        if not phone or LoginMethod.PHONE not in app_settings.LOGIN_METHODS:\n            return None\n        adapter = get_adapter()\n        user = adapter.get_user_by_phone(phone)\n        return self._check_password(user, password)\n\n    def _authenticate_by_username(self, username: str, password: str):\n        if (\n            (LoginMethod.USERNAME not in app_settings.LOGIN_METHODS)\n            or (not app_settings.USER_MODEL_USERNAME_FIELD)\n            or not username\n        ):\n            return None\n        user = filter_users_by_username(username).first()\n        return self._check_password(user, password)\n\n    def _authenticate_by_email(\n        self,\n        email: str,\n        password: str,\n    ):\n        if not email or LoginMethod.EMAIL not in app_settings.LOGIN_METHODS:\n            return None\n        users = filter_users_by_email(email, prefer_verified=True)\n        for user in users:\n            if self._check_password(user, password):\n                return user\n        return None\n\n    def _mitigate_timing_attack(self, password):\n        get_user_model()().set_password(password)\n\n    def _check_password(self, user, password):\n        if not user:\n            return None\n        self._did_check_password = True\n        ok = user.check_password(password)\n        if ok:\n            ok = self.user_can_authenticate(user)\n            if not ok:\n                self._stash_user(user)\n        return user if ok else None\n\n    @classmethod\n    def _stash_user(cls, user):\n        \"\"\"Now, be aware, the following is quite ugly, let me explain:\n\n        Even if the user credentials match, the authentication can fail because\n        Django's default ModelBackend calls user_can_authenticate(), which\n        checks `is_active`. Now, earlier versions of allauth did not do this\n        and simply returned the user as authenticated, even in case of\n        `is_active=False`. For allauth scope, this does not pose a problem, as\n        these users are properly redirected to an account inactive page.\n\n        This does pose a problem when the allauth backend is used in a\n        different context where allauth is not responsible for the login. Then,\n        by not checking on `user_can_authenticate()` users will allow to become\n        authenticated whereas according to Django logic this should not be\n        allowed.\n\n        In order to preserve the allauth behavior while respecting Django's\n        logic, we stash a user for which the password check succeeded but\n        `user_can_authenticate()` failed. In the allauth authentication logic,\n        we can then unstash this user and proceed pointing the user to the\n        account inactive page.\n        \"\"\"\n        global _stash  # noqa: F824\n        ret = getattr(_stash, \"user\", None)\n        _stash.user = user\n        return ret\n\n    @classmethod\n    def unstash_authenticated_user(cls):\n        return cls._stash_user(None)\n"
  },
  {
    "path": "allauth/account/authentication.py",
    "content": "from allauth.account.internal.flows.login import AUTHENTICATION_METHODS_SESSION_KEY\n\n\ndef get_authentication_records(request):\n    return request.session.get(AUTHENTICATION_METHODS_SESSION_KEY, [])\n"
  },
  {
    "path": "allauth/account/checks.py",
    "content": "from django.core.checks import Critical, Warning, register\n\n\n@register()\ndef adapter_check(app_configs, **kwargs):\n    from allauth.account.adapter import get_adapter\n\n    ret = []\n    adapter = get_adapter()\n    if hasattr(adapter, \"get_email_confirmation_redirect_url\"):\n        ret.append(\n            Warning(\n                msg=\"adapter.get_email_confirmation_redirect_url(request) is deprecated, use adapter.get_email_verification_redirect_url(email_address)\"\n            )\n        )\n    return ret\n\n\n@register()\ndef settings_check(app_configs, **kwargs):\n    from django.conf import settings\n\n    from allauth import app_settings as allauth_app_settings\n    from allauth.account import app_settings\n\n    ret = []\n    if allauth_app_settings.SOCIALACCOUNT_ONLY:\n        if app_settings.LOGIN_BY_CODE_ENABLED:\n            ret.append(\n                Critical(\n                    msg=\"SOCIALACCOUNT_ONLY does not work with ACCOUNT_LOGIN_BY_CODE_ENABLED\"\n                )\n            )\n        if allauth_app_settings.MFA_ENABLED:\n            ret.append(\n                Critical(msg=\"SOCIALACCOUNT_ONLY does not work with 'allauth.mfa'\")\n            )\n        if app_settings.EMAIL_VERIFICATION != app_settings.EmailVerificationMethod.NONE:\n            ret.append(\n                Critical(\n                    msg=\"SOCIALACCOUNT_ONLY requires ACCOUNT_EMAIL_VERIFICATION = 'none'\"\n                )\n            )\n    if (\n        app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED\n        and app_settings.EMAIL_VERIFICATION\n        != app_settings.EmailVerificationMethod.MANDATORY\n    ):\n        ret.append(\n            Critical(\n                msg=\"ACCOUNT_EMAIL_VERFICATION_BY_CODE requires ACCOUNT_EMAIL_VERIFICATION = 'mandatory'\"\n            )\n        )\n\n    # Often made mistake: ACCOUNT_SIGNUP_FIELDS = [..., \"password\", ...]\n    signup_fields = getattr(settings, \"ACCOUNT_SIGNUP_FIELDS\", None)\n    for wrong_field, right_field in [\n        (\"password\", \"password1\"),\n        (\"password*\", \"password1*\"),\n    ]:\n        if signup_fields and wrong_field in signup_fields:\n            ret.append(\n                Critical(\n                    msg=f\"'{wrong_field}' is not a valid field for ACCOUNT_SIGNUP_FIELDS, use '{right_field}'\",\n                )\n            )\n\n    # Cross-check SIGNUP_FIELDS against LOGIN_METHODS. E.g. login is by email, email should be required\n    signup_fields = app_settings.SIGNUP_FIELDS\n    if not any(\n        lm in signup_fields and signup_fields[lm][\"required\"]\n        for lm in app_settings.LOGIN_METHODS\n    ):\n        ret.append(\n            Warning(\n                msg=\"ACCOUNT_LOGIN_METHODS conflicts with ACCOUNT_SIGNUP_FIELDS\",\n                id=\"account.W001\",\n            )\n        )\n\n    # If login includes email, email must be unique\n    if (\n        app_settings.LoginMethod.EMAIL in app_settings.LOGIN_METHODS\n        and not app_settings.UNIQUE_EMAIL\n    ):\n        ret.append(\n            Critical(msg=\"Using email as a login method requires ACCOUNT_UNIQUE_EMAIL\")\n        )\n\n    # Mandatory email verification requires email\n    email_required = \"email\" in signup_fields and signup_fields[\"email\"][\"required\"]\n    if (\n        app_settings.EMAIL_VERIFICATION\n        == app_settings.EmailVerificationMethod.MANDATORY\n        and not email_required\n    ):\n        ret.append(\n            Critical(\n                msg=\"ACCOUNT_EMAIL_VERIFICATION = 'mandatory' requires 'email*' in ACCOUNT_SIGNUP_FIELDS\"\n            )\n        )\n\n    if not app_settings.USER_MODEL_USERNAME_FIELD:\n        if \"username\" in signup_fields:\n            ret.append(\n                Critical(\n                    msg=\"No ACCOUNT_USER_MODEL_USERNAME_FIELD, yet, ACCOUNT_SIGNUP_FIELDS contains 'username'\"\n                )\n            )\n\n        if app_settings.LoginMethod.USERNAME in app_settings.LOGIN_METHODS:\n            ret.append(\n                Critical(\n                    msg=\"No ACCOUNT_USER_MODEL_USERNAME_FIELD, yet, ACCOUNT_LOGIN_METHODS requires it\"\n                )\n            )\n\n    if (\n        app_settings.MAX_EMAIL_ADDRESSES is not None\n        and app_settings.MAX_EMAIL_ADDRESSES <= 0\n    ):\n        ret.append(Critical(msg=\"ACCOUNT_MAX_EMAIL_ADDRESSES must be None or > 0\"))\n\n    if app_settings.CHANGE_EMAIL:\n        if (\n            app_settings.MAX_EMAIL_ADDRESSES is not None\n            and app_settings.MAX_EMAIL_ADDRESSES != 2\n        ):\n            ret.append(\n                Critical(\n                    msg=\"Invalid combination of ACCOUNT_CHANGE_EMAIL and ACCOUNT_MAX_EMAIL_ADDRESSES\"\n                )\n            )\n    if hasattr(settings, \"ACCOUNT_LOGIN_ATTEMPTS_LIMIT\") or hasattr(\n        settings, \"ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT\"\n    ):\n        ret.append(\n            Warning(\n                msg=\"settings.ACCOUNT_LOGIN_ATTEMPTS_LIMIT/TIMEOUT is deprecated, use: settings.ACCOUNT_RATE_LIMITS['login_failed']\"\n            )\n        )\n\n    if hasattr(settings, \"ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN\"):\n        ret.append(\n            Warning(\n                msg=\"settings.ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN is deprecated, use: settings.ACCOUNT_RATE_LIMITS['confirm_email']\"\n            )\n        )\n\n    if hasattr(settings, \"ACCOUNT_AUTHENTICATION_METHOD\"):\n        converted = set(settings.ACCOUNT_AUTHENTICATION_METHOD.split(\"_\"))\n        ret.append(\n            Warning(\n                f\"settings.ACCOUNT_AUTHENTICATION_METHOD is deprecated, use: settings.ACCOUNT_LOGIN_METHODS = {repr(converted)}\"\n            )\n        )\n\n    for field in [\n        \"ACCOUNT_USERNAME_REQUIRED\",\n        \"ACCOUNT_EMAIL_REQUIRED\",\n        \"ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE\",\n        \"ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE\",\n    ]:\n        if hasattr(settings, field):\n            signup_fields_converted = [\n                k + (\"*\" if v[\"required\"] else \"\")\n                for k, v in app_settings.SIGNUP_FIELDS.items()\n            ]\n            ret.append(\n                Warning(\n                    f\"settings.{field} is deprecated, use: settings.ACCOUNT_SIGNUP_FIELDS = {repr(signup_fields_converted)}\"\n                )\n            )\n\n    if (\n        not allauth_app_settings.MFA_ENABLED\n        and app_settings.LOGIN_BY_CODE_TRUST_ENABLED\n    ):\n        ret.append(\n            Critical(\n                msg=\"ACCOUNT_LOGIN_BY_CODE_TRUST_ENABLED requires MFA to be enabled\"\n            )\n        )\n\n    return ret\n"
  },
  {
    "path": "allauth/account/decorators.py",
    "content": "from functools import wraps\n\nfrom django.conf import settings\nfrom django.contrib.auth import REDIRECT_FIELD_NAME\nfrom django.contrib.auth.decorators import login_required\nfrom django.core.exceptions import PermissionDenied\nfrom django.http import HttpResponseRedirect\nfrom django.shortcuts import render, resolve_url\nfrom django.urls import reverse\n\nfrom allauth.account import app_settings\nfrom allauth.account.internal.flows import reauthentication\nfrom allauth.account.internal.flows.email_verification import (\n    send_verification_email_for_user,\n)\nfrom allauth.account.models import EmailAddress\nfrom allauth.account.utils import get_next_redirect_url\nfrom allauth.core.exceptions import ReauthenticationRequired\nfrom allauth.core.internal import httpkit\n\n\ndef verified_email_required(\n    function=None, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME\n):\n    \"\"\"\n    Even when email verification is not mandatory during signup, there\n    may be circumstances during which you really want to prevent\n    unverified users to proceed. This decorator ensures the user is\n    authenticated and has a verified email address. If the former is\n    not the case then the behavior is identical to that of the\n    standard `login_required` decorator. If the latter does not hold,\n    email verification mails are automatically resend and the user is\n    presented with a page informing them they needs to verify their email\n    address.\n    \"\"\"\n\n    def decorator(view_func):\n        @login_required(redirect_field_name=redirect_field_name, login_url=login_url)\n        def _wrapped_view(request, *args, **kwargs):\n            if not EmailAddress.objects.filter(\n                user=request.user, verified=True\n            ).exists():\n                send_verification_email_for_user(request, request.user)\n                if app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED:\n                    url = httpkit.add_query_params(\n                        reverse(\"account_email_verification_sent\"),\n                        {REDIRECT_FIELD_NAME: request.get_full_path()},\n                    )\n                    return HttpResponseRedirect(url)\n                return render(request, \"account/verified_email_required.html\")\n            return view_func(request, *args, **kwargs)\n\n        return _wrapped_view\n\n    if function:\n        return decorator(function)\n    return decorator\n\n\ndef reauthentication_required(\n    function=None,\n    redirect_field_name=REDIRECT_FIELD_NAME,\n    allow_get=False,\n    enabled=None,\n):\n    def decorator(view_func):\n        @wraps(view_func)\n        def _wrapper_view(request, *args, **kwargs):\n            pass_method = allow_get and request.method == \"GET\"\n            ena = (enabled is None) or (\n                enabled(request) if callable(enabled) else enabled\n            )\n            if ena and not pass_method:\n                if (\n                    request.user.is_anonymous\n                    or not reauthentication.did_recently_authenticate(request)\n                ):\n                    raise ReauthenticationRequired()\n            return view_func(request, *args, **kwargs)\n\n        return _wrapper_view\n\n    if function:\n        return decorator(function)\n    return decorator\n\n\ndef secure_admin_login(function=None):\n    def decorator(view_func):\n        @wraps(view_func)\n        def _wrapper_view(request, *args, **kwargs):\n            if request.user.is_authenticated:\n                if not request.user.is_staff or not request.user.is_active:\n                    raise PermissionDenied()\n                return view_func(request, *args, **kwargs)\n            else:\n                next_url = get_next_redirect_url(request)\n                if not next_url:\n                    next_url = request.get_full_path()\n                login_url = resolve_url(settings.LOGIN_URL)\n                login_url = httpkit.add_query_params(\n                    login_url, {REDIRECT_FIELD_NAME: next_url}\n                )\n                return HttpResponseRedirect(login_url)\n\n        return _wrapper_view\n\n    if function:\n        return decorator(function)\n    return decorator\n"
  },
  {
    "path": "allauth/account/fields.py",
    "content": "from django import forms\nfrom django.contrib.auth import password_validation\nfrom django.core.validators import RegexValidator\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth.account import app_settings\nfrom allauth.account.adapter import get_adapter\n\n\nclass EmailField(forms.EmailField):\n    def __init__(self, *args, **kwargs) -> None:\n        kwargs.setdefault(\"label\", _(\"Email\"))\n        kwargs.setdefault(\n            \"widget\",\n            forms.TextInput(\n                attrs={\n                    \"type\": \"email\",\n                    \"autocomplete\": \"email\",\n                    \"placeholder\": _(\"Email address\"),\n                }\n            ),\n        )\n        super().__init__(*args, **kwargs)\n\n    def clean(self, value):\n        return super().clean(value).lower()\n\n\nclass PasswordField(forms.CharField):\n    def __init__(self, *args, **kwargs):\n        render_value = kwargs.pop(\n            \"render_value\", app_settings.PASSWORD_INPUT_RENDER_VALUE\n        )\n        kwargs[\"widget\"] = forms.PasswordInput(\n            render_value=render_value,\n            attrs={\"placeholder\": kwargs.get(\"label\")},\n        )\n        autocomplete = kwargs.pop(\"autocomplete\", None)\n        if autocomplete is not None:\n            kwargs[\"widget\"].attrs[\"autocomplete\"] = autocomplete\n        super().__init__(*args, **kwargs)\n\n\nclass SetPasswordField(PasswordField):\n    def __init__(self, *args, **kwargs):\n        kwargs[\"autocomplete\"] = \"new-password\"\n        kwargs.setdefault(\n            \"help_text\", password_validation.password_validators_help_text_html()\n        )\n        super().__init__(*args, **kwargs)\n        self.user = None\n\n    def clean(self, value):\n        value = super().clean(value)\n        value = get_adapter().clean_password(value, user=self.user)\n        return value\n\n\nclass PhoneField(forms.CharField):\n    e164_validator = RegexValidator(\n        regex=r\"^\\+[1-9]\\d{5,14}$\",\n        message=_(\"Enter a phone number including country code (e.g. +1 for the US).\"),\n        code=\"invalid_phone\",\n    )\n\n    def __init__(self, *args, **kwargs):\n        widget = forms.TextInput(\n            attrs={\"placeholder\": _(\"Phone\"), \"autocomplete\": \"tel\", \"type\": \"tel\"}\n        )\n        kwargs.setdefault(\"validators\", [self.e164_validator])\n        kwargs.setdefault(\"widget\", widget)\n        kwargs.setdefault(\"label\", _(\"Phone\"))\n        super().__init__(*args, **kwargs)\n\n    def clean(self, value):\n        value = super().clean(value)\n        if value:\n            value = value.replace(\" \", \"\").replace(\"-\", \"\")\n            value = get_adapter().clean_phone(value)\n        return value\n"
  },
  {
    "path": "allauth/account/forms.py",
    "content": "from django import forms\nfrom django.contrib.auth import REDIRECT_FIELD_NAME, get_user_model, password_validation\nfrom django.contrib.auth.tokens import PasswordResetTokenGenerator\nfrom django.core import exceptions, validators\nfrom django.template.exceptions import TemplateDoesNotExist\nfrom django.template.loader import render_to_string\nfrom django.urls import NoReverseMatch, reverse\nfrom django.utils.safestring import mark_safe\nfrom django.utils.translation import gettext, gettext_lazy as _, pgettext\n\nfrom allauth.account.app_settings import LoginMethod\nfrom allauth.account.fields import EmailField, PasswordField, SetPasswordField\nfrom allauth.account.internal import flows\nfrom allauth.account.internal.flows.manage_email import (\n    email_already_exists,\n    sync_user_email_address,\n)\nfrom allauth.account.internal.flows.phone_verification import phone_already_exists\nfrom allauth.account.internal.flows.signup import base_signup_form_class\nfrom allauth.core import context, ratelimit\nfrom allauth.core.internal.cryptokit import compare_user_code\nfrom allauth.core.internal.httpkit import headed_redirect_response\nfrom allauth.utils import get_username_max_length, set_form_field_order\n\nfrom . import app_settings\nfrom .adapter import get_adapter\nfrom .models import EmailAddress, Login\nfrom .utils import (\n    filter_users_by_email,\n    setup_user_email,\n    url_str_to_user_pk,\n    user_email,\n    user_username,\n)\n\n\nclass EmailAwarePasswordResetTokenGenerator(PasswordResetTokenGenerator):\n    def _make_hash_value(self, user, timestamp):\n        ret = super()._make_hash_value(user, timestamp)\n        sync_user_email_address(user)\n        email = user_email(user)\n        emails = set([email] if email else [])\n        emails.update(\n            EmailAddress.objects.filter(user=user).values_list(\"email\", flat=True)\n        )\n        ret += \"|\".join(sorted(emails))\n        return ret\n\n\ndefault_token_generator = app_settings.PASSWORD_RESET_TOKEN_GENERATOR()\n\n\nclass PasswordVerificationMixin:\n    def clean(self):\n        cleaned_data = super().clean()\n        password1 = cleaned_data.get(\"password1\")\n        password2 = cleaned_data.get(\"password2\")\n        if (password1 and password2) and password1 != password2:\n            self.add_error(\"password2\", _(\"You must type the same password each time.\"))\n        return cleaned_data\n\n\nclass LoginForm(forms.Form):\n    password = PasswordField(label=_(\"Password\"), autocomplete=\"current-password\")\n    remember = forms.BooleanField(label=_(\"Remember Me\"), required=False)\n\n    user = None\n\n    def __init__(self, *args, **kwargs) -> None:\n        self.request = kwargs.pop(\"request\", None)\n        super().__init__(*args, **kwargs)\n        adapter = get_adapter()\n        login_field: forms.Field\n        if app_settings.LOGIN_METHODS == {LoginMethod.EMAIL}:\n            login_field = EmailField()\n        elif app_settings.LOGIN_METHODS == {LoginMethod.USERNAME}:\n            login_widget = forms.TextInput(\n                attrs={\"placeholder\": _(\"Username\"), \"autocomplete\": \"username\"}\n            )\n            login_field = forms.CharField(\n                label=_(\"Username\"),\n                widget=login_widget,\n                max_length=get_username_max_length(),\n            )\n        elif app_settings.LOGIN_METHODS == {LoginMethod.PHONE}:\n            login_field = adapter.phone_form_field(required=True)\n        else:\n            login_widget = forms.TextInput(\n                attrs={\n                    \"placeholder\": self._get_login_field_placeholder(),\n                    \"autocomplete\": \"email\",\n                }\n            )\n            login_field = forms.CharField(\n                label=pgettext(\"field label\", \"Login\"), widget=login_widget\n            )\n        self.fields[\"login\"] = login_field\n        set_form_field_order(self, [\"login\", \"password\", \"remember\"])\n        if app_settings.SESSION_REMEMBER is not None:\n            del self.fields[\"remember\"]\n        self._setup_password_field()\n\n    def _get_login_field_placeholder(self):\n        methods = app_settings.LOGIN_METHODS\n        assert len(methods) > 1  # nosec\n        assert methods.issubset(\n            {\n                LoginMethod.USERNAME,\n                LoginMethod.EMAIL,\n                LoginMethod.PHONE,\n            }\n        )  # nosec\n        if len(methods) == 3:\n            placeholder = _(\"Username, email or phone\")\n        elif methods == {LoginMethod.USERNAME, LoginMethod.EMAIL}:\n            placeholder = _(\"Username or email\")\n        elif methods == {LoginMethod.USERNAME, LoginMethod.PHONE}:\n            placeholder = _(\"Username or phone\")\n        elif methods == {LoginMethod.EMAIL, LoginMethod.PHONE}:\n            placeholder = _(\"Email or phone\")\n        else:\n            raise ValueError(methods)\n        return placeholder\n\n    def _setup_password_field(self):\n        password_field = app_settings.SIGNUP_FIELDS.get(\"password1\")\n        if not password_field:\n            del self.fields[\"password\"]\n            return\n        try:\n            self.fields[\"password\"].help_text = render_to_string(\n                f\"account/password_reset_help_text.{app_settings.TEMPLATE_EXTENSION}\"\n            )\n            return\n        except TemplateDoesNotExist:\n            pass\n\n        try:\n            reset_url = reverse(\"account_reset_password\")\n        except NoReverseMatch:\n            pass\n        else:\n            forgot_txt = _(\"Forgot your password?\")\n            self.fields[\"password\"].help_text = mark_safe(\n                f'<a href=\"{reset_url}\">{forgot_txt}</a>'\n            )  # nosec\n\n    def user_credentials(self) -> dict:\n        \"\"\"\n        Provides the credentials required to authenticate the user for\n        login.\n        \"\"\"\n        login = self.cleaned_data[\"login\"]\n        method = flows.login.derive_login_method(login)\n        credentials = {}\n        credentials[method] = login\n\n        # There are projects using usernames that look like email addresses,\n        # yet, really are usernames. So, if username is a login method, always\n        # give that a shot.\n        if (\n            LoginMethod.USERNAME in app_settings.LOGIN_METHODS\n            and method != LoginMethod.USERNAME\n        ):\n            credentials[LoginMethod.USERNAME] = login\n\n        password = self.cleaned_data.get(\"password\")\n        if password:\n            credentials[\"password\"] = password\n        return credentials\n\n    def clean_login(self) -> str:\n        login = self.cleaned_data[\"login\"]\n        return login.strip()\n\n    def clean(self):\n        cleaned_data = super().clean()\n        if self._errors:\n            return cleaned_data\n        credentials = self.user_credentials()\n        if \"password\" in credentials:\n            return self._clean_with_password(credentials)\n        return self._clean_without_password(\n            credentials.get(\"email\"), credentials.get(\"phone\")\n        )\n\n    def _clean_without_password(self, email: str | None, phone: str | None):\n        \"\"\"\n        If we don't have a password field, we need to replicate the request-login-code\n        behavior.\n        \"\"\"\n        data = {}\n        if email:\n            data[\"email\"] = email\n        if phone:\n            data[\"phone\"] = phone\n        if not data:\n            self.add_error(\"login\", get_adapter().validation_error(\"invalid_login\"))\n        else:\n            form = RequestLoginCodeForm(data)\n            if not form.is_valid():\n                for field in [\"phone\", \"email\"]:\n                    errors = form.errors.get(field) or []  # type: ignore\n                    for error in errors:\n                        self.add_error(\"login\", error)\n            else:\n                self.user = form._user\n        return self.cleaned_data\n\n    def _clean_with_password(self, credentials: dict):\n        adapter = get_adapter(self.request)\n        user = adapter.authenticate(self.request, **credentials)\n        if user:\n            login = Login(user=user, email=credentials.get(\"email\"))\n            if flows.login.is_login_rate_limited(context.request, login):\n                raise adapter.validation_error(\"too_many_login_attempts\")\n            self._login = login\n            self.user = user\n        else:\n            login_method = flows.login.derive_login_method(\n                login=self.cleaned_data[\"login\"]\n            )\n            raise adapter.validation_error(f\"{login_method.value}_password_mismatch\")\n        return self.cleaned_data\n\n    def login(self, request, redirect_url=None):\n        credentials = self.user_credentials()\n        if \"password\" in credentials:\n            return self._login_with_password(request, redirect_url, credentials)\n        return self._login_by_code(request, redirect_url, credentials)\n\n    def _login_by_code(self, request, redirect_url, credentials):\n        user = getattr(self, \"user\", None)\n        phone = credentials.get(\"phone\")\n        email = credentials.get(\"email\")\n        flows.login_by_code.LoginCodeVerificationProcess.initiate(\n            request=request,\n            user=user,\n            phone=phone,\n            email=email,\n        )\n        query = None\n        if redirect_url:\n            query = {}\n            query[REDIRECT_FIELD_NAME] = redirect_url\n        return headed_redirect_response(\"account_confirm_login_code\", query=query)\n\n    def _login_with_password(self, request, redirect_url, credentials):\n        login = self._login\n        login.redirect_url = redirect_url\n        ret = flows.login.perform_password_login(request, credentials, login)\n        remember = app_settings.SESSION_REMEMBER\n        if remember is None:\n            remember = self.cleaned_data[\"remember\"]\n        if remember:\n            request.session.set_expiry(app_settings.SESSION_COOKIE_AGE)\n        else:\n            request.session.set_expiry(0)\n        return ret\n\n\nclass BaseSignupForm(base_signup_form_class()):  # type: ignore[misc]\n    username = forms.CharField(\n        label=_(\"Username\"),\n        min_length=app_settings.USERNAME_MIN_LENGTH,\n        widget=forms.TextInput(\n            attrs={\"placeholder\": _(\"Username\"), \"autocomplete\": \"username\"}\n        ),\n    )\n    email = EmailField()\n\n    def __init__(self, *args, **kwargs) -> None:\n        self._signup_fields = self._get_signup_fields(kwargs)\n        self.account_already_exists = False\n        super().__init__(*args, **kwargs)\n        username_field = self.fields[\"username\"]\n        username_field.max_length = get_username_max_length()\n        username_field.validators.append(\n            validators.MaxLengthValidator(username_field.max_length)\n        )\n        username_field.widget.attrs[\"maxlength\"] = str(username_field.max_length)\n\n        email2 = self._signup_fields.get(\"email2\")\n        if email2:\n            self.fields[\"email2\"] = EmailField(\n                label=_(\"Email (again)\"),\n                required=email2[\"required\"],\n                widget=forms.TextInput(\n                    attrs={\n                        \"type\": \"email\",\n                        \"placeholder\": _(\"Email address confirmation\"),\n                    }\n                ),\n            )\n        email = self._signup_fields.get(\"email\")\n        if email:\n            if email[\"required\"]:\n                self.fields[\"email\"].label = gettext(\"Email\")\n                self.fields[\"email\"].required = True\n            else:\n                self.fields[\"email\"].label = gettext(\"Email (optional)\")\n                self.fields[\"email\"].required = False\n                self.fields[\"email\"].widget.is_required = False\n        else:\n            del self.fields[\"email\"]\n\n        username = self._signup_fields.get(\"username\")\n        if username:\n            if username[\"required\"]:\n                self.fields[\"username\"].label = gettext(\"Username\")\n                self.fields[\"username\"].required = True\n            else:\n                self.fields[\"username\"].label = gettext(\"Username (optional)\")\n                self.fields[\"username\"].required = False\n                self.fields[\"username\"].widget.is_required = False\n        else:\n            del self.fields[\"username\"]\n\n        phone = self._signup_fields.get(\"phone\")\n        self._has_phone_field = bool(phone)\n        if phone:\n            adapter = get_adapter()\n            self.fields[\"phone\"] = adapter.phone_form_field(\n                label=_(\"Phone\"), required=phone[\"required\"]\n            )\n\n        default_field_order = list(self._signup_fields.keys())\n        set_form_field_order(\n            self, getattr(self, \"field_order\", None) or default_field_order\n        )\n\n    def _get_signup_fields(self, kwargs):\n        signup_fields = app_settings.SIGNUP_FIELDS\n        if \"email_required\" in kwargs:\n            email = signup_fields.get(\"email\")\n            if not email:\n                raise exceptions.ImproperlyConfigured(\n                    \"email required but not listed as a field\"\n                )\n            email[\"required\"] = kwargs.pop(\"email_required\")\n            email2 = signup_fields.get(\"email2\")\n            if email2:\n                email2[\"required\"] = email[\"required\"]\n        if \"username_required\" in kwargs:\n            username = signup_fields.get(\"username\")\n            if not username:\n                raise exceptions.ImproperlyConfigured(\n                    \"username required but not listed as a field\"\n                )\n            username[\"required\"] = kwargs.pop(\"username_required\")\n        return signup_fields\n\n    def clean_username(self) -> str:\n        value = self.cleaned_data[\"username\"]\n        if not value and not self._signup_fields[\"username\"][\"required\"]:\n            return value\n        value = get_adapter().clean_username(value)\n        # Note regarding preventing enumeration: if the username is already\n        # taken, but the email address is not, we would still leak information\n        # if we were to send an email to that email address stating that the\n        # username is already in use.\n        return value\n\n    def clean_email(self) -> str:\n        value = self.cleaned_data[\"email\"].lower()\n        value = get_adapter().clean_email(value)\n        if value:\n            value = self.validate_unique_email(value)\n        return value\n\n    def clean_email2(self) -> str:\n        value = self.cleaned_data[\"email2\"].lower()\n        return value\n\n    def validate_unique_email(self, value) -> str:\n        email, self.account_already_exists = flows.manage_email.email_already_exists(\n            value\n        )\n        return email\n\n    def clean(self) -> dict:\n        cleaned_data = super().clean()\n        if \"email2\" in self._signup_fields:\n            email = cleaned_data.get(\"email\")\n            email2 = cleaned_data.get(\"email2\")\n            if (email and email2) and email != email2:\n                self.add_error(\"email2\", _(\"You must type the same email each time.\"))\n\n        if \"phone\" in self._signup_fields:\n            self._clean_phone()\n        return cleaned_data\n\n    def _clean_phone(self):\n        \"\"\"Intentionally NOT `clean_phone()`:\n        - phone field is optional (depending on ACCOUNT_SIGNUP_FIELDS)\n        - we don't want to have clean_phone() mistakenly called when a project\n          is using a custom signup form with their own `phone` field.\n        \"\"\"\n        adapter = get_adapter()\n        if phone := self.cleaned_data.get(\"phone\"):\n            user = adapter.get_user_by_phone(phone)\n            if user:\n                if not app_settings.PREVENT_ENUMERATION:\n                    self.add_error(\"phone\", adapter.error_messages[\"phone_taken\"])\n                else:\n                    self.account_already_exists = True\n\n    def custom_signup(self, request, user) -> None:\n        self.signup(request, user)\n\n    def try_save(self, request):\n        \"\"\"Try and save the user. This can fail in case of a conflict on the\n        email address, in that case we will send an \"account already exists\"\n        email and return a standard \"email verification sent\" response.\n        \"\"\"\n        if self.account_already_exists:\n            # Don't create a new account, only send an email informing the user\n            # that (s)he already has one...\n            email = self.cleaned_data.get(\"email\")\n            phone = None\n            if \"phone\" in self._signup_fields:\n                phone = self.cleaned_data.get(\"phone\")\n            resp = flows.signup.prevent_enumeration(request, email=email, phone=phone)\n            user = None\n        else:\n            user = self.save(request)\n            resp = None\n        return user, resp\n\n    def save(self, request):\n        email = self.cleaned_data.get(\"email\")\n        if self.account_already_exists:\n            raise ValueError(email)\n        adapter = get_adapter()\n        user = adapter.new_user(request)\n        adapter.save_user(request, user, self)\n        self.custom_signup(request, user)\n        # TODO: Move into adapter `save_user` ?\n        setup_user_email(request, user, [EmailAddress(email=email)] if email else [])\n        return user\n\n\nclass SignupForm(BaseSignupForm):\n    def __init__(self, *args, **kwargs) -> None:\n        self.by_passkey = kwargs.pop(\"by_passkey\", False)\n        super().__init__(*args, **kwargs)\n        password1_field = self._signup_fields.get(\"password1\")\n        if not self.by_passkey and password1_field:\n            self.fields[\"password1\"] = PasswordField(\n                label=_(\"Password\"),\n                autocomplete=\"new-password\",\n                help_text=password_validation.password_validators_help_text_html(),\n                required=password1_field[\"required\"],\n            )\n            if \"password2\" in self._signup_fields:\n                self.fields[\"password2\"] = PasswordField(\n                    label=_(\"Password (again)\"),\n                    autocomplete=\"new-password\",\n                    required=password1_field[\"required\"],\n                )\n\n        if hasattr(self, \"field_order\"):\n            set_form_field_order(self, self.field_order)\n\n        honeypot_field_name = app_settings.SIGNUP_FORM_HONEYPOT_FIELD\n        if honeypot_field_name:\n            self.fields[honeypot_field_name] = forms.CharField(\n                required=False,\n                label=\"\",\n                widget=forms.TextInput(\n                    attrs={\n                        \"style\": \"position: absolute; right: -99999px;\",\n                        \"tabindex\": \"-1\",\n                        \"autocomplete\": \"nope\",\n                    }\n                ),\n            )\n\n    def try_save(self, request):\n        \"\"\"\n        override of parent class method that adds additional catching\n        of a potential bot filling out the honeypot field and returns a\n        'fake' email verification response if honeypot was filled out\n        \"\"\"\n        honeypot_field_name = app_settings.SIGNUP_FORM_HONEYPOT_FIELD\n        if honeypot_field_name:\n            if self.cleaned_data[honeypot_field_name]:\n                user = None\n                adapter = get_adapter()\n                # honeypot fields work best when you do not report to the bot\n                # that anything went wrong. So we return a fake email verification\n                # sent response but without creating a user\n                resp = adapter.respond_email_verification_sent(request, None)\n                return user, resp\n\n        return super().try_save(request)\n\n    def clean(self) -> dict:\n        super().clean()\n\n        # `password` cannot be of type `SetPasswordField`, as we don't\n        # have a `User` yet. So, let's populate a dummy user to be used\n        # for password validation.\n        User = get_user_model()\n        dummy_user = User()\n        user_username(dummy_user, self.cleaned_data.get(\"username\"))\n        user_email(dummy_user, self.cleaned_data.get(\"email\"))\n        password = self.cleaned_data.get(\"password1\")\n        if password:\n            try:\n                get_adapter().clean_password(password, user=dummy_user)\n            except forms.ValidationError as e:\n                self.add_error(\"password1\", e)\n\n        if (\n            \"password2\" in self._signup_fields\n            and \"password1\" in self.cleaned_data\n            and \"password2\" in self.cleaned_data\n        ):\n            if self.cleaned_data[\"password1\"] != self.cleaned_data[\"password2\"]:\n                self.add_error(\n                    \"password2\",\n                    _(\"You must type the same password each time.\"),\n                )\n        return self.cleaned_data\n\n\nclass UserForm(forms.Form):\n    def __init__(self, user=None, *args, **kwargs) -> None:\n        self.user = user\n        super().__init__(*args, **kwargs)\n\n\nclass AddEmailForm(UserForm):\n    email = EmailField(required=True)\n\n    def clean_email(self) -> str:\n        from allauth.account import signals\n\n        value = self.cleaned_data[\"email\"].lower()\n        adapter = get_adapter()\n        value = adapter.clean_email(value)\n        users = filter_users_by_email(value)\n        on_this_account = [u for u in users if u.pk == self.user.pk]\n        on_diff_account = [u for u in users if u.pk != self.user.pk]\n\n        if on_this_account:\n            raise adapter.validation_error(\"duplicate_email\")\n        if (\n            # Email is taken by a different account...\n            on_diff_account\n            # We care about not having duplicate emails\n            and app_settings.UNIQUE_EMAIL\n            # Enumeration prevention is turned off.\n            and (not app_settings.PREVENT_ENUMERATION)\n        ):\n            raise adapter.validation_error(\"email_taken\")\n        if not EmailAddress.objects.can_add_email(self.user):\n            raise adapter.validation_error(\n                \"max_email_addresses\", app_settings.MAX_EMAIL_ADDRESSES\n            )\n\n        signals._add_email.send(\n            sender=self.user.__class__,\n            email=value,\n            user=self.user,\n        )\n        return value\n\n    def save(self, request):\n        if app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED:\n            email_address = EmailAddress(\n                user=self.user, email=self.cleaned_data[\"email\"]\n            )\n            flows.email_verification.send_verification_email_to_address(\n                request, email_address\n            )\n            return email_address\n        elif app_settings.CHANGE_EMAIL:\n            return EmailAddress.objects.add_new_email(\n                request, self.user, self.cleaned_data[\"email\"]\n            )\n        return EmailAddress.objects.add_email(\n            request, self.user, self.cleaned_data[\"email\"], confirm=True\n        )\n\n\nclass ChangePasswordForm(PasswordVerificationMixin, UserForm):\n    oldpassword = PasswordField(\n        label=_(\"Current Password\"), autocomplete=\"current-password\"\n    )\n    password1 = SetPasswordField(label=_(\"New Password\"))\n    password2 = PasswordField(label=_(\"New Password (again)\"))\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.fields[\"password1\"].user = self.user\n\n    def clean_oldpassword(self) -> str:\n        if not self.user.check_password(self.cleaned_data.get(\"oldpassword\")):\n            raise get_adapter().validation_error(\"enter_current_password\")\n        return self.cleaned_data[\"oldpassword\"]\n\n    def save(self) -> None:\n        flows.password_change.change_password(self.user, self.cleaned_data[\"password1\"])\n\n\nclass SetPasswordForm(PasswordVerificationMixin, UserForm):\n    password1 = SetPasswordField(label=_(\"Password\"))\n    password2 = PasswordField(label=_(\"Password (again)\"))\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.fields[\"password1\"].user = self.user\n\n    def save(self) -> None:\n        flows.password_change.change_password(self.user, self.cleaned_data[\"password1\"])\n\n\nclass ResetPasswordForm(forms.Form):\n    email = EmailField(required=True)\n\n    def clean_email(self) -> str:\n        email = self.cleaned_data[\"email\"].lower()\n        email = get_adapter().clean_email(email)\n        self.users = filter_users_by_email(email, is_active=True, prefer_verified=True)\n        if not self.users and not app_settings.PREVENT_ENUMERATION:\n            raise get_adapter().validation_error(\"unknown_email\")\n        return self.cleaned_data[\"email\"]\n\n    def save(self, request, **kwargs) -> str:\n        email = self.cleaned_data[\"email\"]\n        if app_settings.PASSWORD_RESET_BY_CODE_ENABLED:\n            flows.password_reset_by_code.PasswordResetVerificationProcess.initiate(\n                request=request,\n                user=(self.users[0] if self.users else None),\n                email=email,\n            )\n        else:\n            token_generator = kwargs.get(\"token_generator\", default_token_generator)\n            flows.password_reset.request_password_reset(\n                request, email, self.users, token_generator\n            )\n        return email\n\n\nclass ResetPasswordKeyForm(PasswordVerificationMixin, forms.Form):\n    password1 = SetPasswordField(label=_(\"New Password\"))\n    password2 = PasswordField(label=_(\"New Password (again)\"))\n\n    def __init__(self, *args, **kwargs):\n        self.user = kwargs.pop(\"user\", None)\n        self.temp_key = kwargs.pop(\"temp_key\", None)\n        super().__init__(*args, **kwargs)\n        self.fields[\"password1\"].user = self.user\n\n    def save(self) -> None:\n        flows.password_reset.reset_password(self.user, self.cleaned_data[\"password1\"])\n\n\nclass UserTokenForm(forms.Form):\n    uidb36 = forms.CharField()\n    key = forms.CharField()\n\n    reset_user = None\n    token_generator = default_token_generator\n\n    def _get_user(self, uidb36):\n        User = get_user_model()\n        try:\n            pk = url_str_to_user_pk(uidb36)\n            return User.objects.get(pk=pk)\n        except (ValueError, User.DoesNotExist):\n            return None\n\n    def clean(self):\n        cleaned_data = super().clean()\n\n        uidb36 = cleaned_data.get(\"uidb36\", None)\n        key = cleaned_data.get(\"key\", None)\n        adapter = get_adapter()\n        if not key:\n            raise adapter.validation_error(\"invalid_password_reset\")\n\n        self.reset_user = self._get_user(uidb36)\n        if self.reset_user is None or not self.token_generator.check_token(\n            self.reset_user, key\n        ):\n            raise adapter.validation_error(\"invalid_password_reset\")\n\n        return cleaned_data\n\n\nclass ReauthenticateForm(forms.Form):\n    password = PasswordField(label=_(\"Password\"), autocomplete=\"current-password\")\n\n    def __init__(self, *args, **kwargs) -> None:\n        self.user = kwargs.pop(\"user\")\n        super().__init__(*args, **kwargs)\n\n    def clean_password(self) -> str:\n        password = self.cleaned_data[\"password\"]\n        if not get_adapter().reauthenticate(self.user, password):\n            raise get_adapter().validation_error(\"incorrect_password\")\n        return password\n\n\nclass RequestLoginCodeForm(forms.Form):\n    email = EmailField()\n\n    def __init__(self, *args, **kwargs) -> None:\n        super().__init__(*args, **kwargs)\n        self._has_email = LoginMethod.EMAIL in app_settings.LOGIN_METHODS\n        self._has_phone = LoginMethod.PHONE in app_settings.LOGIN_METHODS\n        if self._has_phone:\n            adapter = get_adapter()\n            self.fields[\"phone\"] = adapter.phone_form_field(\n                required=not self._has_email\n            )\n            self.fields[\"email\"].required = False\n        # Inconsistent, but kept for backwards compatibility: even if email is not a login\n        # method the email field is added. May be used when login is by username.\n        if self._has_phone and not self._has_email:\n            self.fields.pop(\"email\")\n\n    def clean(self):\n        cleaned_data = super().clean()\n        adapter = get_adapter()\n        phone = cleaned_data.get(\"phone\")\n        email = cleaned_data.get(\"email\")\n        if email and phone:\n            raise adapter.validation_error(\"select_only_one\")\n        return cleaned_data\n\n    def clean_phone(self) -> str:\n        adapter = get_adapter()\n        phone = self.cleaned_data[\"phone\"]\n        if phone:\n            self._user = adapter.get_user_by_phone(phone)\n            if not self._user and not app_settings.PREVENT_ENUMERATION:\n                raise adapter.validation_error(\"unknown_phone\")\n            if not ratelimit.consume(\n                context.request, action=\"request_login_code\", key=phone.lower()\n            ):\n                raise adapter.validation_error(\"too_many_login_attempts\")\n        return phone\n\n    def clean_email(self) -> str:\n        adapter = get_adapter()\n        email = self.cleaned_data[\"email\"]\n        if email:\n            users = filter_users_by_email(email, is_active=True, prefer_verified=True)\n            if not app_settings.PREVENT_ENUMERATION:\n                if not users:\n                    raise adapter.validation_error(\"unknown_email\")\n            if not ratelimit.consume(\n                context.request, action=\"request_login_code\", key=email.lower()\n            ):\n                raise adapter.validation_error(\"too_many_login_attempts\")\n            self._user = users[0] if users else None\n        return email\n\n\nclass BaseConfirmCodeForm(forms.Form):\n    code = forms.CharField(\n        label=_(\"Code\"),\n        widget=forms.TextInput(\n            attrs={\"placeholder\": _(\"Code\"), \"autocomplete\": \"one-time-code\"},\n        ),\n    )\n\n    def __init__(self, *args, **kwargs) -> None:\n        self.expected_code = kwargs.pop(\"code\", None)\n        super().__init__(*args, **kwargs)\n\n    def clean_code(self) -> str:\n        code = self.cleaned_data[\"code\"]\n        if not compare_user_code(actual=code, expected=self.expected_code):\n            raise get_adapter().validation_error(\"incorrect_code\")\n        return code\n\n\nclass ConfirmLoginCodeForm(BaseConfirmCodeForm):\n    pass\n\n\nclass ConfirmEmailVerificationCodeForm(BaseConfirmCodeForm):\n    def __init__(self, *args, **kwargs) -> None:\n        self.user = kwargs.pop(\"user\", None)\n        self.email = kwargs.pop(\"email\", None)\n        super().__init__(*args, **kwargs)\n\n    def clean_code(self) -> str:\n        code = super().clean_code()\n        if code:\n            # We have a valid code. But, can we actually perform the change?\n            email_already_exists(user=self.user, email=self.email, always_raise=True)\n        return code\n\n\nclass ConfirmPasswordResetCodeForm(BaseConfirmCodeForm):\n    pass\n\n\nclass VerifyPhoneForm(BaseConfirmCodeForm):\n    def __init__(self, *args, **kwargs) -> None:\n        self.user = kwargs.pop(\"user\", None)\n        self.phone = kwargs.pop(\"phone\", None)\n        super().__init__(*args, **kwargs)\n\n    def clean_code(self) -> str:\n        code = super().clean_code()\n        if code:\n            # We have a valid code. But, can we actually perform the change?\n            phone_already_exists(self.user, self.phone, always_raise=True)\n        return code\n\n\nclass ChangePhoneForm(forms.Form):\n    def __init__(self, *args, **kwargs) -> None:\n        self.user = kwargs.pop(\"user\", None)\n        self.phone = kwargs.pop(\"phone\", None)\n        super().__init__(*args, **kwargs)\n        adapter = get_adapter()\n        self.fields[\"phone\"] = adapter.phone_form_field(required=True)\n\n    def clean_phone(self) -> str:\n        phone = self.cleaned_data[\"phone\"]\n        adapter = get_adapter()\n        if phone == self.phone:\n            raise adapter.validation_error(\"same_as_current\")\n        self.account_already_exists = phone_already_exists(self.user, phone)\n        return phone\n\n\nclass ChangeEmailForm(forms.Form):\n    email = EmailField(required=True)\n\n    def __init__(self, *args, **kwargs) -> None:\n        self.email = kwargs.pop(\"email\", None)\n        super().__init__(*args, **kwargs)\n\n    def clean_email(self) -> str:\n        email = self.cleaned_data[\"email\"]\n        if email == self.email:\n            raise get_adapter().validation_error(\"same_as_current\")\n        email, self.account_already_exists = email_already_exists(email)\n        return email\n"
  },
  {
    "path": "allauth/account/internal/__init__.py",
    "content": "from allauth.account.internal import flows\n\n\n__all__ = [\"flows\"]\n"
  },
  {
    "path": "allauth/account/internal/constants.py",
    "content": "from enum import Enum\n\n\nclass LoginStageKey(str, Enum):\n    LOGIN_BY_CODE = \"login_by_code\"\n    VERIFY_EMAIL = \"verify_email\"\n    VERIFY_PHONE = \"verify_phone\"\n"
  },
  {
    "path": "allauth/account/internal/decorators.py",
    "content": "from functools import wraps\n\nfrom django.contrib.auth import decorators\nfrom django.http import HttpResponseRedirect\nfrom django.urls import reverse\nfrom django.views.decorators.cache import never_cache\n\nfrom allauth.account.stages import LoginStageController\nfrom allauth.account.utils import get_login_redirect_url\n\n\ndef _dummy_login_not_required(view_func):\n    return view_func\n\n\nlogin_not_required = getattr(\n    decorators, \"login_not_required\", _dummy_login_not_required\n)\n\n\ndef login_stage_required(stage: str, redirect_urlname: str):\n    def decorator(view_func):\n        @never_cache\n        @login_not_required\n        @wraps(view_func)\n        def _wrapper_view(request, *args, **kwargs):\n            if request.user.is_authenticated:\n                return HttpResponseRedirect(get_login_redirect_url(request))\n            login_stage = LoginStageController.enter(request, stage)\n            if not login_stage:\n                return HttpResponseRedirect(reverse(redirect_urlname))\n            request._login_stage = login_stage\n            return view_func(request, *args, **kwargs)\n\n        return _wrapper_view\n\n    return decorator\n"
  },
  {
    "path": "allauth/account/internal/emailkit.py",
    "content": "from django.core.exceptions import ValidationError\nfrom django.core.validators import validate_email\nfrom django.db.models.fields import EmailField\n\nfrom allauth.account.adapter import get_adapter\n\n\ndef valid_email_or_none(email: str | None) -> str | None:\n    ret: str | None = None\n    try:\n        if email:\n            validate_email(email)\n            max_length = EmailField().max_length\n            if max_length is None or len(email) <= max_length:\n                ret = get_adapter().clean_email(email.lower())\n    except ValidationError:\n        pass\n    return ret\n"
  },
  {
    "path": "allauth/account/internal/flows/__init__.py",
    "content": "from allauth.account.internal.flows import (\n    email_verification,\n    email_verification_by_code,\n    login,\n    login_by_code,\n    logout,\n    manage_email,\n    password_change,\n    password_reset,\n    password_reset_by_code,\n    phone_verification,\n    reauthentication,\n    signup,\n)\n\n\n__all__ = [\n    \"email_verification\",\n    \"email_verification_by_code\",\n    \"login\",\n    \"login_by_code\",\n    \"logout\",\n    \"manage_email\",\n    \"password_change\",\n    \"password_reset\",\n    \"password_reset_by_code\",\n    \"phone_verification\",\n    \"reauthentication\",\n    \"signup\",\n]\n"
  },
  {
    "path": "allauth/account/internal/flows/code_verification.py",
    "content": "import abc\nimport time\nfrom typing import Any\n\nfrom django.contrib.auth import get_user_model\n\nfrom allauth.account.internal.userkit import str_to_user_id, user_id_to_str\n\n\nclass AbstractCodeVerificationProcess(abc.ABC):\n    def __init__(\n        self,\n        max_attempts: int,\n        timeout: int,\n        state: dict,\n        user=None,\n    ) -> None:\n        self._user = user\n        self.max_attempts = max_attempts\n        self.timeout = timeout\n        self.state = state\n\n    @property\n    def user(self):\n        if self._user:\n            return self._user\n        user_id = self.state.get(\"user_id\")\n        if not user_id:\n            return None\n        user_id = str_to_user_id(user_id)\n        self._user = get_user_model().objects.filter(pk=user_id).first()\n        return self._user\n\n    @property\n    def code(self):\n        return self.state.get(\"code\", \"\")\n\n    @classmethod\n    def initial_state(cls, user, email: str | None = None, phone: str | None = None):\n        state: dict[str, Any] = {\n            \"at\": time.time(),\n            \"failed_attempts\": 0,\n            \"resend_count\": 0,\n            \"change_count\": 0,\n        }\n        if email:\n            state[\"email\"] = email\n        if phone:\n            state[\"phone\"] = phone\n        if user:\n            state[\"user_id\"] = user_id_to_str(user)\n        return state\n\n    def record_invalid_attempt(self) -> bool:\n        self.state[\"failed_attempts\"] += 1\n        if self.state[\"failed_attempts\"] >= self.max_attempts:\n            self.abort()\n            return False\n        self.persist()\n        return True\n\n    def abort_if_invalid(self):\n        if not self.is_valid():\n            self.abort()\n            return None\n        return self\n\n    def is_valid(self) -> bool:\n        return time.time() - self.state[\"at\"] <= self.timeout\n\n    @abc.abstractmethod\n    def persist(self): ...  # noqa: E704\n\n    @abc.abstractmethod\n    def send(self): ...  # noqa: E704\n\n    @abc.abstractmethod\n    def abort(self): ...  # noqa: E704\n\n    def is_resend_quota_reached(self, quota: int) -> bool:\n        return self.state[\"resend_count\"] >= quota\n\n    def is_change_quota_reached(self, quota: int) -> bool:\n        return self.state[\"change_count\"] >= quota\n\n    def record_change(\n        self, *, email: str | None = None, phone: str | None = None\n    ) -> None:\n        self.state[\"change_count\"] += 1\n        if email:\n            self.state[\"email\"] = email\n        if phone:\n            self.state[\"phone\"] = phone\n\n    def record_resend(self):\n        self.state[\"resend_count\"] += 1\n\n    @property\n    def can_resend(self) -> bool:\n        return False\n\n    @property\n    def can_change(self) -> bool:\n        return False\n"
  },
  {
    "path": "allauth/account/internal/flows/email_verification.py",
    "content": "from django.contrib import messages\nfrom django.contrib.auth.base_user import AbstractBaseUser\nfrom django.http import HttpRequest, HttpResponse\nfrom django.urls import reverse\n\nfrom allauth.account import app_settings, signals\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.internal.flows.manage_email import (\n    emit_email_changed,\n    sync_email_address,\n    sync_user_email_address,\n)\nfrom allauth.account.internal.flows.signup import send_unknown_account_mail\nfrom allauth.account.models import EmailAddress, Login\nfrom allauth.core.exceptions import ImmediateHttpResponse\nfrom allauth.core.internal import ratelimit\nfrom allauth.core.internal.httpkit import get_frontend_url\nfrom allauth.core.ratelimit import respond_429\nfrom allauth.utils import build_absolute_uri\n\n\ndef verify_email_indirectly(\n    request: HttpRequest, user: AbstractBaseUser, email: str\n) -> bool:\n    try:\n        email_address = EmailAddress.objects.get_for_user(user, email)\n    except EmailAddress.DoesNotExist:\n        return False\n    else:\n        if not email_address.verified:\n            return verify_email(request, email_address)\n        return True\n\n\ndef verify_email_and_resume(\n    request: HttpRequest, verification\n) -> tuple[EmailAddress | None, HttpResponse | None]:\n    email_address = verification.confirm(request)\n    if not email_address:\n        return None, None\n    response = login_on_verification(request, email_address)\n    return email_address, response\n\n\ndef verify_email(request: HttpRequest, email_address: EmailAddress) -> bool:\n    \"\"\"\n    Marks the email address as confirmed on the db\n    \"\"\"\n    added = not email_address.pk\n    from_email_address = (\n        EmailAddress.objects.filter(user_id=email_address.user_id)\n        .exclude(pk=email_address.pk)\n        .first()\n    )\n    if not email_address.set_verified(commit=False):\n        get_adapter(request).add_message(\n            request,\n            messages.ERROR,\n            \"account/messages/email_confirmation_failed.txt\",\n            {\"email\": email_address.email},\n        )\n        return False\n    email_address.set_as_primary(conditional=(not app_settings.CHANGE_EMAIL))\n    email_address.save()\n    if added:\n        signals.email_added.send(\n            sender=EmailAddress,\n            request=request,\n            user=request.user,\n            email_address=email_address,\n        )\n    signals.email_confirmed.send(\n        sender=EmailAddress,\n        request=request,\n        email_address=email_address,\n    )\n    if app_settings.CHANGE_EMAIL:\n        for instance in EmailAddress.objects.filter(\n            user_id=email_address.user_id\n        ).exclude(pk=email_address.pk):\n            instance.remove()\n        emit_email_changed(request, from_email_address, email_address)\n    get_adapter(request).add_message(\n        request,\n        messages.SUCCESS,\n        \"account/messages/email_confirmed.txt\",\n        {\"email\": email_address.email},\n    )\n    return True\n\n\ndef get_email_verification_url(request: HttpRequest, emailconfirmation) -> str:\n    \"\"\"Constructs the email confirmation (activation) url.\n\n    Note that if you have architected your system such that email\n    confirmations are sent outside of the request context `request`\n    can be `None` here.\n    \"\"\"\n    url = get_frontend_url(request, \"account_confirm_email\", key=emailconfirmation.key)\n    if not url:\n        url = reverse(\"account_confirm_email\", args=[emailconfirmation.key])\n        url = build_absolute_uri(request, url)\n    return url\n\n\ndef login_on_verification(request, email_address) -> HttpResponse | None:\n    \"\"\"Simply logging in the user may become a security issue. If you\n    do not take proper care (e.g. don't purge used email\n    confirmations), a malicious person that got hold of the link\n    will be able to login over and over again and the user is\n    unable to do anything about it. Even restoring their own mailbox\n    security will not help, as the links will still work. For\n    password reset this is different, this mechanism works only as\n    long as the attacker has access to the mailbox. If they no\n    longer has access they cannot issue a password request and\n    intercept it. Furthermore, all places where the links are\n    listed (log files, but even Google Analytics) all of a sudden\n    need to be secured. Purging the email confirmation once\n    confirmed changes the behavior -- users will not be able to\n    repeatedly confirm (in case they forgot that they already\n    clicked the mail).\n\n    All in all, we only login on verification when the user that is in the\n    process of signing up is present in the session to avoid all of the above.\n    This may not 100% work in case the user closes the browser (and the session\n    gets lost), but at least we're secure.\n    \"\"\"\n    from allauth.account.stages import EmailVerificationStage, LoginStageController\n\n    stage = LoginStageController.enter(request, EmailVerificationStage.key)\n    if (\n        (\n            # Logging in on email verification is disabled...\n            not app_settings.LOGIN_ON_EMAIL_CONFIRMATION\n            # (but, that is only relevant for verification-by-link)\n            and not app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED\n        )\n        or (request.user.is_authenticated)\n        or (not stage or not stage.login.user)\n        or (stage.login.user.pk != email_address.user_id)\n    ):\n        if stage:\n            stage.abort()\n        return None\n    return stage.exit()\n\n\ndef consume_email_verification_rate_limit(\n    request: HttpRequest,\n    email: str,\n    dry_run: bool = False,\n    raise_exception: bool = False,\n) -> bool:\n    return bool(\n        ratelimit.consume(\n            request,\n            config=app_settings.RATE_LIMITS,\n            action=\"confirm_email\",\n            key=email.lower(),\n            dry_run=dry_run,\n            raise_exception=raise_exception,\n            limit_get=True,\n        )\n    )\n\n\ndef handle_verification_email_rate_limit(\n    request, email: str, raise_exception: bool = False\n) -> bool:\n    \"\"\"\n    For email verification by link, it is not an issue if the user runs into rate\n    limits. The reason is that the link is session independent. Therefore, if the\n    user hits rate limits, we can just silently skip sending additional\n    verification emails, as the previous emails that were already sent still\n    contain valid links. This is different from email verification by code.  Here,\n    the session contains a specific code, meaning, silently skipping new\n    verification emails is not an option, and we must hard fail (429) instead. The\n    latter was missing, fixed.\n    \"\"\"\n    rl_ok = consume_email_verification_rate_limit(\n        request, email, raise_exception=raise_exception\n    )\n    if not rl_ok and app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED:\n        raise ImmediateHttpResponse(respond_429(request))\n    return rl_ok\n\n\ndef get_address_for_user(user: AbstractBaseUser) -> EmailAddress | None:\n    address = (\n        EmailAddress.objects.filter(user_id=user.pk)\n        .order_by(\"-primary\", \"-verified\")\n        .first()\n    )\n    if not address:\n        address = sync_user_email_address(user)\n    return address\n\n\ndef get_address_for_login(login: Login):\n    assert login.user  # nosec\n    if login.email:\n        try:\n            return EmailAddress.objects.get_for_user(login.user, login.email)\n        except EmailAddress.DoesNotExist:\n            # We do have an email, it's not stored as an EmailAddress. Might be the\n            # case that a user was setup in the admin. So, let's sync\n            # EmailAddress'es on the fly here.\n            return sync_email_address(login.user, login.email)\n    else:\n        return get_address_for_user(login.user)\n\n\ndef send_verification_email_for_user(\n    request: HttpRequest, user: AbstractBaseUser\n) -> bool:\n    \"\"\"\n    Used in the email-required-decorator.\n    \"\"\"\n    address = get_address_for_user(user)\n    if not address:\n        return False\n    return send_verification_email_to_address(request, address)\n\n\ndef send_verification_email_to_address(\n    request: HttpRequest,\n    address: EmailAddress,\n    signup: bool = False,\n    process=None,\n    skip_enumeration_mails: bool = False,\n) -> bool:\n    \"\"\"\n    Resend email verification for an existing email address.\n    \"\"\"\n    if app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED:\n        if not process:\n            from allauth.account.internal.flows.email_verification_by_code import (\n                EmailVerificationProcess,\n            )\n\n            process = EmailVerificationProcess.initiate(\n                request=request,\n                user=address.user if address.user_id else None,\n                email=address.email,\n            )\n            return process.did_send\n\n    send = handle_verification_email_rate_limit(\n        request,\n        address.email,\n    )\n    if not send:\n        return False\n\n    if not address.user_id:\n        if skip_enumeration_mails:\n            pass\n        elif signup:\n            get_adapter().send_account_already_exists_mail(address.email)\n        else:\n            send_unknown_account_mail(request, address.email)\n        confirmation = None\n    elif app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED:\n        get_adapter().send_confirmation_mail(request, process, signup=signup)\n        confirmation = process\n    else:\n        confirmation = address.send_confirmation(request, signup=signup)\n    add_email_verification_sent_message(request, address.email, signup=signup)\n    if confirmation:\n        signals.email_confirmation_sent.send(\n            sender=confirmation.__class__,\n            request=request,\n            confirmation=confirmation,\n            signup=signup,\n        )\n    return True\n\n\ndef send_verification_email_at_login(request: HttpRequest, login: Login) -> bool:\n    \"\"\"\n    At this point, it has already been confirmed that email verification\n    is needed.\n\n    Email verification mails are sent:\n    a) Explicitly: when a user signs up\n    b) Implicitly: when a user attempts to log in using an unverified\n    email while EMAIL_VERIFICATION is mandatory.\n    \"\"\"\n    if not login.user:\n        sent = send_verification_email_at_fake_login(request, login)\n    else:\n        sent = send_verification_email_at_real_login(request, login)\n    return sent\n\n\ndef send_verification_email_at_real_login(request: HttpRequest, login: Login) -> bool:\n    assert login.user  # nosec\n    address = get_address_for_login(login)\n    if not address:\n        return False\n    if address.verified:\n        return False\n    send = get_adapter().should_send_confirmation_mail(request, address, login.signup)\n    if not send:\n        return False\n    return send_verification_email_to_address(request, address, signup=login.signup)\n\n\ndef send_verification_email_at_fake_login(request: HttpRequest, login: Login) -> bool:\n    \"\"\"\n    Enumeration prevention.\n    \"\"\"\n    assert not login.user  # nosec\n    if not login.email:\n        # Odd, no user & no email implies email enumeration prevention is\n        # active, at signup, which implies we should have an email here?\n        return False\n    address = EmailAddress(user=None, email=login.email)\n    return send_verification_email_to_address(request, address, signup=True)\n\n\ndef add_email_verification_sent_message(request: HttpRequest, email: str, signup: bool):\n    get_adapter().add_message(\n        request,\n        messages.INFO,\n        \"account/messages/email_confirmation_sent.txt\",\n        {\"email\": email, \"login\": not signup, \"signup\": signup},\n    )\n\n\ndef is_verification_rate_limited(request: HttpRequest, login: Login) -> bool:\n    \"\"\"\n    Returns whether or not the email verification is *hard* rate limited.\n    Hard, meaning, it would be blocking login (verification by code, not link).\n    \"\"\"\n    if (\n        (not login.email)\n        or (not app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED)\n        or login.email_verification != app_settings.EmailVerificationMethod.MANDATORY\n    ):\n        return False\n    try:\n        email_address = EmailAddress.objects.get_for_user(login.user, login.email)\n        if not email_address.verified:\n            if not consume_email_verification_rate_limit(\n                request, login.email, dry_run=True\n            ):\n                return True\n    except EmailAddress.DoesNotExist:\n        pass\n    return False\n\n\ndef mark_email_address_as_verified(\n    request: HttpRequest, address: EmailAddress\n) -> EmailAddress | None:\n    if not address.verified:\n        confirmed = get_adapter().confirm_email(request, address)\n        if confirmed:\n            return address\n    return None\n"
  },
  {
    "path": "allauth/account/internal/flows/email_verification_by_code.py",
    "content": "from typing import Optional\n\nfrom django.utils.functional import cached_property\n\nfrom allauth.account import app_settings\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.internal.flows.code_verification import (\n    AbstractCodeVerificationProcess,\n)\nfrom allauth.account.internal.stagekit import clear_login\nfrom allauth.account.internal.userkit import did_user_login, user_email\nfrom allauth.account.models import EmailAddress\nfrom allauth.core import context\n\n\nEMAIL_VERIFICATION_CODE_SESSION_KEY = \"account_email_verification_code\"\n\n\nclass EmailVerificationProcess(AbstractCodeVerificationProcess):\n    def __init__(self, request, state: dict, user=None) -> None:\n        self.request = request\n        super().__init__(\n            state=state,\n            user=user,\n            max_attempts=app_settings.EMAIL_VERIFICATION_BY_CODE_MAX_ATTEMPTS,\n            timeout=app_settings.EMAIL_VERIFICATION_BY_CODE_TIMEOUT,\n        )\n\n    @property\n    def email(self) -> str:\n        return self.state[\"email\"]\n\n    def persist(self) -> None:\n        self.request.session[EMAIL_VERIFICATION_CODE_SESSION_KEY] = self.state\n\n    def abort(self) -> None:\n        self.request.session.pop(EMAIL_VERIFICATION_CODE_SESSION_KEY, None)\n        clear_login(self.request)\n\n    def send(self, skip_enumeration_mails: bool = False) -> None:\n        from allauth.account.internal.flows.email_verification import (\n            send_verification_email_to_address,\n        )\n\n        email_address = self.email_address\n        signup = (\n            (not did_user_login(email_address.user)) if email_address.user_id else True\n        )\n        self.did_send = send_verification_email_to_address(\n            self.request,\n            email_address,\n            signup=signup,\n            process=self,\n            skip_enumeration_mails=skip_enumeration_mails,\n        )\n\n    @cached_property\n    def email_address(self) -> EmailAddress:\n        email = self.state[\"email\"]\n        if not self.user or self.state.get(\"account_already_exists\"):\n            return EmailAddress(email=email)\n        try:\n            email_address = EmailAddress.objects.get_for_user(self.user, email)\n        except EmailAddress.DoesNotExist:\n            email_address = EmailAddress(user=self.user, email=email)\n        return email_address\n\n    def finish(self) -> EmailAddress | None:\n        from allauth.account.internal.flows.email_verification import (\n            mark_email_address_as_verified,\n        )\n\n        if not self.user or self.state.get(\"account_already_exists\"):\n            raise ValueError\n        self.request.session.pop(EMAIL_VERIFICATION_CODE_SESSION_KEY, None)\n        return mark_email_address_as_verified(self.request, self.email_address)\n\n    def generate_code(self) -> None:\n        self.state[\"code\"] = get_adapter().generate_email_verification_code()\n\n    @classmethod\n    def initiate(cls, *, request, user, email: str) -> \"EmailVerificationProcess\":\n        state = cls.initial_state(user, email)\n        process = EmailVerificationProcess(request=request, user=user, state=state)\n        process.generate_code()\n        process.send()\n        process.persist()\n        return process\n\n    @classmethod\n    def resume(cls, request) -> Optional[\"EmailVerificationProcess\"]:\n        if not app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED:\n            return None\n        state = request.session.get(EMAIL_VERIFICATION_CODE_SESSION_KEY)\n        if not state:\n            return None\n        process = EmailVerificationProcess(request=request, state=state)\n        return process.abort_if_invalid()\n\n    @property\n    def can_change(self) -> bool:\n        # TODO: Prevent enumeration flaw: if we don't have a user, we cannot\n        # change the email. To fix this, we would need to serialize\n        # the user and perform an on-the-fly signup here.\n        return (\n            not self.is_change_quota_reached(\n                app_settings.EMAIL_VERIFICATION_MAX_CHANGE_COUNT\n            )\n            and bool(self.user)\n            and not did_user_login(self.user)\n        )\n\n    def change_to(self, email: str, account_already_exists: bool) -> None:\n        self.state[\"account_already_exists\"] = account_already_exists\n        self.generate_code()\n        if account_already_exists:\n            pass\n        else:\n            EmailAddress.objects.add_new_email(\n                context.request, self.user, email, send_verification=False\n            )\n            user_email(self.user, email, commit=True)\n        self.record_change(email=email)\n        self.send()\n        self.persist()\n\n    @property\n    def can_resend(self) -> bool:\n        return not self.is_resend_quota_reached(\n            app_settings.EMAIL_VERIFICATION_MAX_RESEND_COUNT\n        )\n\n    def resend(self) -> None:\n        self.generate_code()\n        self.send(skip_enumeration_mails=True)\n        self.record_resend()\n        self.persist()\n\n    @property\n    def key(self):\n        return self.code\n"
  },
  {
    "path": "allauth/account/internal/flows/login.py",
    "content": "import time\nfrom typing import Any\n\nfrom django.core import exceptions, validators\nfrom django.http import HttpRequest, HttpResponse\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.account import app_settings\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.app_settings import LoginMethod\nfrom allauth.account.models import Login\nfrom allauth.account.signals import authentication_step_completed\nfrom allauth.core.exceptions import ImmediateHttpResponse\n\n\nAUTHENTICATION_METHODS_SESSION_KEY = \"account_authentication_methods\"\n\n\ndef record_authentication(request, user, method: str, **extra_data) -> None:\n    \"\"\"Here we keep a log of all authentication methods used within the current\n    session.  Important to note is that having entries here does not imply that\n    a user is fully signed in. For example, consider a case where a user\n    authenticates using a password, but fails to complete the 2FA challenge.\n    Or, a user successfully signs in into an inactive account or one that still\n    needs verification. In such cases, ``request.user`` is still anonymous, yet,\n    we do have an entry here.\n\n    Example data::\n\n        {'method': 'password',\n         'at': 1701423602.7184925,\n         'username': 'john.doe'}\n\n        {'method': 'socialaccount',\n         'at': 1701423567.6368647,\n         'provider': 'amazon',\n         'uid': 'amzn1.account.K2LI23KL2LK2'}\n\n        {'method': 'mfa',\n         'at': 1701423602.6392953,\n         'id': 1,\n         'type': 'totp'}\n\n    \"\"\"\n    methods = request.session.get(AUTHENTICATION_METHODS_SESSION_KEY, [])\n    data = {\n        \"method\": method,\n        \"at\": time.time(),\n    }\n    for k, v in extra_data.items():\n        if v is not None:\n            data[k] = v\n    methods.append(data)\n    request.session[AUTHENTICATION_METHODS_SESSION_KEY] = methods\n    authentication_step_completed.send(\n        sender=user.__class__, request=request, method=method, user=user, **extra_data\n    )\n\n\ndef _get_login_hook_kwargs(login: Login) -> dict[str, Any]:\n    \"\"\"\n    TODO: Just break backwards compatibility and pass only `login` to\n    `pre/post_login()`.\n    \"\"\"\n    return dict(\n        email_verification=login.email_verification,\n        redirect_url=login.redirect_url,\n        signal_kwargs=login.signal_kwargs,\n        signup=login.signup,\n        email=login.email,\n    )\n\n\ndef perform_password_login(\n    request: HttpRequest, credentials: dict[str, Any], login: Login\n) -> HttpResponse:\n    extra_data = {\n        field: credentials.get(field)\n        for field in [\"email\", \"username\"]\n        if credentials.get(field)\n    }\n    record_authentication(request, login.user, method=\"password\", **extra_data)\n    return perform_login(request, login)\n\n\ndef perform_login(request: HttpRequest, login: Login) -> HttpResponse:\n    adapter = get_adapter()\n    hook_kwargs = _get_login_hook_kwargs(login)\n    if login.user:\n        response = adapter.pre_login(request, login.user, **hook_kwargs)\n        if response:\n            return response\n    return resume_login(request, login)\n\n\ndef resume_login(request: HttpRequest, login: Login) -> HttpResponse:\n    from allauth.account.stages import LoginStageController\n\n    adapter = get_adapter()\n    ctrl = LoginStageController(request, login)\n    try:\n        response = ctrl.handle()\n        if response:\n            return response\n        adapter.login(request, login.user)\n        hook_kwargs = _get_login_hook_kwargs(login)\n        response = adapter.post_login(request, login.user, **hook_kwargs)\n        if response:\n            return response\n    except ImmediateHttpResponse as e:\n        if allauth_settings.HEADLESS_ENABLED:\n            from allauth.headless.internal.restkit.response import APIResponse\n\n            if isinstance(e.response, APIResponse):\n                raise e\n        response = e.response\n    return response\n\n\ndef is_login_rate_limited(request, login: Login) -> bool:\n    from allauth.account.internal.flows.email_verification import (\n        is_verification_rate_limited,\n    )\n\n    if is_verification_rate_limited(request, login):\n        return True\n    return False\n\n\ndef derive_login_method(login: str) -> LoginMethod:\n    if len(app_settings.LOGIN_METHODS) == 1:\n        return next(iter(app_settings.LOGIN_METHODS))\n    if LoginMethod.EMAIL in app_settings.LOGIN_METHODS:\n        try:\n            validators.validate_email(login)\n            return LoginMethod.EMAIL\n        except exceptions.ValidationError:\n            pass\n    if LoginMethod.PHONE in app_settings.LOGIN_METHODS:\n        try:\n            get_adapter().phone_form_field(required=True).clean(login)\n            return LoginMethod.PHONE\n        except exceptions.ValidationError:\n            pass\n    return LoginMethod.USERNAME\n"
  },
  {
    "path": "allauth/account/internal/flows/login_by_code.py",
    "content": "from django.contrib import messages\n\nfrom allauth.account import app_settings\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.internal.flows.code_verification import (\n    AbstractCodeVerificationProcess,\n)\nfrom allauth.account.internal.flows.email_verification import verify_email_indirectly\nfrom allauth.account.internal.flows.login import perform_login, record_authentication\nfrom allauth.account.internal.flows.phone_verification import verify_phone_indirectly\nfrom allauth.account.internal.flows.signup import send_unknown_account_mail\nfrom allauth.account.internal.stagekit import clear_login, stash_login\nfrom allauth.account.models import Login\nfrom allauth.account.stages import LoginByCodeStage, LoginStageController\n\n\nLOGIN_CODE_STATE_KEY = \"login_code\"\n\n\nclass LoginCodeVerificationProcess(AbstractCodeVerificationProcess):\n    def __init__(self, stage):\n        self.stage = stage\n        self.request = stage.request\n        super().__init__(\n            state=stage.state,\n            timeout=app_settings.LOGIN_BY_CODE_TIMEOUT,\n            max_attempts=app_settings.LOGIN_BY_CODE_MAX_ATTEMPTS,\n            user=stage.login.user,\n        )\n\n    def finish(self, redirect_url: str | None):\n        email = self.state.get(\"email\")\n        phone = self.state.get(\"phone\")\n        user = self.user\n        record_authentication(\n            self.request, user, method=\"code\", email=email, phone=phone\n        )\n        if email:\n            verify_email_indirectly(self.request, user, email)\n        if phone:\n            verify_phone_indirectly(self.request, user, phone)\n        if self.state[\"initiated_by_user\"]:\n            # Just requesting a login code does is not considered to be a real login,\n            # yet, is needed in order to make the stage machinery work. Now that we've\n            # completed the code, let's start a real login.\n            login = Login(\n                user=user,\n                redirect_url=redirect_url,\n                email=email,\n            )\n            return perform_login(self.request, login)\n        else:\n            return self.stage.exit()\n\n    def abort(self) -> None:\n        clear_login(self.request)\n\n    def persist(self) -> None:\n        stash_login(self.request, self.stage.login)\n\n    def send(self, skip_enumeration_mails: bool = False) -> None:\n        email = self.state.get(\"email\")\n        phone = self.state.get(\"phone\")\n        if email:\n            self.send_by_email(email, skip_enumeration_mails=skip_enumeration_mails)\n        elif phone:\n            self.send_by_phone(phone, skip_enumeration_mails=skip_enumeration_mails)\n        else:\n            raise ValueError()\n\n    def generate_code(self) -> str:\n        email = self.state.get(\"email\")\n        phone = self.state.get(\"phone\")\n        adapter = get_adapter()\n        if email:\n            code = adapter.generate_login_code()\n        elif phone:\n            code = adapter._generate_phone_verification_code_compat(\n                user=self.user, phone=phone\n            )\n        else:\n            raise ValueError()\n        self.state[\"code\"] = code\n        return code\n\n    def send_by_phone(self, phone: str, skip_enumeration_mails: bool = False) -> None:\n        adapter = get_adapter()\n        if self.user:\n            code = self.generate_code()\n            adapter.send_verification_code_sms(user=self.user, phone=phone, code=code)\n        elif not skip_enumeration_mails:\n            if self.stage.login.signup:\n                adapter.send_account_already_exists_sms(phone)\n            else:\n                adapter.send_unknown_account_sms(phone)\n        self.add_sent_message({\"recipient\": phone, \"phone\": phone})\n\n    def send_by_email(self, email: str, skip_enumeration_mails: bool = False) -> None:\n        adapter = get_adapter()\n        if self.user:\n            code = self.generate_code()\n            context = {\n                \"request\": self.request,\n                \"code\": code,\n            }\n            adapter.send_mail(\"account/email/login_code\", email, context)\n        elif not skip_enumeration_mails:\n            if self.stage.login.signup:\n                adapter.send_account_already_exists_mail(email)\n            else:\n                send_unknown_account_mail(self.request, email)\n        self.add_sent_message({\"email\": email, \"recipient\": email})\n\n    def add_sent_message(self, context) -> None:\n        get_adapter().add_message(\n            self.request,\n            messages.SUCCESS,\n            \"account/messages/login_code_sent.txt\",\n            context,\n        )\n\n    @classmethod\n    def initiate(\n        cls,\n        *,\n        request,\n        user,\n        email: str | None = None,\n        phone: str | None = None,\n        stage=None,\n    ):\n        initial_state = cls.initial_state(user=user, email=email, phone=phone)\n        initial_state[\"initiated_by_user\"] = stage is None\n        if not stage:\n            login = Login(user=user, email=email)\n            login.state[\"stages\"] = {\"current\": \"login_by_code\"}\n            stage = LoginByCodeStage(\n                LoginStageController(request, login), request, login\n            )\n        stage.state.update(initial_state)\n        process = LoginCodeVerificationProcess(stage=stage)\n        process.send()\n        process.persist()\n        return process\n\n    @classmethod\n    def resume(cls, stage):\n        process = LoginCodeVerificationProcess(stage=stage)\n        return process.abort_if_invalid()\n\n    @property\n    def can_resend(self) -> bool:\n        return not self.is_resend_quota_reached(\n            app_settings.LOGIN_BY_CODE_MAX_RESEND_COUNT\n        )\n\n    def resend(self) -> None:\n        self.generate_code()\n        self.send(skip_enumeration_mails=True)\n        self.record_resend()\n        self.persist()\n"
  },
  {
    "path": "allauth/account/internal/flows/logout.py",
    "content": "from django.contrib import messages\nfrom django.http import HttpRequest\n\nfrom allauth.account.internal.flows.password_reset_by_code import (\n    PASSWORD_RESET_VERIFICATION_SESSION_KEY,\n)\nfrom allauth.account.internal.stagekit import clear_login\n\n\ndef logout(request: HttpRequest, *, show_message: bool = True) -> None:\n    from allauth.account.adapter import get_adapter\n    from allauth.account.views import INTERNAL_RESET_SESSION_KEY\n\n    if request.user.is_authenticated:\n        adapter = get_adapter()\n        if show_message:\n            adapter.add_message(\n                request, messages.SUCCESS, \"account/messages/logged_out.txt\"\n            )\n        adapter.logout(request)\n    clear_login(request)\n    request.session.pop(PASSWORD_RESET_VERIFICATION_SESSION_KEY, None)\n    request.session.pop(INTERNAL_RESET_SESSION_KEY, None)\n"
  },
  {
    "path": "allauth/account/internal/flows/manage_email.py",
    "content": "from django.contrib import messages\nfrom django.contrib.auth.base_user import AbstractBaseUser\nfrom django.http import HttpRequest\n\nfrom allauth.account import app_settings, signals\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.internal.flows.reauthentication import (\n    raise_if_reauthentication_required,\n)\nfrom allauth.account.internal.userkit import user_email\nfrom allauth.account.models import EmailAddress\n\n\ndef can_delete_email(email_address: EmailAddress) -> bool:\n    adapter = get_adapter()\n    return adapter.can_delete_email(email_address)\n\n\ndef delete_email(request: HttpRequest, email_address: EmailAddress) -> bool:\n    if app_settings.REAUTHENTICATION_REQUIRED:\n        raise_if_reauthentication_required(request)\n\n    success = False\n    adapter = get_adapter()\n    if not can_delete_email(email_address):\n        adapter.add_message(\n            request,\n            messages.ERROR,\n            \"account/messages/cannot_delete_primary_email.txt\",\n            {\"email\": email_address.email},\n        )\n    else:\n        email_address.remove()\n        signals.email_removed.send(\n            sender=EmailAddress,\n            request=request,\n            user=request.user,\n            email_address=email_address,\n        )\n        adapter.add_message(\n            request,\n            messages.SUCCESS,\n            \"account/messages/email_deleted.txt\",\n            {\"email\": email_address.email},\n        )\n        adapter.send_notification_mail(\n            \"account/email/email_deleted\",\n            request.user,\n            {\"deleted_email\": email_address.email},\n        )\n        success = True\n    return success\n\n\ndef add_email(request: HttpRequest, form) -> None:\n    if app_settings.REAUTHENTICATION_REQUIRED:\n        raise_if_reauthentication_required(request)\n\n    email_address = form.save(request)\n    if email_address.pk:\n        signals.email_added.send(\n            sender=EmailAddress,\n            request=request,\n            user=request.user,\n            email_address=email_address,\n        )\n\n\ndef can_mark_as_primary(email_address: EmailAddress) -> bool:\n    if not email_address.pk:\n        return False\n    return (\n        email_address.verified\n        or not EmailAddress.objects.filter(\n            user=email_address.user, verified=True\n        ).exists()\n    )\n\n\ndef mark_as_primary(request: HttpRequest, email_address: EmailAddress) -> bool:\n    if app_settings.REAUTHENTICATION_REQUIRED:\n        raise_if_reauthentication_required(request)\n\n    # Not primary=True -- Slightly different variation, don't\n    # require verified unless moving from a verified\n    # address. Ignore constraint if previous primary email\n    # address is not verified.\n    success = False\n    if not can_mark_as_primary(email_address):\n        get_adapter().add_message(\n            request,\n            messages.ERROR,\n            \"account/messages/unverified_primary_email.txt\",\n        )\n    else:\n        assert request.user.is_authenticated  # nosec\n        from_email_address = EmailAddress.objects.filter(\n            user=request.user, primary=True\n        ).first()\n        email_address.set_as_primary()\n        adapter = get_adapter()\n        adapter.add_message(\n            request,\n            messages.SUCCESS,\n            \"account/messages/primary_email_set.txt\",\n        )\n        emit_email_changed(request, from_email_address, email_address)\n        success = True\n    return success\n\n\ndef emit_email_changed(\n    request: HttpRequest,\n    from_email_address: EmailAddress | None,\n    to_email_address: EmailAddress,\n) -> None:\n    user = to_email_address.user\n    signals.email_changed.send(\n        sender=EmailAddress,\n        request=request,\n        user=user,\n        from_email_address=from_email_address,\n        to_email_address=to_email_address,\n    )\n    if from_email_address:\n        get_adapter().send_notification_mail(\n            \"account/email/email_changed\",\n            user,\n            context={\n                \"from_email\": from_email_address.email,\n                \"to_email\": to_email_address.email,\n            },\n            email=from_email_address.email,\n        )\n\n\ndef assess_unique_email(\n    email: str, user: AbstractBaseUser | None = None\n) -> bool | None:\n    \"\"\"\n    True -- email is unique\n    False -- email is already in use\n    None -- email is in use, but we should hide that using email verification.\n    \"\"\"\n    from allauth.account.utils import filter_users_by_email\n\n    if not app_settings.UNIQUE_EMAIL:\n        return True\n\n    users_with_email = filter_users_by_email(email)\n    if user:\n        users_with_email = [u for u in users_with_email if u.pk != user.pk]\n    conflict = len(users_with_email) > 0\n    if not conflict:\n        # All good.\n        return True\n    elif not app_settings.PREVENT_ENUMERATION:\n        # Fail right away.\n        return False\n    elif (\n        app_settings.EMAIL_VERIFICATION\n        == app_settings.EmailVerificationMethod.MANDATORY\n    ):\n        # In case of mandatory verification and enumeration prevention,\n        # we can avoid creating a new account with the same (unverified)\n        # email address, because we are going to send an email anyway.\n        assert app_settings.PREVENT_ENUMERATION  # nosec\n        return None\n    elif app_settings.PREVENT_ENUMERATION == \"strict\":\n        # We're going to be strict on enumeration prevention, and allow for\n        # this email address to pass even though it already exists. In this\n        # scenario, you can signup multiple times using the same email\n        # address resulting in multiple accounts with an unverified email.\n        return True\n    else:\n        assert app_settings.PREVENT_ENUMERATION is True  # nosec\n        # Conflict. We're supposed to prevent enumeration, but we can't\n        # because that means letting the user in, while emails are required\n        # to be unique. In this case, uniqueness takes precedence over\n        # enumeration prevention.\n        return False\n\n\ndef list_email_addresses(\n    request: HttpRequest, user: AbstractBaseUser\n) -> list[EmailAddress]:\n    addresses = list(EmailAddress.objects.filter(user_id=user.pk))\n    if (\n        app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED\n        and request.user.is_authenticated\n    ):\n        from allauth.account.internal.flows.email_verification_by_code import (\n            EmailVerificationProcess,\n        )\n\n        process = EmailVerificationProcess.resume(request)\n        if process:\n            email_address = process.email_address\n            if email_address.user_id == user.pk:\n                addresses.append(email_address)\n\n    return addresses\n\n\ndef email_already_exists(\n    email: str, user: AbstractBaseUser | None = None, always_raise: bool = False\n) -> tuple[str, bool]:\n    \"\"\"\n    Throws a validation error (if allowed by enumeration prevention rules).\n    Returns a tuple of [email, already_exists].\n    \"\"\"\n    adapter = get_adapter()\n    assessment = assess_unique_email(email, user=user)\n    if assessment is True:\n        # No conflict\n        already_exists = False\n    elif assessment is False:\n        # Fail right away.\n        raise adapter.validation_error(\"email_taken\")\n    else:\n        assert assessment is None  # nosec\n        already_exists = True\n    email = adapter.validate_unique_email(email)\n    if already_exists and always_raise:\n        raise adapter.validation_error(\"email_taken\")\n    return (email, already_exists)\n\n\ndef sync_user_email_address(user: AbstractBaseUser) -> EmailAddress | None:\n    \"\"\"\n    Keep user.email in sync with user.emailaddress_set.\n\n    Under some circumstances the user.email may not have ended up as\n    an EmailAddress record, e.g. in the case of manually created admin\n    users.\n    \"\"\"\n    email = user_email(user)\n    if email:\n        return sync_email_address(user, email)\n    return None\n\n\ndef sync_email_address(user: AbstractBaseUser, email: str) -> EmailAddress | None:\n    if not EmailAddress.objects.filter(user_id=user.pk, email=email).exists():\n        # get_or_create() to gracefully handle races\n        address, _ = EmailAddress.objects.get_or_create(\n            user=user, email=email, defaults={\"primary\": False, \"verified\": False}\n        )\n    else:\n        address = None\n    return address\n"
  },
  {
    "path": "allauth/account/internal/flows/password_change.py",
    "content": "from django.contrib import messages\nfrom django.contrib.auth import update_session_auth_hash\nfrom django.contrib.auth.models import AbstractBaseUser\nfrom django.http import HttpRequest\n\nfrom allauth.account import app_settings, signals\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.internal.flows.logout import logout\n\n\ndef change_password(user: AbstractBaseUser, password: str) -> None:\n    get_adapter().set_password(user, password)\n\n\ndef finalize_password_change(request: HttpRequest, user: AbstractBaseUser) -> bool:\n    logged_out = logout_on_password_change(request, user)\n    adapter = get_adapter(request)\n    adapter.add_message(\n        request,\n        messages.SUCCESS,\n        \"account/messages/password_changed.txt\",\n    )\n    adapter.send_notification_mail(\"account/email/password_changed\", user)\n    signals.password_changed.send(\n        sender=user.__class__,\n        request=request,\n        user=user,\n    )\n    return logged_out\n\n\ndef finalize_password_set(request: HttpRequest, user: AbstractBaseUser) -> bool:\n    logged_out = logout_on_password_change(request, user)\n    adapter = get_adapter(request)\n    adapter.add_message(request, messages.SUCCESS, \"account/messages/password_set.txt\")\n    adapter.send_notification_mail(\"account/email/password_set\", user)\n    signals.password_set.send(\n        sender=user.__class__,\n        request=request,\n        user=user,\n    )\n    return logged_out\n\n\ndef logout_on_password_change(request: HttpRequest, user: AbstractBaseUser) -> bool:\n    # Since it is the default behavior of Django to invalidate all sessions on\n    # password change, this function actually has to preserve the session when\n    # logout isn't desired.\n    logged_out = True\n    if not app_settings.LOGOUT_ON_PASSWORD_CHANGE:\n        update_session_auth_hash(request, user)  # type: ignore[arg-type]\n        logged_out = False\n    else:\n        logout(request)\n    return logged_out\n"
  },
  {
    "path": "allauth/account/internal/flows/password_reset.py",
    "content": "from urllib.parse import quote\n\nfrom django.contrib import messages\nfrom django.contrib.auth.models import AbstractBaseUser\nfrom django.http import HttpRequest, HttpResponse\nfrom django.urls import reverse\n\nfrom allauth.account import app_settings, signals\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.app_settings import LoginMethod\nfrom allauth.account.internal.flows.login import perform_login, record_authentication\nfrom allauth.account.internal.flows.signup import send_unknown_account_mail\nfrom allauth.account.models import EmailAddress, Login\nfrom allauth.core.internal.httpkit import get_frontend_url\nfrom allauth.utils import build_absolute_uri\n\n\ndef reset_password(user: AbstractBaseUser, password: str) -> None:\n    get_adapter().set_password(user, password)\n\n\ndef perform_password_reset_login(\n    request: HttpRequest,\n    user: AbstractBaseUser,\n    phone: str | None = None,\n    email: str | None = None,\n) -> HttpResponse:\n    extra_data = {}\n    if phone:\n        extra_data[\"phone\"] = phone\n    elif email:\n        extra_data[\"email\"] = email\n    record_authentication(request, user, method=\"password_reset\", **extra_data)\n    login = Login(user=user, email=email)\n    return perform_login(request, login)\n\n\ndef finalize_password_reset(\n    request: HttpRequest, user: AbstractBaseUser, email: str | None = None\n) -> HttpResponse | None:\n    adapter = get_adapter()\n    if user:\n        # User successfully reset the password, clear any\n        # possible cache entries for all email addresses.\n        for address in EmailAddress.objects.filter(user_id=user.pk):\n            adapter._delete_login_attempts_cached_email(request, email=address.email)\n\n    adapter.add_message(\n        request,\n        messages.SUCCESS,\n        \"account/messages/password_changed.txt\",\n    )\n    signals.password_reset.send(\n        sender=user.__class__,\n        request=request,\n        user=user,\n    )\n    adapter.send_notification_mail(\"account/email/password_reset\", user)\n    if app_settings.LOGIN_ON_PASSWORD_RESET:\n        return perform_password_reset_login(request, user, email=email)\n    return None\n\n\ndef get_reset_password_url(request: HttpRequest) -> str:\n    url = get_frontend_url(request, \"account_reset_password\")\n    if not url:\n        url = build_absolute_uri(request, reverse(\"account_reset_password\"))\n    return url\n\n\ndef get_reset_password_from_key_url(request: HttpRequest, key: str) -> str:\n    \"\"\"\n    Method intented to be overriden in case the password reset email\n    needs to point to your frontend/SPA.\n    \"\"\"\n    url = get_frontend_url(request, \"account_reset_password_from_key\", key=key)\n    if not url:\n        # We intentionally accept an opaque `key` on the interface here, and not\n        # implementation details such as a separate `uidb36` and `key. Ideally,\n        # this should have done on `urls` level as well.\n        path = reverse(\n            \"account_reset_password_from_key\", kwargs={\"uidb36\": \"UID\", \"key\": \"KEY\"}\n        )\n        path = path.replace(\"UID-KEY\", quote(key))\n        url = build_absolute_uri(request, path)\n    return url\n\n\ndef request_password_reset(request, email: str, users, token_generator) -> None:\n    from allauth.account.utils import user_pk_to_url_str, user_username\n\n    if not users:\n        send_unknown_account_mail(request, email)\n        return\n    adapter = get_adapter()\n    for user in users:\n        temp_key = (\n            token_generator or app_settings.PASSWORD_RESET_TOKEN_GENERATOR()\n        ).make_token(user)\n\n        # send the password reset email\n        uid = user_pk_to_url_str(user)\n        # We intentionally pass an opaque `key` on the interface here, and\n        # not implementation details such as a separate `uidb36` and\n        # `key. Ideally, this should have done on `urls` level as well.\n        key = f\"{uid}-{temp_key}\"\n        url = adapter.get_reset_password_from_key_url(key)\n        context = {\n            \"user\": user,\n            \"password_reset_url\": url,\n            \"uid\": uid,\n            \"key\": temp_key,\n            \"request\": request,\n        }\n\n        if LoginMethod.USERNAME in app_settings.LOGIN_METHODS:\n            context[\"username\"] = user_username(user)\n        adapter.send_password_reset_mail(user, email, context)\n"
  },
  {
    "path": "allauth/account/internal/flows/password_reset_by_code.py",
    "content": "from typing import Optional\n\nfrom django.http import HttpRequest, HttpResponse\n\nfrom allauth.account import app_settings\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.internal.flows import password_reset\nfrom allauth.account.internal.flows.code_verification import (\n    AbstractCodeVerificationProcess,\n)\nfrom allauth.account.internal.flows.email_verification import verify_email_indirectly\nfrom allauth.account.internal.flows.signup import send_unknown_account_mail\n\n\nPASSWORD_RESET_VERIFICATION_SESSION_KEY = (\n    \"account_password_reset_verification\"  # nosec: B105\n)\n\n\nclass PasswordResetVerificationProcess(AbstractCodeVerificationProcess):\n    def __init__(self, request, state, user=None):\n        self.request = request\n        super().__init__(\n            state=state,\n            timeout=app_settings.PASSWORD_RESET_BY_CODE_TIMEOUT,\n            max_attempts=app_settings.PASSWORD_RESET_BY_CODE_MAX_ATTEMPTS,\n            user=user,\n        )\n\n    def abort(self):\n        self.request.session.pop(PASSWORD_RESET_VERIFICATION_SESSION_KEY, None)\n\n    def confirm_code(self):\n        if self.state.get(\"code_confirmed\"):\n            return\n        self.state[\"code_confirmed\"] = True\n        self.persist()\n        verify_email_indirectly(self.request, self.user, self.state[\"email\"])\n\n    def finish(self) -> HttpResponse | None:\n        self.request.session.pop(PASSWORD_RESET_VERIFICATION_SESSION_KEY, None)\n        return password_reset.finalize_password_reset(\n            self.request, self.user, email=self.state[\"email\"]\n        )\n\n    def persist(self):\n        self.request.session[PASSWORD_RESET_VERIFICATION_SESSION_KEY] = self.state\n\n    def send(self):\n        adapter = get_adapter()\n        email = self.state[\"email\"]\n        if not self.user:\n            send_unknown_account_mail(self.request, email)\n            return\n        code = adapter.generate_password_reset_code()\n        self.state[\"code\"] = code\n        context = {\n            \"request\": self.request,\n            \"code\": self.code,\n        }\n        adapter.send_mail(\"account/email/password_reset_code\", email, context)\n\n    @classmethod\n    def initiate(cls, *, request, user, email: str):\n        state = cls.initial_state(user, email)\n        process = PasswordResetVerificationProcess(request, state=state, user=user)\n        process.send()\n        process.persist()\n        return process\n\n    @classmethod\n    def resume(\n        cls, request: HttpRequest\n    ) -> Optional[\"PasswordResetVerificationProcess\"]:\n        state = request.session.get(PASSWORD_RESET_VERIFICATION_SESSION_KEY)\n        if not state:\n            return None\n        process = PasswordResetVerificationProcess(request, state=state)\n        return process.abort_if_invalid()\n"
  },
  {
    "path": "allauth/account/internal/flows/phone_verification.py",
    "content": "from typing import Optional\n\nfrom django.contrib import messages\nfrom django.http import HttpRequest\n\nfrom allauth.account import app_settings\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.internal.flows.code_verification import (\n    AbstractCodeVerificationProcess,\n)\nfrom allauth.account.internal.flows.reauthentication import (\n    raise_if_reauthentication_required,\n)\nfrom allauth.account.internal.stagekit import stash_login\nfrom allauth.account.internal.userkit import did_user_login\nfrom allauth.core import context, ratelimit\n\n\nPHONE_VERIFICATION_STATE_KEY = \"phone_verification\"\nPHONE_VERIFICATION_SESSION_KEY = \"account_phone_verification\"\n\n\ndef verify_phone_indirectly(request: HttpRequest, user, phone: str) -> None:\n    get_adapter().set_phone_verified(user, phone)\n\n\nclass PhoneVerificationProcess(AbstractCodeVerificationProcess):\n    def __init__(self, user, state):\n        super().__init__(\n            user=user,\n            state=state,\n            timeout=app_settings.PHONE_VERIFICATION_TIMEOUT,\n            max_attempts=app_settings.PHONE_VERIFICATION_MAX_ATTEMPTS,\n        )\n\n    @property\n    def phone(self) -> str:\n        return self.state[\"phone\"]\n\n    def send(self, skip_enumeration_sms: bool = False) -> None:\n        ratelimit.consume(\n            context.request,\n            action=\"verify_phone\",\n            key=self.phone,\n            raise_exception=True,\n        )\n        adapter = get_adapter()\n        if self.user:\n            code = adapter._generate_phone_verification_code_compat(\n                user=self.user,\n                phone=self.phone,\n            )\n        else:\n            code = \"\"\n        self.state[\"code\"] = code\n        self.send_sms(skip_enumeration_sms)\n        get_adapter().add_message(\n            context.request,\n            messages.INFO,\n            \"account/messages/phone_verification_sent.txt\",\n            {\"phone\": self.phone},\n        )\n        self.persist()\n\n    def send_sms(self, skip_enumeration_sms: bool) -> None:\n        adapter = get_adapter()\n        if not self.user or self.state.get(\"account_already_exists\"):\n            if not skip_enumeration_sms:\n                if self.state.get(\"account_already_exists\") or self.state.get(\"signup\"):\n                    adapter.send_account_already_exists_sms(self.phone)\n                else:\n                    adapter.send_unknown_account_sms(self.phone)\n            return\n        adapter.send_verification_code_sms(\n            user=self.user,\n            code=self.code,\n            phone=self.phone,\n        )\n\n    def finish(self) -> None:\n        phone = self.state[\"phone\"]\n        adapter = get_adapter()\n        adapter.set_phone_verified(self.user, phone)\n        adapter.add_message(\n            context.request,\n            messages.SUCCESS,\n            \"account/messages/phone_verified.txt\",\n            {\"phone\": phone},\n        )\n\n\nclass PhoneVerificationStageProcess(PhoneVerificationProcess):\n    def __init__(self, stage):\n        self.stage = stage\n        super().__init__(user=stage.login.user, state=stage.state)\n\n    def abort(self):\n        pass\n\n    def persist(self):\n        stash_login(self.stage.request, self.stage.login)\n\n    @classmethod\n    def initiate(cls, *, stage, phone: str):\n        stage.state.update(cls.initial_state(user=stage.login.user, phone=phone))\n        process = PhoneVerificationStageProcess(stage=stage)\n        process.state[\"signup\"] = stage.login.signup\n        process.send(skip_enumeration_sms=False)\n        return process\n\n    @classmethod\n    def resume(cls, stage) -> Optional[\"PhoneVerificationStageProcess\"]:\n        state = stage.state\n        if not state:\n            return None\n        process = PhoneVerificationStageProcess(stage)\n        return process.abort_if_invalid()\n\n    def change_to(self, phone: str, account_already_exists: bool) -> None:\n        self.state[\"account_already_exists\"] = account_already_exists\n        self.record_change(phone=phone)\n        adapter = get_adapter()\n        if not account_already_exists:\n            adapter.set_phone(self.user, phone, False)\n        self.send(skip_enumeration_sms=False)\n        self.persist()\n\n    def resend(self):\n        self.record_resend()\n        self.send(skip_enumeration_sms=True)\n\n    @property\n    def can_resend(self) -> bool:\n        return not self.is_resend_quota_reached(\n            app_settings.PHONE_VERIFICATION_MAX_RESEND_COUNT\n        )\n\n    @property\n    def can_change(self) -> bool:\n        # TODO: Prevent enumeration flaw: if we don't have a user, we cannot\n        # change the phone. To fix this, we would need to serialize\n        # the user and perform an on-the-fly signup here.\n        return (\n            not self.is_change_quota_reached(\n                app_settings.PHONE_VERIFICATION_MAX_CHANGE_COUNT\n            )\n            and bool(self.user)\n            and not did_user_login(self.user)\n        )\n\n\nclass ChangePhoneVerificationProcess(PhoneVerificationProcess):\n    def __init__(self, request: HttpRequest, state: dict):\n        self.request = request\n        super().__init__(\n            user=request.user,\n            state=state,\n        )\n\n    def abort(self):\n        self.request.session.pop(PHONE_VERIFICATION_SESSION_KEY, None)\n\n    def persist(self):\n        self.request.session[PHONE_VERIFICATION_SESSION_KEY] = self.state\n\n    def finish(self):\n        super().finish()\n        self.request.session.pop(PHONE_VERIFICATION_SESSION_KEY, None)\n\n    @classmethod\n    def initiate(cls, request: HttpRequest, phone: str):\n        if app_settings.REAUTHENTICATION_REQUIRED:\n            raise_if_reauthentication_required(request)\n\n        state = cls.initial_state(user=request.user, phone=phone)\n        process = ChangePhoneVerificationProcess(request, state=state)\n        process.send()\n        return process\n\n    @classmethod\n    def resume(cls, request: HttpRequest) -> Optional[\"ChangePhoneVerificationProcess\"]:\n        state = request.session.get(PHONE_VERIFICATION_SESSION_KEY)\n        if not state:\n            return None\n        process = ChangePhoneVerificationProcess(request, state=state)\n        return process.abort_if_invalid()\n\n\ndef phone_already_exists(user, phone: str, always_raise: bool = False) -> bool:\n    \"\"\"\n    Throws a validation error (if allowed by enumeration prevention rules).\n    Otherwise, returns True iff another account already exists.\n    \"\"\"\n    adapter = get_adapter()\n    other_user = adapter.get_user_by_phone(phone)\n    already_exists = other_user and (not user or user.pk != other_user.pk)\n    if already_exists and (not app_settings.PREVENT_ENUMERATION or always_raise):\n        raise adapter.validation_error(\"phone_taken\")\n    return already_exists\n"
  },
  {
    "path": "allauth/account/internal/flows/reauthentication.py",
    "content": "import time\n\nfrom django.contrib.auth import REDIRECT_FIELD_NAME\nfrom django.http import HttpRequest, HttpResponseRedirect\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.account import app_settings\nfrom allauth.account.authentication import get_authentication_records\nfrom allauth.account.internal.flows.login import record_authentication\nfrom allauth.core.exceptions import ReauthenticationRequired\nfrom allauth.core.internal.httpkit import deserialize_request, serialize_request\nfrom allauth.core.internal.urlkit import script_aware_resolve\nfrom allauth.utils import import_callable\n\n\nSTATE_SESSION_KEY = \"account_reauthentication_state\"\n\n\ndef reauthenticate_by_password(request: HttpRequest) -> None:\n    record_authentication(\n        request, request.user, method=\"password\", reauthenticated=True\n    )\n\n\ndef stash_and_reauthenticate(\n    request: HttpRequest, state: dict, callback: str\n) -> HttpResponseRedirect:\n    request.session[STATE_SESSION_KEY] = {\n        \"state\": state,\n        \"callback\": callback,\n    }\n    return HttpResponseRedirect(reverse(\"account_reauthenticate\"))\n\n\ndef suspend_request(request: HttpRequest, redirect_to: str) -> HttpResponseRedirect:\n    path = request.get_full_path()\n    if request.method == \"POST\":\n        request.session[STATE_SESSION_KEY] = {\"request\": serialize_request(request)}\n    return HttpResponseRedirect(\n        f\"{redirect_to}?{urlencode({REDIRECT_FIELD_NAME: path})}\"\n    )\n\n\ndef resume_request(request: HttpRequest) -> HttpResponseRedirect | None:\n    from allauth.account.utils import get_next_redirect_url\n\n    state = request.session.pop(STATE_SESSION_KEY, None)\n    if state and \"callback\" in state:\n        callback = import_callable(state[\"callback\"])\n        return callback(request, state[\"state\"])\n\n    url = get_next_redirect_url(request, REDIRECT_FIELD_NAME)\n    if not url:\n        return None\n    if state and \"request\" in state:\n        suspended_request = deserialize_request(state[\"request\"], request)\n        if suspended_request.path == url:\n            resolved = script_aware_resolve(suspended_request.path)\n            return resolved.func(suspended_request, *resolved.args, **resolved.kwargs)\n    return HttpResponseRedirect(url)\n\n\ndef raise_if_reauthentication_required(request: HttpRequest) -> None:\n    if not did_recently_authenticate(request):\n        raise ReauthenticationRequired()\n\n\ndef did_recently_authenticate(request: HttpRequest) -> bool:\n    if request.user.is_anonymous:\n        return False\n    if not get_reauthentication_flows(request.user):\n        # TODO: This user only has social accounts attached. Now, ideally, you\n        # would want to reauthenticate over at the social account provider. For\n        # now, this is not implemented. Although definitely suboptimal, this\n        # method is currently used for reauthentication checks over at MFA, and,\n        # users that delegate the security of their account to an external\n        # provider like Google typically use MFA over there anyway.\n        return True\n    methods = get_authentication_records(request)\n    if not methods:\n        return False\n    authenticated_at = methods[-1][\"at\"]\n    return time.time() - authenticated_at < app_settings.REAUTHENTICATION_TIMEOUT\n\n\ndef get_reauthentication_flows(user) -> list[dict]:\n    ret: list[dict] = []\n    if not user.is_authenticated:\n        return ret\n    if user.has_usable_password():\n        entry = {\n            \"id\": \"reauthenticate\",\n        }\n        ret.append(entry)\n    if allauth_settings.MFA_ENABLED:\n        from allauth.mfa.models import Authenticator\n        from allauth.mfa.utils import is_mfa_enabled\n\n        types = []\n        for typ in Authenticator.Type:\n            if is_mfa_enabled(user, types=[typ]):\n                types.append(typ)\n        if types:\n            ret.append({\"id\": \"mfa_reauthenticate\", \"types\": types})\n    return ret\n"
  },
  {
    "path": "allauth/account/internal/flows/signup.py",
    "content": "from importlib import import_module\n\nfrom django import forms\nfrom django.core import exceptions\nfrom django.http import HttpRequest, HttpResponse\nfrom django.urls import reverse\n\nfrom allauth.account import app_settings, signals\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.internal.flows.login import perform_login\nfrom allauth.account.models import Login\nfrom allauth.core import context\nfrom allauth.core.internal.httpkit import get_frontend_url\nfrom allauth.utils import build_absolute_uri\n\n\nclass DummyCustomSignupForm(forms.Form):\n    def signup(self, request, user) -> None:\n        \"\"\"\n        Invoked at signup time to complete the signup of the user.\n        \"\"\"\n        pass\n\n\ndef base_signup_form_class():\n    \"\"\"\n    Currently, we inherit from the custom form, if any. This is all\n    not very elegant, though it serves a purpose:\n\n    - There are two signup forms: one for local accounts, and one for\n      social accounts\n    - Both share a common base (BaseSignupForm)\n\n    - Given the above, how to put in a custom signup form? Which form\n      would your custom form derive from, the local or the social one?\n    \"\"\"\n    if not app_settings.SIGNUP_FORM_CLASS:\n        return DummyCustomSignupForm\n    try:\n        fc_module, fc_classname = app_settings.SIGNUP_FORM_CLASS.rsplit(\".\", 1)\n    except ValueError:\n        raise exceptions.ImproperlyConfigured(\n            f\"{app_settings.SIGNUP_FORM_CLASS} does not point to a form class\"\n        )\n    try:\n        mod = import_module(fc_module)\n    except ImportError as e:\n        raise exceptions.ImproperlyConfigured(\n            f'Error importing form class {fc_module}: \"{e}\"'\n        )\n    try:\n        fc_class = getattr(mod, fc_classname)\n    except AttributeError:\n        raise exceptions.ImproperlyConfigured(\n            f'Module \"{fc_module}\" does not define a \"{fc_classname}\" class'\n        )\n    if not hasattr(fc_class, \"signup\"):\n        raise exceptions.ImproperlyConfigured(\n            \"The custom signup form must offer\"\n            \" a `def signup(self, request, user)` method\",\n        )\n    return fc_class\n\n\ndef prevent_enumeration(\n    request: HttpRequest, email: str | None = None, phone: str | None = None\n) -> HttpResponse:\n    login = Login(user=None, email=email, phone=phone, signup=True)\n    return perform_login(context.request, login)\n\n\ndef send_unknown_account_mail(request: HttpRequest, email: str) -> None:\n    if not app_settings.EMAIL_UNKNOWN_ACCOUNTS:\n        return None\n    signup_url = get_signup_url(request)\n    context = {\n        \"request\": request,\n        \"signup_url\": signup_url,\n    }\n    get_adapter().send_mail(\"account/email/unknown_account\", email, context)\n\n\ndef get_signup_url(request: HttpRequest) -> str:\n    url = get_frontend_url(request, \"account_signup\")\n    if not url:\n        url = build_absolute_uri(request, reverse(\"account_signup\"))\n    return url\n\n\ndef complete_signup(\n    request,\n    *,\n    user,\n    email_verification=None,\n    redirect_url=None,\n    signal_kwargs=None,\n    by_passkey=False,\n):\n    if signal_kwargs is None:\n        signal_kwargs = {}\n    signals.user_signed_up.send(\n        sender=user.__class__, request=request, user=user, **signal_kwargs\n    )\n    login = Login(\n        user=user,\n        email_verification=email_verification,\n        redirect_url=redirect_url,\n        signal_kwargs=signal_kwargs,\n        signup=True,\n    )\n    if by_passkey:\n        login.state[\"passkey_signup\"] = True\n    return perform_login(request, login)\n"
  },
  {
    "path": "allauth/account/internal/stagekit.py",
    "content": "import time\n\nfrom django.http import HttpResponseRedirect\nfrom django.urls import reverse\n\nfrom allauth.account import app_settings\nfrom allauth.account.models import Login\nfrom allauth.account.stages import LoginStage, LoginStageController\n\n\nLOGIN_SESSION_KEY = \"account_login\"\n\n\ndef get_pending_stage(request) -> LoginStage | None:\n    stage = None\n    if not request.user.is_authenticated:\n        login = unstash_login(request, peek=True)\n        if login:\n            ctrl = LoginStageController(request, login)\n            stage = ctrl.get_pending_stage()\n    return stage\n\n\ndef redirect_to_pending_stage(request, stage: LoginStage):\n    if stage.urlname:\n        return HttpResponseRedirect(reverse(stage.urlname))\n    clear_login(request)\n    return HttpResponseRedirect(reverse(\"account_login\"))\n\n\ndef clear_login(request) -> None:\n    request.session.pop(LOGIN_SESSION_KEY, None)\n\n\ndef unstash_login(request, peek: bool = False):\n    login = None\n    if peek:\n        data = request.session.get(LOGIN_SESSION_KEY)\n    else:\n        data = request.session.pop(LOGIN_SESSION_KEY, None)\n    if isinstance(data, dict):\n        try:\n            login = Login.deserialize(data)\n        except ValueError:\n            pass\n        else:\n            if time.time() - login.initiated_at > app_settings.LOGIN_TIMEOUT:\n                login = None\n                clear_login(request)\n            else:\n                request._account_login_accessed = True\n    return login\n\n\ndef stash_login(request, login) -> None:\n    request.session[LOGIN_SESSION_KEY] = login.serialize()\n    request._account_login_accessed = True\n"
  },
  {
    "path": "allauth/account/internal/userkit.py",
    "content": "from django.conf import settings\nfrom django.contrib.auth import get_user_model\nfrom django.contrib.auth.models import AbstractBaseUser\nfrom django.core.exceptions import FieldDoesNotExist\nfrom django.utils.encoding import force_str\n\nfrom allauth.account import app_settings\nfrom allauth.utils import import_callable\n\n\ndef user_id_to_str(user) -> str:\n    return user._meta.pk.value_to_string(user)\n\n\ndef str_to_user_id(value: str):\n    return get_user_model()._meta.pk.to_python(value)\n\n\ndef user_field(user, field, *args, commit=False):\n    \"\"\"\n    Gets or sets (optional) user model fields. No-op if fields do not exist.\n    \"\"\"\n    if not field:\n        return\n    User = get_user_model()\n    try:\n        field_meta = User._meta.get_field(field)\n        max_length = field_meta.max_length\n    except FieldDoesNotExist:\n        if not hasattr(user, field):\n            return\n        max_length = None\n    if args:\n        # Setter\n        v = args[0]\n        if v:\n            v = v[0:max_length]\n        elif v is None and not field_meta.null:\n            v = \"\"\n        setattr(user, field, v)\n        if commit:\n            user.save(update_fields=[field])\n    else:\n        # Getter\n        return getattr(user, field)\n\n\ndef did_user_login(user: AbstractBaseUser) -> bool:\n    return user.last_login is not None\n\n\n_user_display_callable = None\n\n\ndef default_user_display(user) -> str:\n    ret = \"\"\n    if app_settings.USER_MODEL_USERNAME_FIELD:\n        ret = getattr(user, app_settings.USER_MODEL_USERNAME_FIELD)\n    return ret or force_str(user) or force_str(user._meta.verbose_name)\n\n\ndef user_display(user) -> str:\n    global _user_display_callable\n    if not _user_display_callable:\n        f = getattr(settings, \"ACCOUNT_USER_DISPLAY\", default_user_display)\n        _user_display_callable = import_callable(f)\n    return _user_display_callable(user)\n\n\ndef user_username(user, *args, commit=False):\n    if args and not app_settings.PRESERVE_USERNAME_CASING and args[0]:\n        args = [args[0].lower()]\n    return user_field(user, app_settings.USER_MODEL_USERNAME_FIELD, *args)\n\n\ndef user_email(user, *args, commit=False):\n    if args and args[0]:\n        args = [args[0].lower()]\n    ret = user_field(user, app_settings.USER_MODEL_EMAIL_FIELD, *args, commit=commit)\n    if ret:\n        ret = ret.lower()\n    return ret\n"
  },
  {
    "path": "allauth/account/management/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/account/management/commands/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/account/management/commands/account_unsetmultipleprimaryemails.py",
    "content": "from django.contrib.auth import get_user_model\nfrom django.core.management.base import BaseCommand\nfrom django.db.models import Count\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.account.utils import user_email\n\n\nclass Command(BaseCommand):\n    def handle(self, *args, **options):\n        for user in self.get_users_with_multiple_primary_email():\n            self.unprimary_extra_primary_emails(user)\n\n    def get_users_with_multiple_primary_email(self):\n        user_pks = []\n        for email_address_dict in (\n            EmailAddress.objects.filter(primary=True)\n            .values(\"user\")\n            .annotate(Count(\"user\"))\n            .filter(user__count__gt=1)\n        ):\n            user_pks.append(email_address_dict[\"user\"])\n        return get_user_model().objects.filter(pk__in=user_pks)\n\n    def unprimary_extra_primary_emails(self, user):\n        primary_email_addresses = EmailAddress.objects.filter(user=user, primary=True)\n\n        for primary_email_address in primary_email_addresses:\n            if primary_email_address.email == user_email(user):\n                break\n        else:\n            # Didn't find the main email addresses and break the for loop\n            addresses = \", \".join(\n                [email_address.email for email_address in primary_email_addresses]\n            )\n            print(\n                f\"WARNING: Multiple primary without a user.email match for user pk {user.pk}; \"\n                f\"(tried: {addresses}, using: {primary_email_address})\"\n            )\n\n        primary_email_addresses.exclude(pk=primary_email_address.pk).update(\n            primary=False\n        )\n"
  },
  {
    "path": "allauth/account/managers.py",
    "content": "from __future__ import annotations\n\nfrom datetime import timedelta\nfrom typing import TYPE_CHECKING\n\nfrom django.db import models, transaction\nfrom django.db.models import Q\nfrom django.http import HttpRequest\nfrom django.utils import timezone\n\nfrom . import app_settings\n\n\nif TYPE_CHECKING:\n    from .models import EmailAddress  # noqa: F401\n\n\nclass EmailAddressManager(models.Manager[\"EmailAddress\"]):\n    def can_add_email(self, user) -> bool:\n        ret = True\n        if app_settings.CHANGE_EMAIL:\n            #  We always allow adding an email in this case, regardless of\n            # `MAX_EMAIL_ADDRESSES`, as adding actually adds a temporary email\n            # that the user wants to change to.\n            return True\n        elif app_settings.MAX_EMAIL_ADDRESSES:\n            count = self.filter(user=user).count()\n            ret = count < app_settings.MAX_EMAIL_ADDRESSES\n        return ret\n\n    def get_new(self, user):\n        \"\"\"\n        Returns the email address the user is in the process of changing to, if any.\n        \"\"\"\n        return self.filter(user=user, verified=False).order_by(\"pk\").last()\n\n    def add_new_email(\n        self, request: HttpRequest, user, email: str, send_verification: bool = True\n    ):\n        \"\"\"\n        Adds an email address the user wishes to change to, replacing his\n        current email address once confirmed.\n        \"\"\"\n        from allauth.account.internal.flows.email_verification import (\n            send_verification_email_to_address,\n        )\n\n        with transaction.atomic():\n            instance = self.get_new(user)\n            if instance:\n                instance.remove()\n            email = email.lower()\n            instance = self.create(user=user, email=email)\n        if send_verification:\n            send_verification_email_to_address(request, instance)\n        return instance\n\n    def add_email(self, request, user, email, confirm=False, signup=False):\n        from allauth.account.internal.flows.email_verification import (\n            send_verification_email_to_address,\n        )\n\n        email = email.lower()\n        email_address, created = self.get_or_create(\n            user=user, email=email, defaults={\"email\": email}\n        )\n\n        if created and confirm:\n            send_verification_email_to_address(request, email_address)\n\n        return email_address\n\n    def get_verified(self, user):\n        return self.filter(user=user, verified=True).order_by(\"-primary\", \"pk\").first()\n\n    def get_primary(self, user):\n        try:\n            return self.get(user=user, primary=True)\n        except self.model.DoesNotExist:\n            return None\n\n    def get_primary_email(self, user) -> str | None:\n        from allauth.account.utils import user_email\n\n        primary = self.get_primary(user)\n        if primary:\n            email = primary.email\n        else:\n            email = user_email(user)\n        return email\n\n    def get_users_for(self, email):\n        # this is a list rather than a generator because we probably want to\n        # do a len() on it right away\n        return [\n            address.user for address in self.filter(verified=True, email=email.lower())\n        ]\n\n    def fill_cache_for_user(self, user, addresses) -> None:\n        \"\"\"\n        In a multi-db setup, inserting records and re-reading them later\n        on may result in not being able to find newly inserted\n        records. Therefore, we maintain a cache for the user so that\n        we can avoid database access when we need to re-read..\n        \"\"\"\n        user._emailaddress_cache = addresses\n\n    def get_for_user(self, user, email):\n        cache_key = \"_emailaddress_cache\"\n        addresses = getattr(user, cache_key, None)\n        email = email.lower()\n        if addresses is None:\n            ret = self.get(user=user, email=email.lower())\n            # To avoid additional lookups when e.g.\n            # EmailAddress.set_as_primary() starts touching self.user\n            ret.user = user\n            return ret\n        else:\n            for address in addresses:\n                if address.email == email:\n                    return address\n            raise self.model.DoesNotExist()\n\n    def is_verified(self, email: str) -> bool:\n        return self.filter(email=email.lower(), verified=True).exists()\n\n    def lookup(self, emails):\n        return self.filter(email__in=[e.lower() for e in emails])\n\n\nclass EmailConfirmationManager(models.Manager):\n    def all_expired(self):\n        return self.filter(self.expired_q())\n\n    def all_valid(self):\n        return self.exclude(self.expired_q()).filter(email_address__verified=False)\n\n    def expired_q(self):\n        sent_threshold = timezone.now() - timedelta(\n            days=app_settings.EMAIL_CONFIRMATION_EXPIRE_DAYS\n        )\n        return Q(sent__lt=sent_threshold)\n\n    def delete_expired_confirmations(self) -> None:\n        self.all_expired().delete()\n"
  },
  {
    "path": "allauth/account/middleware.py",
    "content": "import os\nfrom http import HTTPStatus\nfrom types import SimpleNamespace\n\nfrom django.http import HttpResponseRedirect\nfrom django.urls import NoReverseMatch, reverse\nfrom django.utils.decorators import sync_and_async_middleware\n\nfrom asgiref.sync import iscoroutinefunction, sync_to_async\n\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.internal import flows\nfrom allauth.core import context\nfrom allauth.core.exceptions import ImmediateHttpResponse, ReauthenticationRequired\n\n\n@sync_and_async_middleware\ndef AccountMiddleware(get_response):\n    if iscoroutinefunction(get_response):\n\n        async def middleware(request):\n            request.allauth = SimpleNamespace()\n            with context.request_context(request):\n                response = await get_response(request)\n                if _should_redirect_accounts(request, response):\n                    response = await _aredirect_accounts(request)\n                return response\n\n    else:\n\n        def middleware(request):\n            request.allauth = SimpleNamespace()\n            with context.request_context(request):\n                response = get_response(request)\n                if _should_redirect_accounts(request, response):\n                    response = _redirect_accounts(request)\n                return response\n\n    def process_exception(request, exception):\n        if isinstance(exception, ImmediateHttpResponse):\n            return exception.response\n        elif isinstance(exception, ReauthenticationRequired):\n            redirect_url = reverse(\"account_login\")\n            methods = get_adapter().get_reauthentication_methods(request.user)\n            if methods:\n                redirect_url = methods[0][\"url\"]\n            return flows.reauthentication.suspend_request(request, redirect_url)\n\n    middleware.process_exception = process_exception\n    return middleware\n\n\ndef _should_redirect_accounts(request, response) -> bool:\n    \"\"\"\n    URLs should be hackable. Yet, assuming allauth is included like this...\n\n        path(\"accounts/\", include(\"allauth.urls\")),\n\n    ... and a user would attempt to navigate to /accounts/, a 404 would be\n    presented. This code catches that 404, and redirects to either the email\n    management overview or the login page, depending on whether or not the user\n    is authenticated.\n    \"\"\"\n    if response.status_code != HTTPStatus.NOT_FOUND:\n        return False\n    try:\n        login_path = reverse(\"account_login\")\n        email_path = reverse(\"account_email\")\n    except NoReverseMatch:\n        # Project might have deviated URLs, let's keep out of the way.\n        return False\n    prefix = os.path.commonprefix([login_path, email_path])\n    if len(prefix) <= 1 or prefix != request.path:\n        return False\n    # If we have a prefix that is not just '/', and that is what our request is\n    # pointing to, redirect.\n    return True\n\n\n@sync_to_async\ndef _async_get_user(request):\n    return request.user\n\n\nasync def _aredirect_accounts(request) -> HttpResponseRedirect:\n    email_path = reverse(\"account_email\")\n    login_path = reverse(\"account_login\")\n    if hasattr(request, \"auser\"):\n        user = await request.auser()\n    else:\n        # Django <5\n        user = await _async_get_user(request)\n    return HttpResponseRedirect(email_path if user.is_authenticated else login_path)\n\n\ndef _redirect_accounts(request) -> HttpResponseRedirect:\n    email_path = reverse(\"account_email\")\n    login_path = reverse(\"account_login\")\n    user = request.user\n    return HttpResponseRedirect(email_path if user.is_authenticated else login_path)\n"
  },
  {
    "path": "allauth/account/migrations/0001_initial.py",
    "content": "import django.utils.timezone\nfrom django.conf import settings\nfrom django.db import migrations, models\n\n\nUNIQUE_EMAIL = getattr(settings, \"ACCOUNT_UNIQUE_EMAIL\", True)\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        migrations.swappable_dependency(settings.AUTH_USER_MODEL),\n    ]\n\n    operations = [\n        migrations.CreateModel(\n            name=\"EmailAddress\",\n            fields=[\n                (\n                    \"id\",\n                    models.AutoField(\n                        verbose_name=\"ID\",\n                        serialize=False,\n                        auto_created=True,\n                        primary_key=True,\n                    ),\n                ),\n                (\n                    \"email\",\n                    models.EmailField(\n                        unique=UNIQUE_EMAIL,\n                        max_length=75,\n                        verbose_name=\"email address\",\n                    ),\n                ),\n                (\n                    \"verified\",\n                    models.BooleanField(default=False, verbose_name=\"verified\"),\n                ),\n                (\n                    \"primary\",\n                    models.BooleanField(default=False, verbose_name=\"primary\"),\n                ),\n                (\n                    \"user\",\n                    models.ForeignKey(\n                        verbose_name=\"user\",\n                        to=settings.AUTH_USER_MODEL,\n                        on_delete=models.CASCADE,\n                    ),\n                ),\n            ],\n            options={\n                \"verbose_name\": \"email address\",\n                \"verbose_name_plural\": \"email addresses\",\n            },\n            bases=(models.Model,),\n        ),\n        migrations.CreateModel(\n            name=\"EmailConfirmation\",\n            fields=[\n                (\n                    \"id\",\n                    models.AutoField(\n                        verbose_name=\"ID\",\n                        serialize=False,\n                        auto_created=True,\n                        primary_key=True,\n                    ),\n                ),\n                (\n                    \"created\",\n                    models.DateTimeField(\n                        default=django.utils.timezone.now,\n                        verbose_name=\"created\",\n                    ),\n                ),\n                (\"sent\", models.DateTimeField(null=True, verbose_name=\"sent\")),\n                (\n                    \"key\",\n                    models.CharField(unique=True, max_length=64, verbose_name=\"key\"),\n                ),\n                (\n                    \"email_address\",\n                    models.ForeignKey(\n                        verbose_name=\"email address\",\n                        to=\"account.EmailAddress\",\n                        on_delete=models.CASCADE,\n                    ),\n                ),\n            ],\n            options={\n                \"verbose_name\": \"email confirmation\",\n                \"verbose_name_plural\": \"email confirmations\",\n            },\n            bases=(models.Model,),\n        ),\n    ]\n\n    if not UNIQUE_EMAIL:\n        operations += [\n            migrations.AlterUniqueTogether(\n                name=\"emailaddress\",\n                unique_together={(\"user\", \"email\")},\n            ),\n        ]\n"
  },
  {
    "path": "allauth/account/migrations/0002_email_max_length.py",
    "content": "from django.conf import settings\nfrom django.db import migrations, models\n\n\nUNIQUE_EMAIL = getattr(settings, \"ACCOUNT_UNIQUE_EMAIL\", True)\nEMAIL_MAX_LENGTH = getattr(settings, \"ACCOUNT_EMAIL_MAX_LENGTH\", 254)\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        (\"account\", \"0001_initial\"),\n    ]\n\n    operations = [\n        migrations.AlterField(\n            model_name=\"emailaddress\",\n            name=\"email\",\n            field=models.EmailField(\n                unique=UNIQUE_EMAIL,\n                max_length=EMAIL_MAX_LENGTH,\n                verbose_name=\"email address\",\n            ),\n        ),\n    ]\n\n    if not UNIQUE_EMAIL:\n        operations += [\n            migrations.AlterUniqueTogether(\n                name=\"emailaddress\",\n                unique_together={(\"user\", \"email\")},\n            ),\n        ]\n"
  },
  {
    "path": "allauth/account/migrations/0003_alter_emailaddress_create_unique_verified_email.py",
    "content": "# Generated by Django 4.2.2 on 2023-06-14 12:52\n\nfrom django.conf import settings\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        migrations.swappable_dependency(settings.AUTH_USER_MODEL),\n        (\"account\", \"0002_email_max_length\"),\n    ]\n\n    operations = (\n        [\n            migrations.AlterUniqueTogether(\n                name=\"emailaddress\",\n                unique_together={(\"user\", \"email\")},\n            ),\n            migrations.AddConstraint(\n                model_name=\"emailaddress\",\n                constraint=models.UniqueConstraint(\n                    condition=models.Q((\"verified\", True)),\n                    fields=[\"email\"],\n                    name=\"unique_verified_email\",\n                ),\n            ),\n        ]\n        if getattr(settings, \"ACCOUNT_UNIQUE_EMAIL\", True)\n        else []\n    )\n"
  },
  {
    "path": "allauth/account/migrations/0004_alter_emailaddress_drop_unique_email.py",
    "content": "from django.conf import settings\nfrom django.db import migrations, models\n\n\nEMAIL_MAX_LENGTH = getattr(settings, \"ACCOUNT_EMAIL_MAX_LENGTH\", 254)\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        (\"account\", \"0003_alter_emailaddress_create_unique_verified_email\"),\n    ]\n\n    operations = [\n        migrations.AlterField(\n            model_name=\"emailaddress\",\n            name=\"email\",\n            field=models.EmailField(\n                max_length=EMAIL_MAX_LENGTH, verbose_name=\"email address\"\n            ),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/account/migrations/0005_emailaddress_idx_upper_email.py",
    "content": "# Generated by Django 4.2.4 on 2023-08-23 18:17\n\nimport django.db.models.functions.text\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        (\"account\", \"0004_alter_emailaddress_drop_unique_email\"),\n    ]\n\n    operations = [\n        migrations.AddIndex(\n            model_name=\"emailaddress\",\n            index=models.Index(\n                django.db.models.functions.text.Upper(\"email\"),\n                name=\"account_emailaddress_upper\",\n            ),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/account/migrations/0006_emailaddress_lower.py",
    "content": "from django.conf import settings\nfrom django.db import migrations\nfrom django.db.models.functions import Lower\n\nfrom allauth.account import app_settings\n\n\ndef forwards(apps, schema_editor):\n    EmailAddress = apps.get_model(\"account.EmailAddress\")\n    User = apps.get_model(settings.AUTH_USER_MODEL)\n    EmailAddress.objects.all().exclude(email=Lower(\"email\")).update(\n        email=Lower(\"email\")\n    )\n    email_field = app_settings.USER_MODEL_EMAIL_FIELD\n    if email_field:\n        User.objects.all().exclude(**{email_field: Lower(email_field)}).update(\n            **{email_field: Lower(email_field)}\n        )\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        (\"account\", \"0005_emailaddress_idx_upper_email\"),\n    ]\n\n    operations = [migrations.RunPython(forwards, migrations.RunPython.noop)]\n"
  },
  {
    "path": "allauth/account/migrations/0007_emailaddress_idx_email.py",
    "content": "from django.conf import settings\nfrom django.db import migrations, models\n\n\nEMAIL_MAX_LENGTH = getattr(settings, \"ACCOUNT_EMAIL_MAX_LENGTH\", 254)\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        (\"account\", \"0006_emailaddress_lower\"),\n    ]\n\n    operations = [\n        migrations.RemoveIndex(\n            model_name=\"emailaddress\",\n            name=\"account_emailaddress_upper\",\n        ),\n        migrations.AlterField(\n            model_name=\"emailaddress\",\n            name=\"email\",\n            field=models.EmailField(\n                db_index=True, max_length=EMAIL_MAX_LENGTH, verbose_name=\"email address\"\n            ),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/account/migrations/0008_emailaddress_unique_primary_email_fixup.py",
    "content": "from django.conf import settings\nfrom django.db import migrations\nfrom django.db.models import Count\n\n\ndef forwards(apps, schema_editor):\n    EmailAddress = apps.get_model(\"account.EmailAddress\")\n    User = apps.get_model(settings.AUTH_USER_MODEL)\n    user_email_field = getattr(settings, \"ACCOUNT_USER_MODEL_EMAIL_FIELD\", \"email\")\n\n    def get_users_with_multiple_primary_email():\n        user_pks = []\n        for email_address_dict in (\n            EmailAddress.objects.filter(primary=True)\n            .values(\"user\")\n            .annotate(Count(\"user\"))\n            .filter(user__count__gt=1)\n        ):\n            user_pks.append(email_address_dict[\"user\"])\n        return User.objects.filter(pk__in=user_pks)\n\n    def unset_extra_primary_emails(user):\n        qs = EmailAddress.objects.filter(user=user, primary=True)\n        primary_email_addresses = list(qs)\n        if not primary_email_addresses:\n            return\n        primary_email_address = primary_email_addresses[0]\n        if user_email_field:\n            for address in primary_email_addresses:\n                if address.email.lower() == getattr(user, user_email_field, \"\").lower():\n                    primary_email_address = address\n                    break\n        qs.exclude(pk=primary_email_address.pk).update(primary=False)\n\n    for user in get_users_with_multiple_primary_email().iterator(2000):\n        unset_extra_primary_emails(user)\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        (\"account\", \"0007_emailaddress_idx_email\"),\n    ]\n\n    operations = [\n        migrations.RunPython(code=forwards, reverse_code=migrations.RunPython.noop)\n    ]\n"
  },
  {
    "path": "allauth/account/migrations/0009_emailaddress_unique_primary_email.py",
    "content": "# Generated by Django 4.2.11 on 2024-05-09 06:09\n\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        (\"account\", \"0008_emailaddress_unique_primary_email_fixup\"),\n    ]\n\n    operations = [\n        migrations.AddConstraint(\n            model_name=\"emailaddress\",\n            constraint=models.UniqueConstraint(\n                condition=models.Q((\"primary\", True)),\n                fields=(\"user\", \"primary\"),\n                name=\"unique_primary_email\",\n            ),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/account/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/account/mixins.py",
    "content": "from django.contrib.auth import REDIRECT_FIELD_NAME\nfrom django.core.exceptions import ImproperlyConfigured\nfrom django.http import HttpResponsePermanentRedirect, HttpResponseRedirect\nfrom django.utils.decorators import method_decorator\nfrom django.utils.html import format_html\nfrom django.views.decorators.cache import never_cache\n\nfrom allauth.account import app_settings\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.internal import flows\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.account.internal.stagekit import (\n    get_pending_stage,\n    redirect_to_pending_stage,\n)\nfrom allauth.account.utils import (\n    get_login_redirect_url,\n    get_next_redirect_url,\n    passthrough_next_redirect_url,\n)\nfrom allauth.core.exceptions import ImmediateHttpResponse\nfrom allauth.utils import get_request_param\n\n\ndef _ajax_response(request, response, form=None, data=None):\n    adapter = get_adapter()\n    if adapter.is_ajax(request):\n        if isinstance(response, HttpResponseRedirect) or isinstance(\n            response, HttpResponsePermanentRedirect\n        ):\n            redirect_to = response[\"Location\"]\n        else:\n            redirect_to = None\n        response = adapter.ajax_response(\n            request, response, form=form, data=data, redirect_to=redirect_to\n        )\n    return response\n\n\nclass RedirectAuthenticatedUserMixin:\n    @method_decorator(login_not_required)\n    @method_decorator(never_cache)\n    def dispatch(self, request, *args, **kwargs):\n        if app_settings.AUTHENTICATED_LOGIN_REDIRECTS:\n            if request.user.is_authenticated:\n                redirect_to = self.get_authenticated_redirect_url()\n                response = HttpResponseRedirect(redirect_to)\n                return _ajax_response(request, response)\n            else:\n                stage = get_pending_stage(request)\n                if stage and stage.is_resumable(request):\n                    return redirect_to_pending_stage(request, stage)\n        response = super().dispatch(request, *args, **kwargs)\n        return response\n\n    def get_authenticated_redirect_url(self):\n        redirect_field_name = self.redirect_field_name\n        return get_login_redirect_url(\n            self.request,\n            url=self.get_success_url(),\n            redirect_field_name=redirect_field_name,\n        )\n\n\nclass LogoutFunctionalityMixin:\n    def logout(self):\n        flows.logout.logout(self.request)\n\n\nclass AjaxCapableProcessFormViewMixin:\n    def get(self, request, *args, **kwargs):\n        response = super().get(request, *args, **kwargs)\n        form = self.get_form()\n        return _ajax_response(\n            self.request, response, form=form, data=self._get_ajax_data_if()\n        )\n\n    def post(self, request, *args, **kwargs):\n        form_class = self.get_form_class()\n        form = self.get_form(form_class)\n        if form.is_valid():\n            response = self.form_valid(form)\n        else:\n            response = self.form_invalid(form)\n        return _ajax_response(\n            self.request, response, form=form, data=self._get_ajax_data_if()\n        )\n\n    def get_form(self, form_class=None):\n        form = getattr(self, \"_cached_form\", None)\n        if form is None:\n            form = super().get_form(form_class)\n            self._cached_form = form\n        return form\n\n    def _get_ajax_data_if(self):\n        return (\n            self.get_ajax_data()\n            if get_adapter(self.request).is_ajax(self.request)\n            else None\n        )\n\n    def get_ajax_data(self):\n        return None\n\n\nclass CloseableSignupMixin:\n    template_name_signup_closed = (\n        f\"account/signup_closed.{app_settings.TEMPLATE_EXTENSION}\"\n    )\n\n    def dispatch(self, request, *args, **kwargs):\n        try:\n            if not self.is_open():\n                return self.closed()\n        except ImmediateHttpResponse as e:\n            return e.response\n        return super().dispatch(request, *args, **kwargs)\n\n    def is_open(self):\n        return get_adapter(self.request).is_open_for_signup(self.request)\n\n    def closed(self):\n        response_kwargs = {\n            \"request\": self.request,\n            \"template\": self.template_name_signup_closed,\n        }\n        return self.response_class(**response_kwargs)\n\n\nclass NextRedirectMixin:\n    redirect_field_name = REDIRECT_FIELD_NAME\n\n    def get_context_data(self, **kwargs):\n        ret = super().get_context_data(**kwargs)\n        redirect_field_value = get_request_param(self.request, self.redirect_field_name)\n        ret.update(\n            {\n                \"redirect_field_name\": self.redirect_field_name,\n                \"redirect_field_value\": redirect_field_value,\n                \"redirect_field\": (\n                    format_html(\n                        '<input type=\"hidden\" name=\"{}\" value=\"{}\">',\n                        self.redirect_field_name,\n                        redirect_field_value,\n                    )\n                    if redirect_field_value\n                    else \"\"\n                ),\n            }\n        )\n        return ret\n\n    def get_success_url(self):\n        \"\"\"\n        We're in a mixin, so we cannot rely on the fact that our super() has a get_success_url.\n        Also, we want to check for -- in this order:\n        1) The `?next=/foo`\n        2) The `get_succes_url()` if available.\n        3) The `.success_url` if available.\n        4) A fallback default success URL: `get_default_success_url()`.\n        \"\"\"\n        url = self.get_next_url()\n        if url:\n            return url\n\n        if not url:\n            if hasattr(super(), \"get_success_url\"):\n                try:\n                    url = super().get_success_url()\n                except ImproperlyConfigured:\n                    # Django's default get_success_url() checks self.succes_url,\n                    # and throws this if that is not set. Yet, in our case, we\n                    # want to fallback to the default.\n                    pass\n            elif hasattr(self, \"success_url\"):\n                url = self.success_url\n                if url:\n                    url = str(url)  # reverse_lazy\n        if not url:\n            url = self.get_default_success_url()\n        return url\n\n    def get_default_success_url(self):\n        return None\n\n    def get_next_url(self):\n        return get_next_redirect_url(self.request, self.redirect_field_name)\n\n    def passthrough_next_url(self, url):\n        return passthrough_next_redirect_url(\n            self.request, url, self.redirect_field_name\n        )\n"
  },
  {
    "path": "allauth/account/models.py",
    "content": "from __future__ import annotations\n\nimport datetime\nimport time\nfrom typing import TYPE_CHECKING, Any, TypedDict\n\nfrom django.conf import settings\nfrom django.contrib.auth import get_user_model\nfrom django.contrib.auth.models import AbstractBaseUser\nfrom django.core import signing\nfrom django.db import models\nfrom django.db.models import Q\nfrom django.db.models.constraints import UniqueConstraint\nfrom django.utils import timezone\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth.account import app_settings\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.managers import EmailAddressManager, EmailConfirmationManager\n\n\nif TYPE_CHECKING:\n    from django.http import HttpRequest\n\n\nclass EmailAddress(models.Model):\n    user = models.ForeignKey(\n        settings.AUTH_USER_MODEL,\n        verbose_name=_(\"user\"),\n        on_delete=models.CASCADE,\n    )\n    email = models.EmailField(\n        db_index=True,\n        max_length=app_settings.EMAIL_MAX_LENGTH,\n        verbose_name=_(\"email address\"),\n    )\n    verified = models.BooleanField(verbose_name=_(\"verified\"), default=False)\n    primary = models.BooleanField(verbose_name=_(\"primary\"), default=False)\n\n    objects = EmailAddressManager()\n\n    class Meta:\n        verbose_name = _(\"email address\")\n        verbose_name_plural = _(\"email addresses\")\n        unique_together = [(\"user\", \"email\")]\n        constraints = [\n            UniqueConstraint(\n                fields=[\"user\", \"primary\"],\n                name=\"unique_primary_email\",\n                condition=Q(primary=True),\n            )\n        ]\n        if app_settings.UNIQUE_EMAIL:\n            constraints.append(\n                UniqueConstraint(\n                    fields=[\"email\"],\n                    name=\"unique_verified_email\",\n                    condition=Q(verified=True),\n                )\n            )\n\n    def __str__(self) -> str:\n        return self.email\n\n    def clean(self) -> None:\n        super().clean()\n        self.email = self.email.lower()\n\n    def can_set_verified(self) -> bool:\n        if self.verified:\n            return True\n        conflict = False\n        if app_settings.UNIQUE_EMAIL:\n            conflict = (\n                EmailAddress.objects.exclude(pk=self.pk)\n                .filter(verified=True, email=self.email)\n                .exists()\n            )\n        return not conflict\n\n    def set_verified(self, commit: bool = True) -> bool:\n        if self.verified:\n            return True\n        if self.can_set_verified():\n            self.verified = True\n            if commit:\n                self.save(update_fields=[\"verified\"])\n        return self.verified\n\n    def set_as_primary(self, conditional: bool = False) -> bool:\n        \"\"\"Marks the email address as primary. In case of `conditional`, it is\n        only marked as primary if there is no other primary email address set.\n        \"\"\"\n        from allauth.account.utils import user_email\n\n        old_primary = EmailAddress.objects.get_primary(self.user)\n        if old_primary:\n            if conditional:\n                return False\n            old_primary.primary = False\n            old_primary.save()\n        self.primary = True\n        self.save()\n        user_email(self.user, self.email, commit=True)\n        return True\n\n    def send_confirmation(\n        self, request: HttpRequest | None = None, signup: bool = False\n    ) -> EmailConfirmation | EmailConfirmationHMAC:\n        model = get_emailconfirmation_model()\n        confirmation = model.create(self)\n        confirmation.send(request, signup=signup)\n        return confirmation\n\n    def remove(self) -> None:\n        from allauth.account.utils import user_email\n\n        self.delete()\n        if user_email(self.user) == self.email:\n            alt = (\n                EmailAddress.objects.filter(user=self.user)\n                .order_by(\"-verified\")\n                .first()\n            )\n            alt_email = \"\"\n            if alt:\n                alt_email = alt.email\n            user_email(self.user, alt_email, commit=True)\n\n\nclass EmailConfirmationMixin:\n    def confirm(self, request: HttpRequest) -> EmailAddress | None:\n        from allauth.account.internal.flows.email_verification import (\n            mark_email_address_as_verified,\n        )\n\n        email_address = self.email_address  # type: ignore[attr-defined]\n        return mark_email_address_as_verified(request, email_address)\n\n    def send(self, request: HttpRequest | None = None, signup: bool = False) -> None:\n        get_adapter().send_confirmation_mail(request, self, signup)\n\n\nclass EmailConfirmation(EmailConfirmationMixin, models.Model):\n    email_address = models.ForeignKey(\n        EmailAddress,\n        verbose_name=_(\"email address\"),\n        on_delete=models.CASCADE,\n    )\n    created = models.DateTimeField(verbose_name=_(\"created\"), default=timezone.now)\n    sent = models.DateTimeField(verbose_name=_(\"sent\"), null=True)\n    key = models.CharField(verbose_name=_(\"key\"), max_length=64, unique=True)\n\n    objects = EmailConfirmationManager()\n\n    class Meta:\n        verbose_name = _(\"email confirmation\")\n        verbose_name_plural = _(\"email confirmations\")\n\n    def __str__(self) -> str:\n        return f\"confirmation for {self.email_address}\"\n\n    @classmethod\n    def create(cls, email_address: EmailAddress) -> EmailConfirmation:\n        key = get_adapter().generate_emailconfirmation_key(email_address.email)\n        return cls._default_manager.create(email_address=email_address, key=key)\n\n    @classmethod\n    def from_key(cls, key: str) -> EmailConfirmation | None:\n        qs = EmailConfirmation.objects.all_valid()\n        qs = qs.select_related(\"email_address__user\")\n        emailconfirmation = qs.filter(key=key.lower()).first()\n        return emailconfirmation\n\n    def key_expired(self) -> bool:\n        assert self.sent is not None  # nosec[assert_used]\n        expiration_date = self.sent + datetime.timedelta(\n            days=app_settings.EMAIL_CONFIRMATION_EXPIRE_DAYS\n        )\n        return expiration_date <= timezone.now()\n\n    key_expired.boolean = True  # type: ignore[attr-defined]\n\n    def confirm(self, request: HttpRequest) -> EmailAddress | None:\n        if not self.key_expired():\n            return super().confirm(request)\n        return None\n\n    def send(self, request: HttpRequest | None = None, signup: bool = False) -> None:\n        super().send(request=request, signup=signup)\n        self.sent = timezone.now()\n        self.save()\n\n\nclass EmailConfirmationHMAC(EmailConfirmationMixin):\n    def __init__(self, email_address: EmailAddress) -> None:\n        self.email_address = email_address\n\n    @classmethod\n    def create(cls, email_address: EmailAddress) -> EmailConfirmationHMAC:\n        return EmailConfirmationHMAC(email_address)\n\n    @property\n    def key(self) -> str:\n        return signing.dumps(obj=self.email_address.pk, salt=app_settings.SALT)\n\n    @classmethod\n    def from_key(cls, key: str) -> EmailConfirmationHMAC | None:\n        try:\n            max_age = 60 * 60 * 24 * app_settings.EMAIL_CONFIRMATION_EXPIRE_DAYS\n            pk = signing.loads(key, max_age=max_age, salt=app_settings.SALT)\n            ret = EmailConfirmationHMAC(EmailAddress.objects.get(pk=pk, verified=False))\n        except (\n            signing.SignatureExpired,\n            signing.BadSignature,\n            EmailAddress.DoesNotExist,\n        ):\n            ret = None\n        return ret\n\n    def key_expired(self) -> bool:\n        return False\n\n\nclass _SerializedLogin(TypedDict):\n    user_pk: str | None\n    email_verification: app_settings.EmailVerificationMethod\n    signup: bool\n    redirect_url: str | None\n    email: str | None\n    phone: str | None\n    signal_kwargs: dict[str, Any] | None\n    state: dict[str, Any]\n    initiated_at: float\n\n\nclass Login:\n    \"\"\"\n    Represents a user that is in the process of logging in.\n\n    Keyword arguments:\n\n    signup -- Indicates whether or not sending the\n    email is essential (during signup), or if it can be skipped (e.g. in\n    case email verification is optional and we are only logging in).\n    \"\"\"\n\n    # Optional, because we might be prentending logins to prevent user\n    # enumeration.\n    user: AbstractBaseUser | None\n    email_verification: app_settings.EmailVerificationMethod\n    signal_kwargs: dict | None\n    signup: bool\n    email: str | None\n    phone: str | None\n    state: dict\n    initiated_at: float\n    redirect_url: str | None\n\n    def __init__(\n        self,\n        user: AbstractBaseUser | None = None,\n        email_verification: app_settings.EmailVerificationMethod | None = None,\n        redirect_url: str | None = None,\n        signal_kwargs: dict | None = None,\n        signup: bool = False,\n        email: str | None = None,\n        state: dict | None = None,\n        initiated_at: float | None = None,\n        phone: str | None = None,\n    ) -> None:\n        self.user = user\n        if not email_verification:\n            email_verification = app_settings.EMAIL_VERIFICATION\n        self.email_verification = email_verification\n        self.redirect_url = redirect_url\n        self.signal_kwargs = signal_kwargs\n        self.signup = signup\n        self.email = email\n        self.phone = phone\n        self.state = {} if state is None else state\n        self.initiated_at = initiated_at if initiated_at else time.time()\n\n    def serialize(self) -> _SerializedLogin:\n        from allauth.account.utils import user_pk_to_url_str\n\n        # :-( Knowledge of the `socialaccount` is entering the `account` app.\n        signal_kwargs = self.signal_kwargs\n        if signal_kwargs is not None:\n            sociallogin = signal_kwargs.get(\"sociallogin\")\n            if sociallogin is not None:\n                signal_kwargs = signal_kwargs.copy()\n                signal_kwargs[\"sociallogin\"] = sociallogin.serialize()\n\n        data: _SerializedLogin = {\n            \"user_pk\": user_pk_to_url_str(self.user) if self.user else None,\n            \"email_verification\": self.email_verification,\n            \"signup\": self.signup,\n            \"redirect_url\": self.redirect_url,\n            \"email\": self.email,\n            \"phone\": self.phone,\n            \"signal_kwargs\": signal_kwargs,\n            \"state\": self.state,\n            \"initiated_at\": self.initiated_at,\n        }\n        return data\n\n    @classmethod\n    def deserialize(cls, data: dict[str, Any]) -> Login:\n        from allauth.account.utils import url_str_to_user_pk\n\n        user = None\n        user_pk = data[\"user_pk\"]\n        if user_pk is not None:\n            user = (\n                get_user_model().objects.filter(pk=url_str_to_user_pk(user_pk)).first()\n            )\n        try:\n            # :-( Knowledge of the `socialaccount` is entering the `account` app.\n            signal_kwargs = data[\"signal_kwargs\"]\n            if signal_kwargs is not None:\n                sociallogin = signal_kwargs.get(\"sociallogin\")\n                if sociallogin is not None:\n                    from allauth.socialaccount.models import SocialLogin\n\n                    signal_kwargs = signal_kwargs.copy()\n                    signal_kwargs[\"sociallogin\"] = SocialLogin.deserialize(sociallogin)\n\n            return Login(\n                user=user,\n                email_verification=data[\"email_verification\"],\n                redirect_url=data[\"redirect_url\"],\n                email=data[\"email\"],\n                phone=data[\"phone\"],\n                signup=data[\"signup\"],\n                signal_kwargs=signal_kwargs,\n                state=data[\"state\"],\n                initiated_at=data[\"initiated_at\"],\n            )\n        except KeyError:\n            raise ValueError()\n\n\ndef get_emailconfirmation_model() -> (\n    type[EmailConfirmation] | type[EmailConfirmationHMAC]\n):\n    if app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED:\n        raise NotImplementedError\n    elif app_settings.EMAIL_CONFIRMATION_HMAC:\n        return EmailConfirmationHMAC\n    else:\n        return EmailConfirmation\n"
  },
  {
    "path": "allauth/account/reauthentication.py",
    "content": "import warnings\n\nfrom allauth.account.internal.flows.reauthentication import (\n    did_recently_authenticate,\n    raise_if_reauthentication_required,\n)\n\n\n__all__ = [\n    \"raise_if_reauthentication_required\",\n    \"did_recently_authenticate\",\n]\n\nwarnings.warn(\"allauth.account.reauthentication is deprecated\")\n"
  },
  {
    "path": "allauth/account/signals.py",
    "content": "from django.contrib.auth.signals import user_logged_out  # noqa\nfrom django.dispatch import Signal\n\n\n# Provides the arguments \"request\", \"user\"\nuser_logged_in = Signal()\n\n# Typically followed by `user_logged_in` (unless, email verification kicks in)\n# Provides the arguments \"request\", \"user\"\nuser_signed_up = Signal()\n\n# Provides the arguments \"request\", \"user\"\npassword_set = Signal()\n# Provides the arguments \"request\", \"user\"\npassword_changed = Signal()\n# Provides the arguments \"request\", \"user\"\npassword_reset = Signal()\n\n# Provides the arguments \"request\", \"email_address\"\nemail_confirmed = Signal()\n# Provides the arguments \"request\", \"confirmation\", \"signup\"\nemail_confirmation_sent = Signal()\n\n# Provides the arguments \"request\", \"user\", \"from_email_address\",\n# \"to_email_address\"\nemail_changed = Signal()\n# Provides the arguments \"request\", \"user\", \"email_address\"\nemail_added = Signal()\n# Provides the arguments \"request\", \"user\", \"email_address\"\nemail_removed = Signal()\n\n# Provides the arguments \"request\", \"user\", \"method\", and additional method dependent kwargs.\nauthentication_step_completed = Signal()\n\n# Internal/private signal.\n_add_email = Signal()\n"
  },
  {
    "path": "allauth/account/stages.py",
    "content": "import logging\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.account import app_settings\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.app_settings import EmailVerificationMethod\nfrom allauth.account.internal.constants import LoginStageKey\nfrom allauth.account.internal.flows.email_verification import (\n    send_verification_email_at_login,\n)\nfrom allauth.account.models import EmailAddress, Login\nfrom allauth.core.internal.httpkit import headed_redirect_response\nfrom allauth.utils import import_callable\n\n\nlogger = logging.getLogger(__name__)\n\n\nclass LoginStage:\n    key: str  # Set in subclasses\n    urlname: str | None = None\n    login: Login\n\n    def __init__(self, controller, request, login):\n        if not self.key:\n            raise ValueError()\n        self.controller = controller\n        self.request = request\n        self.login = login\n        self.state = (\n            self.login.state.setdefault(\"stages\", {})\n            .setdefault(self.key, {})\n            .setdefault(\"data\", {})\n        )\n\n    def handle(self):\n        return None, True\n\n    def exit(self):\n        from allauth.account.internal.flows.login import resume_login\n\n        self.controller.set_handled(self.key)\n        return resume_login(self.request, self.login)\n\n    def abort(self):\n        from allauth.account.internal.stagekit import clear_login\n\n        clear_login(self.request)\n        return headed_redirect_response(\"account_login\")\n\n    def is_resumable(self, request):\n        return True\n\n\nclass LoginStageController:\n    def __init__(self, request, login):\n        self.request = request\n        self.login = login\n        self.state = self.login.state.setdefault(\"stages\", {})\n\n    @classmethod\n    def enter(cls, request, stage_key):\n        from allauth.account.internal.stagekit import unstash_login\n\n        login = unstash_login(request, peek=True)\n        if not login:\n            return None\n        ctrl = LoginStageController(request, login)\n        if ctrl.state.get(\"current\") != stage_key:\n            return None\n        stages = ctrl.get_stages()\n        for stage in stages:\n            if stage.key == stage_key:\n                return stage\n        return None\n\n    def set_current(self, stage_key):\n        self.state[\"current\"] = stage_key\n\n    def is_handled(self, stage_key):\n        return self.state.get(stage_key, {}).get(\"handled\", False)\n\n    def set_handled(self, stage_key):\n        stage_state = self.state.setdefault(stage_key, {})\n        stage_state[\"handled\"] = True\n\n    def get_pending_stage(self) -> LoginStage | None:\n        ret = None\n        stages = self.get_stages()\n        for stage in stages:\n            if self.is_handled(stage.key):\n                continue\n            ret = stage\n            break\n        return ret\n\n    def get_stage(self, key: str) -> LoginStage | None:\n        try:\n            return next(iter(stage for stage in self.get_stages() if stage.key == key))\n        except StopIteration:\n            return None\n\n    def get_stages(self) -> list[LoginStage]:\n        stages = []\n        adapter = get_adapter(self.request)\n        paths = adapter.get_login_stages()\n        for path in paths:\n            cls = import_callable(path)\n            stage = cls(self, self.request, self.login)\n            stages.append(stage)\n        return stages\n\n    def handle(self):\n        from allauth.account.internal.stagekit import clear_login, stash_login\n\n        stages = self.get_stages()\n        for stage in stages:\n            if self.is_handled(stage.key):\n                continue\n            self.set_current(stage.key)\n            response, cont = stage.handle()\n            if response:\n                if cont:\n                    stash_login(self.request, self.login)\n                else:\n                    clear_login(self.request)\n                return response\n            else:\n                if not cont:\n                    # So, on our stages is aborting without actually giving\n                    # a response.\n                    logger.error(\"Login stage aborted, redirecting to login\")\n                    return headed_redirect_response(\"account_login\")\n                self.set_handled(stage.key)\n        clear_login(self.request)\n\n\nclass EmailVerificationStage(LoginStage):\n    key = LoginStageKey.VERIFY_EMAIL.value\n    urlname = \"account_email_verification_sent\"\n\n    def is_resumable(self, request):\n        return app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED\n\n    def handle(self):\n        from allauth.account.utils import has_verified_email\n\n        response, cont = None, True\n        login = self.login\n        email_verification = login.email_verification\n        if email_verification == EmailVerificationMethod.NONE:\n            pass\n        elif email_verification == EmailVerificationMethod.OPTIONAL:\n            # In case of OPTIONAL verification: send on signup.\n            if not has_verified_email(login.user, login.email) and login.signup:\n                send_verification_email_at_login(self.request, login)\n        elif email_verification == EmailVerificationMethod.MANDATORY:\n            if not has_verified_email(login.user, login.email):\n                send_verification_email_at_login(self.request, login)\n                response = get_adapter().respond_email_verification_sent(\n                    self.request, login.user\n                )\n        return response, cont\n\n\nclass LoginByCodeStage(LoginStage):\n    key = LoginStageKey.LOGIN_BY_CODE.value\n    urlname = \"account_confirm_login_code\"\n\n    def handle(self):\n        from allauth.account.internal.flows import login_by_code\n\n        did_initiate_process = bool(self.state)\n        login_by_code_required = get_adapter().is_login_by_code_required(self.login)\n        if not did_initiate_process and not login_by_code_required:\n            # Didn't initiate login by code process, but not required, so continue.\n            return None, True\n        elif self._is_trusted():\n            return None, True\n        elif not did_initiate_process and login_by_code_required:\n            email = self.login.email or EmailAddress.objects.get_primary_email(\n                self.login.user\n            )\n            phone = None\n            phone_field = app_settings.SIGNUP_FIELDS.get(\"phone\")\n            if not email and phone_field:\n                phone_verified = get_adapter().get_phone(self.login.user)\n                if phone_verified:\n                    phone = phone_verified[0]\n            if not email and not phone:\n                # No way of contacting the user.. cannot meet the\n                # requirements. Abort.\n                return headed_redirect_response(\"account_login\"), False\n            login_by_code.LoginCodeVerificationProcess.initiate(\n                request=self.request,\n                user=self.login.user,\n                phone=phone,\n                email=email,\n                stage=self,\n            )\n        self.state[\"login_by_code_required\"] = True\n        response = headed_redirect_response(\"account_confirm_login_code\")\n        return response, True\n\n    def _is_trusted(self) -> bool:\n        if (\n            not app_settings.LOGIN_BY_CODE_TRUST_ENABLED\n            or not allauth_settings.MFA_ENABLED\n            or self.login.user is None\n        ):\n            return False\n\n        from allauth.mfa.internal.flows import trust\n\n        return trust.is_trusted_browser(self.request, self.login.user)\n\n\nclass PhoneVerificationStage(LoginStage):\n    key = LoginStageKey.VERIFY_PHONE.value\n    urlname = \"account_verify_phone\"\n\n    def handle(self):\n        from allauth.account.internal.flows import phone_verification\n\n        phone_field = app_settings.SIGNUP_FIELDS.get(\"phone\")\n        if not phone_field:\n            return None, True\n        adapter = get_adapter()\n\n        if self.login.user:\n            phone_verified = adapter.get_phone(self.login.user)\n            if phone_verified is None:\n                return None, (not phone_field[\"required\"])\n            phone, verified = phone_verified\n            if verified or not app_settings.PHONE_VERIFICATION_ENABLED:\n                return None, True\n        else:\n            phone = self.login.phone\n            if not phone:\n                return None, True\n        phone_verification.PhoneVerificationStageProcess.initiate(\n            stage=self, phone=phone\n        )\n        response = headed_redirect_response(\"account_verify_phone\")\n        return response, True\n"
  },
  {
    "path": "allauth/account/static/account/js/account.js",
    "content": "(function () {\n  const allauth = window.allauth = window.allauth || {}\n\n  function manageEmailForm (o) {\n    const actions = document.getElementsByName('action_remove')\n    if (actions.length) {\n      actions[0].addEventListener('click', function (e) {\n        if (!window.confirm(o.i18n.confirmDelete)) {\n          e.preventDefault()\n        }\n      })\n    }\n  }\n\n  allauth.account = {\n    forms: {\n      manageEmailForm\n    }\n  }\n})()\n"
  },
  {
    "path": "allauth/account/static/account/js/onload.js",
    "content": "(function () {\n  document.addEventListener('DOMContentLoaded', function () {\n    Array.from(document.querySelectorAll('script[data-allauth-onload]')).forEach(scriptElt => {\n      const funcRef = scriptElt.dataset.allauthOnload\n      if (typeof funcRef === 'string' && funcRef.startsWith('allauth.')) {\n        const funcArg = JSON.parse(scriptElt.textContent)\n        const func = funcRef.split('.').reduce((acc, part) => acc && acc[part], window)\n        func(funcArg)\n      }\n    })\n  })\n})()\n"
  },
  {
    "path": "allauth/account/templatetags/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/account/templatetags/account.py",
    "content": "from django import template\n\nfrom allauth.account.utils import user_display\n\n\nregister = template.Library()\n\n\n@register.simple_tag(name=\"user_display\")\ndef user_display_tag(user):\n    \"\"\"\n    Example usage::\n\n        {% user_display user %}\n\n    or if you need to use in a {% blocktrans %}::\n\n        {% user_display user as user_display %}\n        {% blocktrans %}\n        {{ user_display }} has sent you a gift.\n        {% endblocktrans %}\n\n    \"\"\"\n    return user_display(user)\n"
  },
  {
    "path": "allauth/account/urls.py",
    "content": "from django.conf import settings\nfrom django.urls import path, re_path\n\nfrom allauth import app_settings as allauth_app_settings\nfrom allauth.account import app_settings\n\nfrom . import views\n\n\nurlpatterns = [\n    path(\"login/\", views.login, name=\"account_login\"),\n    path(\"logout/\", views.logout, name=\"account_logout\"),\n    path(\"inactive/\", views.account_inactive, name=\"account_inactive\"),\n]\n\nif not allauth_app_settings.SOCIALACCOUNT_ONLY:\n    urlpatterns.extend(\n        [\n            path(\"signup/\", views.signup, name=\"account_signup\"),\n            path(\n                \"reauthenticate/\", views.reauthenticate, name=\"account_reauthenticate\"\n            ),\n            # Email\n            path(\"email/\", views.email, name=\"account_email\"),\n            path(\n                \"confirm-email/\",\n                views.email_verification_sent,\n                name=\"account_email_verification_sent\",\n            ),\n            path(\n                \"password/change/\",\n                views.password_change,\n                name=\"account_change_password\",\n            ),\n            path(\"password/set/\", views.password_set, name=\"account_set_password\"),\n            # password reset\n            path(\n                \"password/reset/\", views.password_reset, name=\"account_reset_password\"\n            ),\n            path(\n                \"login/code/confirm/\",\n                views.confirm_login_code,\n                name=\"account_confirm_login_code\",\n            ),\n        ]\n    )\n    if not app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED:\n        urlpatterns.append(\n            re_path(\n                r\"^confirm-email/(?P<key>[-:\\w]+)/$\",\n                views.confirm_email,\n                name=\"account_confirm_email\",\n            )\n        )\n    if \"phone\" in app_settings.SIGNUP_FIELDS:\n        urlpatterns.extend(\n            [\n                path(\n                    \"phone/verify/\",\n                    views.verify_phone,\n                    name=\"account_verify_phone\",\n                ),\n                path(\n                    \"phone/change/\",\n                    views.change_phone,\n                    name=\"account_change_phone\",\n                ),\n            ]\n        )\n    if app_settings.PASSWORD_RESET_BY_CODE_ENABLED:\n        urlpatterns.extend(\n            [\n                path(\n                    \"password/reset/confirm/\",\n                    views.confirm_password_reset_code,\n                    name=\"account_confirm_password_reset_code\",\n                ),\n                path(\n                    \"password/reset/complete/\",\n                    views.complete_password_reset,\n                    name=\"account_complete_password_reset\",\n                ),\n                path(\n                    \"password/reset/done/\",\n                    views.password_reset_from_key_done,\n                    name=\"account_password_reset_completed\",\n                ),\n            ]\n        )\n    else:\n        urlpatterns.extend(\n            [\n                path(\n                    \"password/reset/key/done/\",\n                    views.password_reset_from_key_done,\n                    name=\"account_reset_password_from_key_done\",\n                ),\n                re_path(\n                    r\"^password/reset/key/(?P<uidb36>[0-9A-Za-z]+)-(?P<key>.+)/$\",\n                    views.password_reset_from_key,\n                    name=\"account_reset_password_from_key\",\n                ),\n                path(\n                    \"password/reset/done/\",\n                    views.password_reset_done,\n                    name=\"account_reset_password_done\",\n                ),\n            ]\n        )\n    if getattr(settings, \"MFA_PASSKEY_SIGNUP_ENABLED\", False):\n        urlpatterns.append(\n            path(\n                \"signup/passkey/\",\n                views.signup_by_passkey,\n                name=\"account_signup_by_passkey\",\n            )\n        )\n\nif app_settings.LOGIN_BY_CODE_ENABLED:\n    urlpatterns.extend(\n        [\n            path(\n                \"login/code/\",\n                views.request_login_code,\n                name=\"account_request_login_code\",\n            ),\n        ]\n    )\n"
  },
  {
    "path": "allauth/account/utils.py",
    "content": "import unicodedata\nfrom collections import OrderedDict\n\nfrom django.contrib.auth import REDIRECT_FIELD_NAME, get_user_model\nfrom django.db import models\nfrom django.db.models import Q\nfrom django.utils.http import base36_to_int, int_to_base36\n\nfrom allauth.account import app_settings\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.internal import flows\nfrom allauth.account.internal.emailkit import valid_email_or_none\nfrom allauth.account.internal.userkit import default_user_display  # noqa\nfrom allauth.account.internal.userkit import user_display  # noqa\nfrom allauth.account.internal.userkit import user_email  # noqa\nfrom allauth.account.internal.userkit import user_field  # noqa\nfrom allauth.account.internal.userkit import user_username  # noqa\nfrom allauth.account.models import Login\nfrom allauth.core.internal import httpkit\nfrom allauth.utils import get_request_param\n\n\ndef _unicode_ci_compare(s1: str, s2: str) -> bool:\n    \"\"\"\n    Perform case-insensitive comparison of two identifiers, using the\n    recommended algorithm from Unicode Technical Report 36, section\n    2.11.2(B)(2).\n    \"\"\"\n    norm_s1 = unicodedata.normalize(\"NFKC\", s1).casefold()\n    norm_s2 = unicodedata.normalize(\"NFKC\", s2).casefold()\n    return norm_s1 == norm_s2\n\n\ndef get_next_redirect_url(\n    request, redirect_field_name=REDIRECT_FIELD_NAME\n) -> str | None:\n    \"\"\"\n    Returns the next URL to redirect to, if it was explicitly passed\n    via the request.\n    \"\"\"\n    redirect_to = get_request_param(request, redirect_field_name)\n    if redirect_to and not get_adapter().is_safe_url(redirect_to):\n        redirect_to = None\n    return redirect_to\n\n\ndef get_login_redirect_url(\n    request, url=None, redirect_field_name=REDIRECT_FIELD_NAME, signup=False\n) -> str:\n    ret = url\n    if url and callable(url):\n        # In order to be able to pass url getters around that depend\n        # on e.g. the authenticated state.\n        ret = url()\n    if not ret:\n        ret = get_next_redirect_url(request, redirect_field_name=redirect_field_name)\n    if not ret:\n        if signup:\n            ret = get_adapter().get_signup_redirect_url(request)\n        else:\n            ret = get_adapter().get_login_redirect_url(request)\n    return ret\n\n\ndef has_verified_email(user, email=None) -> bool:\n    from .models import EmailAddress\n\n    emailaddress = None\n    if email:\n        ret = False\n        try:\n            emailaddress = EmailAddress.objects.get_for_user(user, email)\n            ret = emailaddress.verified\n        except EmailAddress.DoesNotExist:\n            pass\n    else:\n        ret = EmailAddress.objects.filter(user=user, verified=True).exists()\n    return ret\n\n\ndef perform_login(\n    request,\n    user,\n    email_verification=None,\n    redirect_url=None,\n    signal_kwargs=None,\n    signup=False,\n    email=None,\n):\n    login = Login(\n        user=user,\n        email_verification=email_verification,\n        redirect_url=redirect_url,\n        signal_kwargs=signal_kwargs,\n        signup=signup,\n        email=email,\n    )\n    return flows.login.perform_login(request, login)\n\n\ndef complete_signup(request, user, email_verification, success_url, signal_kwargs=None):\n    return flows.signup.complete_signup(\n        request,\n        user=user,\n        email_verification=email_verification,\n        redirect_url=success_url,\n        signal_kwargs=signal_kwargs,\n    )\n\n\ndef cleanup_email_addresses(request, addresses):\n    \"\"\"\n    Takes a list of EmailAddress instances and cleans it up, making\n    sure only valid ones remain, without multiple primaries etc.\n\n    Order is important: e.g. if multiple primary email addresses\n    exist, the first one encountered will be kept as primary.\n    \"\"\"\n    from .models import EmailAddress\n\n    adapter = get_adapter()\n    # Let's group by `email`\n    e2a = OrderedDict()  # maps email to EmailAddress\n    primary_addresses = []\n    verified_addresses = []\n    primary_verified_addresses = []\n    for address in addresses:\n        # Pick up only valid ones...\n        email = valid_email_or_none(address.email)\n        if not email:\n            continue\n        address.email = email  # `valid_email_or_none` lower cases\n        # ... and non-conflicting ones...\n        if (\n            app_settings.UNIQUE_EMAIL\n            and app_settings.PREVENT_ENUMERATION != \"strict\"\n            and EmailAddress.objects.lookup([email])\n        ):\n            # Email address already exists.\n            continue\n        if (\n            app_settings.UNIQUE_EMAIL\n            and app_settings.PREVENT_ENUMERATION == \"strict\"\n            and address.verified\n            and EmailAddress.objects.is_verified(email)\n        ):\n            # Email address already exists, and is verified as well.\n            continue\n        a = e2a.get(email)\n        if a:\n            a.primary = a.primary or address.primary\n            a.verified = a.verified or address.verified\n        else:\n            a = address\n            a.verified = a.verified or adapter.is_email_verified(request, a.email)\n            e2a[email] = a\n        if a.primary:\n            primary_addresses.append(a)\n            if a.verified:\n                primary_verified_addresses.append(a)\n        if a.verified:\n            verified_addresses.append(a)\n    # Now that we got things sorted out, let's assign a primary\n    if primary_verified_addresses:\n        primary_address = primary_verified_addresses[0]\n    elif verified_addresses:\n        # Pick any verified as primary\n        primary_address = verified_addresses[0]\n    elif primary_addresses:\n        # Okay, let's pick primary then, even if unverified\n        primary_address = primary_addresses[0]\n    elif e2a:\n        # Pick the first\n        primary_address = list(e2a.values())[0]\n    else:\n        # Empty\n        primary_address = None\n    # There can only be one primary\n    for a in e2a.values():\n        a.primary = primary_address.email.lower() == a.email.lower()\n    return list(e2a.values()), primary_address\n\n\ndef setup_user_email(request, user, addresses):\n    \"\"\"\n    Creates proper EmailAddress for the user that was just signed\n    up. Only sets up, doesn't do any other handling such as sending\n    out email confirmation mails etc.\n    \"\"\"\n    from .models import EmailAddress\n\n    assert not EmailAddress.objects.filter(user=user).exists()  # nosec\n    priority_addresses = []\n    # Is there a stashed email?\n    adapter = get_adapter()\n    stashed_email = adapter.unstash_verified_email(request)\n    if stashed_email:\n        priority_addresses.append(\n            EmailAddress(\n                user=user, email=stashed_email.lower(), primary=True, verified=True\n            )\n        )\n    email = user_email(user)\n    if email:\n        priority_addresses.append(\n            EmailAddress(user=user, email=email.lower(), primary=True, verified=False)\n        )\n    addresses, primary = cleanup_email_addresses(\n        request, priority_addresses + addresses\n    )\n    for a in addresses:\n        a.user = user\n        a.save()\n    EmailAddress.objects.fill_cache_for_user(user, addresses)\n    if primary and (email or \"\").lower() != primary.email.lower():\n        user_email(user, primary.email)\n        user.save()\n    return primary\n\n\ndef filter_users_by_username(*username):\n    if app_settings.PRESERVE_USERNAME_CASING:\n        qlist = [\n            Q(**{f\"{app_settings.USER_MODEL_USERNAME_FIELD}__iexact\": u})\n            for u in username\n        ]\n        q = qlist[0]\n        for q2 in qlist[1:]:\n            q = q | q2\n        ret = get_user_model()._default_manager.filter(q)\n    else:\n        ret = get_user_model()._default_manager.filter(\n            **{\n                f\"{app_settings.USER_MODEL_USERNAME_FIELD}__in\": [\n                    u.lower() for u in username\n                ]\n            }\n        )\n    return ret\n\n\ndef filter_users_by_email(\n    email: str, is_active: bool | None = None, prefer_verified: bool = False\n) -> list:\n    \"\"\"Return list of users by email address\n\n    Typically one, at most just a few in length.  First we look through\n    EmailAddress table, than customisable User model table. Add results\n    together avoiding SQL joins and deduplicate.\n\n    `prefer_verified`: When looking up users by email, there can be cases where\n    users with verified email addresses are preferable above users who did not\n    verify their email address. The password reset is such a use case -- if\n    there is a user with a verified email than that user should be returned, not\n    one of the other users.\n    \"\"\"\n    from .models import EmailAddress\n\n    User = get_user_model()\n    email = email.lower()\n    mails = list(EmailAddress.objects.filter(email=email).select_related(\"user\"))\n    is_verified = False\n    if prefer_verified:\n        verified_mails = list(filter(lambda e: e.verified, mails))\n        if verified_mails:\n            mails = verified_mails\n            is_verified = True\n    users = []\n    for e in mails:\n        if _unicode_ci_compare(e.email, email):\n            users.append(e.user)\n    if app_settings.USER_MODEL_EMAIL_FIELD and not is_verified:\n        q_dict = {app_settings.USER_MODEL_EMAIL_FIELD: email}\n        user_qs = User.objects.filter(**q_dict)\n        for user in user_qs.iterator(2000):\n            user_email = getattr(user, app_settings.USER_MODEL_EMAIL_FIELD)\n            if _unicode_ci_compare(user_email, email):\n                users.append(user)\n    if is_active is not None:\n        users = [u for u in set(users) if u.is_active == is_active]\n    return list(set(users))\n\n\ndef passthrough_next_redirect_url(request, url: str, redirect_field_name: str) -> str:\n    next_url = get_next_redirect_url(request, redirect_field_name)\n    if next_url:\n        url = httpkit.add_query_params(url, {redirect_field_name: next_url})\n    return url\n\n\ndef user_pk_to_url_str(user) -> str:\n    \"\"\"\n    This should return a string.\n    \"\"\"\n    User = get_user_model()\n    pk_field_class = type(User._meta.pk)\n    if issubclass(pk_field_class, models.UUIDField):\n        if isinstance(user.pk, str):\n            return user.pk\n        return user.pk.hex\n    elif issubclass(pk_field_class, models.IntegerField):\n        return int_to_base36(int(user.pk))\n    return str(user.pk)\n\n\ndef url_str_to_user_pk(pk_str):\n    User = get_user_model()\n    remote_field = getattr(User._meta.pk, \"remote_field\", None)\n    if remote_field and getattr(remote_field, \"to\", None):\n        pk_field = User._meta.pk.remote_field.to._meta.pk\n    else:\n        pk_field = User._meta.pk\n    pk_field_class = type(pk_field)\n    if issubclass(pk_field_class, models.IntegerField):\n        pk = base36_to_int(pk_str)\n        # always call to_python() -- because there are fields like HashidField\n        # that derive from IntegerField.\n        pk = pk_field.to_python(pk)\n    else:\n        pk = pk_field.to_python(pk_str)\n    return pk\n"
  },
  {
    "path": "allauth/account/views.py",
    "content": "from http import HTTPStatus\n\nfrom django.contrib import messages\nfrom django.contrib.auth.decorators import login_required\nfrom django.contrib.sites.shortcuts import get_current_site\nfrom django.core.exceptions import PermissionDenied\nfrom django.core.validators import validate_email\nfrom django.forms import Form, ValidationError\nfrom django.http import Http404, HttpResponse, HttpResponseBase, HttpResponseRedirect\nfrom django.urls import NoReverseMatch, reverse, reverse_lazy\nfrom django.utils.decorators import method_decorator\nfrom django.utils.functional import cached_property\nfrom django.views.decorators.cache import never_cache\nfrom django.views.decorators.debug import sensitive_post_parameters\nfrom django.views.generic.base import TemplateView\nfrom django.views.generic.edit import FormView\n\nfrom allauth import app_settings as allauth_app_settings\nfrom allauth.account import app_settings\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.forms import (\n    AddEmailForm,\n    ChangeEmailForm,\n    ChangePasswordForm,\n    ChangePhoneForm,\n    ConfirmEmailVerificationCodeForm,\n    ConfirmLoginCodeForm,\n    ConfirmPasswordResetCodeForm,\n    LoginForm,\n    ReauthenticateForm,\n    RequestLoginCodeForm,\n    ResetPasswordForm,\n    ResetPasswordKeyForm,\n    SetPasswordForm,\n    SignupForm,\n    UserTokenForm,\n    VerifyPhoneForm,\n)\nfrom allauth.account.internal import flows\nfrom allauth.account.internal.decorators import login_not_required, login_stage_required\nfrom allauth.account.internal.flows.email_verification import (\n    send_verification_email_to_address,\n)\nfrom allauth.account.mixins import (\n    AjaxCapableProcessFormViewMixin,\n    CloseableSignupMixin,\n    LogoutFunctionalityMixin,\n    NextRedirectMixin,\n    RedirectAuthenticatedUserMixin,\n    _ajax_response,\n)\nfrom allauth.account.models import (\n    EmailAddress,\n    EmailConfirmation,\n    get_emailconfirmation_model,\n)\nfrom allauth.account.stages import (\n    EmailVerificationStage,\n    LoginByCodeStage,\n    LoginStageController,\n    PhoneVerificationStage,\n)\nfrom allauth.account.utils import user_display\nfrom allauth.core import ratelimit\nfrom allauth.core.exceptions import ImmediateHttpResponse\nfrom allauth.core.internal.httpkit import redirect\nfrom allauth.core.ratelimit import RateLimited\nfrom allauth.decorators import rate_limit\nfrom allauth.utils import get_form_class\n\n\nINTERNAL_RESET_SESSION_KEY = \"_password_reset_key\"\n\n\nsensitive_post_parameters_m = method_decorator(\n    sensitive_post_parameters(\"oldpassword\", \"password\", \"password1\", \"password2\")\n)\n\n\nclass LoginView(\n    NextRedirectMixin,\n    RedirectAuthenticatedUserMixin,\n    AjaxCapableProcessFormViewMixin,\n    FormView,\n):\n    form_class = LoginForm\n    template_name = f\"account/login.{app_settings.TEMPLATE_EXTENSION}\"\n    success_url = None\n\n    @method_decorator(rate_limit(action=\"login\"))\n    @method_decorator(login_not_required)\n    @sensitive_post_parameters_m\n    @method_decorator(never_cache)\n    def dispatch(self, request, *args, **kwargs) -> HttpResponseBase:\n        if allauth_app_settings.SOCIALACCOUNT_ONLY and request.method != \"GET\":\n            raise PermissionDenied()\n        return super().dispatch(request, *args, **kwargs)\n\n    def get_form_kwargs(self) -> dict:\n        kwargs = super().get_form_kwargs()\n        kwargs[\"request\"] = self.request\n        return kwargs\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"login\", self.form_class)\n\n    def form_valid(self, form) -> HttpResponse:\n        redirect_url = self.get_success_url()\n        try:\n            return form.login(self.request, redirect_url=redirect_url)\n        except ImmediateHttpResponse as e:\n            return e.response\n\n    def get_context_data(self, **kwargs) -> dict:\n        passkey_login_enabled = False\n        if allauth_app_settings.MFA_ENABLED:\n            from allauth.mfa import app_settings as mfa_settings\n\n            passkey_login_enabled = mfa_settings.PASSKEY_LOGIN_ENABLED\n        ret = super().get_context_data(**kwargs)\n        signup_url = None\n        if not allauth_app_settings.SOCIALACCOUNT_ONLY:\n            try:\n                signup_url = self.passthrough_next_url(reverse(\"account_signup\"))\n            except NoReverseMatch:\n                # There may project specific tweaks other than\n                # SOCIALACCOUNT_ONLY ...\n                pass\n        site = get_current_site(self.request)\n\n        ret.update(\n            {\n                \"signup_url\": signup_url,\n                \"site\": site,\n                \"SOCIALACCOUNT_ENABLED\": allauth_app_settings.SOCIALACCOUNT_ENABLED,\n                \"SOCIALACCOUNT_ONLY\": allauth_app_settings.SOCIALACCOUNT_ONLY,\n                \"LOGIN_BY_CODE_ENABLED\": app_settings.LOGIN_BY_CODE_ENABLED,\n                \"PASSKEY_LOGIN_ENABLED\": passkey_login_enabled,\n            }\n        )\n        if app_settings.LOGIN_BY_CODE_ENABLED:\n            request_login_code_url = self.passthrough_next_url(\n                reverse(\"account_request_login_code\")\n            )\n            ret[\"request_login_code_url\"] = request_login_code_url\n        return ret\n\n\nlogin = LoginView.as_view()\n\n\nclass SignupView(\n    RedirectAuthenticatedUserMixin,\n    CloseableSignupMixin,\n    NextRedirectMixin,\n    AjaxCapableProcessFormViewMixin,\n    FormView,\n):\n    template_name = f\"account/signup.{app_settings.TEMPLATE_EXTENSION}\"\n    form_class = SignupForm\n\n    @method_decorator(rate_limit(action=\"signup\"))\n    @method_decorator(login_not_required)\n    @sensitive_post_parameters_m\n    @method_decorator(never_cache)\n    def dispatch(self, request, *args, **kwargs) -> HttpResponseBase:\n        return super().dispatch(request, *args, **kwargs)\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"signup\", self.form_class)\n\n    def form_valid(self, form) -> HttpResponse:\n        self.user, resp = form.try_save(self.request)\n        if resp:\n            return resp\n        try:\n            redirect_url = self.get_success_url()\n            return flows.signup.complete_signup(\n                self.request,\n                user=self.user,\n                redirect_url=redirect_url,\n                by_passkey=form.by_passkey,\n            )\n        except ImmediateHttpResponse as e:\n            return e.response\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        passkey_signup_enabled = False\n        if allauth_app_settings.MFA_ENABLED:\n            from allauth.mfa import app_settings as mfa_settings\n\n            passkey_signup_enabled = mfa_settings.PASSKEY_SIGNUP_ENABLED\n        form = ret[\"form\"]\n        email = self.request.session.get(\"account_verified_email\")\n        if email:\n            email_keys = [\"email\"]\n            if \"email2\" in app_settings.SIGNUP_FIELDS:\n                email_keys.append(\"email2\")\n            for email_key in email_keys:\n                form.fields[email_key].initial = email\n        login_url = self.passthrough_next_url(reverse(\"account_login\"))\n        signup_url = self.passthrough_next_url(reverse(\"account_signup\"))\n        signup_by_passkey_url = None\n        if passkey_signup_enabled:\n            signup_by_passkey_url = self.passthrough_next_url(\n                reverse(\"account_signup_by_passkey\")\n            )\n        site = get_current_site(self.request)\n        ret.update(\n            {\n                \"login_url\": login_url,\n                \"signup_url\": signup_url,\n                \"signup_by_passkey_url\": signup_by_passkey_url,\n                \"site\": site,\n                \"SOCIALACCOUNT_ENABLED\": allauth_app_settings.SOCIALACCOUNT_ENABLED,\n                \"SOCIALACCOUNT_ONLY\": allauth_app_settings.SOCIALACCOUNT_ONLY,\n                \"PASSKEY_SIGNUP_ENABLED\": passkey_signup_enabled,\n            }\n        )\n        return ret\n\n    def get_initial(self) -> dict:\n        initial = super().get_initial()\n        email = self.request.GET.get(\"email\")\n        if email:\n            try:\n                validate_email(email)\n            except ValidationError:\n                return initial\n            initial[\"email\"] = email\n            if \"email2\" in app_settings.SIGNUP_FIELDS:\n                initial[\"email2\"] = email\n        return initial\n\n\nsignup = SignupView.as_view()\n\n\nclass SignupByPasskeyView(SignupView):\n    template_name = f\"account/signup_by_passkey.{app_settings.TEMPLATE_EXTENSION}\"\n\n    def get_form_kwargs(self) -> dict:\n        ret = super().get_form_kwargs()\n        ret[\"by_passkey\"] = True\n        return ret\n\n\nsignup_by_passkey = SignupByPasskeyView.as_view()\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass ConfirmEmailView(NextRedirectMixin, LogoutFunctionalityMixin, TemplateView):\n    template_name = f\"account/email_confirm.{app_settings.TEMPLATE_EXTENSION}\"\n\n    def get(self, *args, **kwargs) -> HttpResponse:\n        try:\n            self.object = self.get_object()\n            self.logout_other_user(self.object)\n            if app_settings.CONFIRM_EMAIL_ON_GET:\n                return self.post(*args, **kwargs)\n        except Http404:\n            self.object = None\n        ctx = self.get_context_data()\n        if not self.object and get_adapter().is_ajax(self.request):\n            resp = HttpResponse()\n            resp.status_code = HTTPStatus.BAD_REQUEST\n        else:\n            resp = self.render_to_response(ctx)\n        return _ajax_response(self.request, resp, data=self.get_ajax_data())\n\n    def logout_other_user(self, confirmation) -> None:\n        \"\"\"\n        In the event someone clicks on an email confirmation link\n        for one account while logged into another account,\n        logout of the currently logged in account.\n        \"\"\"\n        if (\n            self.request.user.is_authenticated\n            and self.request.user.pk != confirmation.email_address.user_id\n        ):\n            self.logout()\n\n    def post(self, *args, **kwargs) -> HttpResponse:\n        self.object = verification = self.get_object()\n        email_address, response = flows.email_verification.verify_email_and_resume(\n            self.request, verification\n        )\n        if response:\n            return response\n        if not email_address:\n            return self.respond(False)\n\n        self.logout_other_user(self.object)\n        return self.respond(True)\n\n    def respond(self, success):\n        redirect_url = self.get_redirect_url()\n        if not redirect_url:\n            ctx = self.get_context_data()\n            return self.render_to_response(ctx)\n        return redirect(redirect_url)\n\n    def get_object(self, queryset=None):\n        key = self.kwargs[\"key\"]\n        model = get_emailconfirmation_model()\n        emailconfirmation = model.from_key(key)\n        if not emailconfirmation:\n            raise Http404()\n        return emailconfirmation\n\n    def get_queryset(self):\n        qs = EmailConfirmation.objects.all_valid()\n        qs = qs.select_related(\"email_address__user\")\n        return qs\n\n    def get_ajax_data(self) -> dict:\n        ret: dict = {\n            \"can_confirm\": bool(self.object),\n        }\n        if self.object:\n            ret[\"email\"] = self.object.email_address.email\n            ret[\"user\"] = {\"display\": user_display(self.object.email_address.user)}\n        return ret\n\n    def get_context_data(self, **kwargs) -> dict:\n        ctx = super().get_context_data(**kwargs)\n        site = get_current_site(self.request)\n        ctx.update(\n            {\n                \"site\": site,\n                \"confirmation\": self.object,\n                \"can_confirm\": self.object\n                and self.object.email_address.can_set_verified(),\n            }\n        )\n        if self.object:\n            ctx[\"email\"] = self.object.email_address.email\n        return ctx\n\n    def get_redirect_url(self) -> str:\n        url = self.get_next_url()\n        if not url:\n            url = get_adapter(self.request).get_email_verification_redirect_url(\n                self.object.email_address,\n            )\n        return url\n\n\nconfirm_email = ConfirmEmailView.as_view()\n\n\n@method_decorator(login_required, name=\"dispatch\")\n@method_decorator(rate_limit(action=\"manage_email\"), name=\"dispatch\")\nclass EmailView(AjaxCapableProcessFormViewMixin, FormView):\n    template_name = (\n        f\"account/email_change.{app_settings.TEMPLATE_EXTENSION}\"\n        if app_settings.CHANGE_EMAIL\n        else f\"account/email.{app_settings.TEMPLATE_EXTENSION}\"\n    )\n    form_class = AddEmailForm\n    success_url = reverse_lazy(\"account_email\")\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"add_email\", self.form_class)\n\n    def dispatch(self, request, *args, **kwargs) -> HttpResponseBase:\n        self._did_send_verification_email = False\n        flows.manage_email.sync_user_email_address(request.user)\n        return super().dispatch(request, *args, **kwargs)\n\n    def get_form_kwargs(self) -> dict:\n        kwargs = super().get_form_kwargs()\n        kwargs[\"user\"] = self.request.user\n        return kwargs\n\n    def form_valid(self, form) -> HttpResponse:\n        flows.manage_email.add_email(self.request, form)\n        self._did_send_verification_email = True\n        return super().form_valid(form)\n\n    def post(self, request, *args, **kwargs) -> HttpResponse:\n        res = None\n        if \"action_add\" in request.POST:\n            res = super().post(request, *args, **kwargs)\n        elif request.POST.get(\"email\"):\n            if \"action_send\" in request.POST:\n                res = self._action_send(request)\n            elif \"action_remove\" in request.POST:\n                res = self._action_remove(request)\n            elif \"action_primary\" in request.POST:\n                res = self._action_primary(request)\n\n            res = res or HttpResponseRedirect(self.get_success_url())\n            # Given that we bypassed AjaxCapableProcessFormViewMixin,\n            # we'll have to call invoke it manually...\n            res = _ajax_response(request, res, data=self._get_ajax_data_if())\n        else:\n            # No email address selected\n            res = HttpResponseRedirect(self.success_url)\n            res = _ajax_response(request, res, data=self._get_ajax_data_if())\n        return res\n\n    def _get_email_address(self, request):\n        email = request.POST[\"email\"]\n        try:\n            validate_email(email)\n        except ValidationError:\n            return None\n        try:\n            return EmailAddress.objects.get_for_user(user=request.user, email=email)\n        except EmailAddress.DoesNotExist:\n            pass\n\n    def _action_send(self, request, *args, **kwargs):\n        email_address = self._get_email_address(request)\n        did_send_verification_email = False\n        if email_address:\n            did_send_verification_email = send_verification_email_to_address(\n                self.request, email_address\n            )\n        self._did_send_verification_email = did_send_verification_email\n        if (\n            app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED\n            and did_send_verification_email\n        ):\n            return HttpResponseRedirect(reverse(\"account_email_verification_sent\"))\n\n    def _action_remove(self, request, *args, **kwargs):\n        email_address = self._get_email_address(request)\n        if email_address:\n            if flows.manage_email.delete_email(request, email_address):\n                return HttpResponseRedirect(self.get_success_url())\n\n    def _action_primary(self, request, *args, **kwargs):\n        email_address = self._get_email_address(request)\n        if email_address:\n            if flows.manage_email.mark_as_primary(request, email_address):\n                return HttpResponseRedirect(self.get_success_url())\n\n    def get_context_data(self, **kwargs):\n        ret = super().get_context_data(**kwargs)\n        emails = list(\n            EmailAddress.objects.filter(user=self.request.user).order_by(\"email\")\n        )\n        ret.update(\n            {\n                \"emailaddresses\": emails,\n                \"emailaddress_radios\": [\n                    {\n                        \"id\": f\"email_radio_{i}\",\n                        \"checked\": email.primary or len(emails) == 1,\n                        \"emailaddress\": email,\n                    }\n                    for i, email in enumerate(emails)\n                ],\n                \"add_email_form\": ret.get(\"form\"),\n                \"can_add_email\": EmailAddress.objects.can_add_email(self.request.user),\n            }\n        )\n        if app_settings.CHANGE_EMAIL:\n            ret.update(\n                {\n                    \"new_emailaddress\": EmailAddress.objects.get_new(self.request.user),\n                    \"current_emailaddress\": EmailAddress.objects.get_verified(\n                        self.request.user\n                    ),\n                }\n            )\n        return ret\n\n    def get_ajax_data(self):\n        data = []\n        for emailaddress in self.request.user.emailaddress_set.all().order_by(\"pk\"):\n            data.append(\n                {\n                    \"id\": emailaddress.pk,\n                    \"email\": emailaddress.email,\n                    \"verified\": emailaddress.verified,\n                    \"primary\": emailaddress.primary,\n                }\n            )\n        return data\n\n    def get_success_url(self):\n        if (\n            self._did_send_verification_email\n            and app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED\n        ):\n            return reverse(\"account_email_verification_sent\")\n        return self.success_url\n\n\nemail = EmailView.as_view()\n\n\n@method_decorator(login_required, name=\"dispatch\")\n@method_decorator(rate_limit(action=\"change_password\"), name=\"dispatch\")\nclass PasswordChangeView(AjaxCapableProcessFormViewMixin, NextRedirectMixin, FormView):\n    template_name = f\"account/password_change.{app_settings.TEMPLATE_EXTENSION}\"\n    form_class = ChangePasswordForm\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"change_password\", self.form_class)\n\n    @sensitive_post_parameters_m\n    def dispatch(self, request, *args, **kwargs):\n        if not self.request.user.has_usable_password():\n            return HttpResponseRedirect(reverse(\"account_set_password\"))\n        return super().dispatch(request, *args, **kwargs)\n\n    def get_form_kwargs(self) -> dict:\n        kwargs = super().get_form_kwargs()\n        kwargs[\"user\"] = self.request.user\n        return kwargs\n\n    def get_default_success_url(self):\n        return get_adapter().get_password_change_redirect_url(self.request)\n\n    def form_valid(self, form) -> HttpResponse:\n        form.save()\n        flows.password_change.finalize_password_change(self.request, form.user)\n        return super().form_valid(form)\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        # NOTE: For backwards compatibility\n        ret[\"password_change_form\"] = ret.get(\"form\")\n        # (end NOTE)\n        return ret\n\n\npassword_change = PasswordChangeView.as_view()\n\n\n@method_decorator(login_required, name=\"dispatch\")\n@method_decorator(\n    # NOTE: 'change_password' (iso 'set_') is intentional, there is no need to\n    # differentiate between set and change.\n    rate_limit(action=\"change_password\"),\n    name=\"dispatch\",\n)\nclass PasswordSetView(AjaxCapableProcessFormViewMixin, NextRedirectMixin, FormView):\n    template_name = f\"account/password_set.{app_settings.TEMPLATE_EXTENSION}\"\n    form_class = SetPasswordForm\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"set_password\", self.form_class)\n\n    @sensitive_post_parameters_m\n    def dispatch(self, request, *args, **kwargs):\n        if self.request.user.has_usable_password():\n            return HttpResponseRedirect(reverse(\"account_change_password\"))\n        return super().dispatch(request, *args, **kwargs)\n\n    def get_form_kwargs(self) -> dict:\n        kwargs = super().get_form_kwargs()\n        kwargs[\"user\"] = self.request.user\n        return kwargs\n\n    def get_default_success_url(self):\n        return get_adapter().get_password_change_redirect_url(self.request)\n\n    def form_valid(self, form) -> HttpResponse:\n        form.save()\n        flows.password_change.finalize_password_set(self.request, form.user)\n        return super().form_valid(form)\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        # NOTE: For backwards compatibility\n        ret[\"password_set_form\"] = ret.get(\"form\")\n        # (end NOTE)\n        return ret\n\n\npassword_set = PasswordSetView.as_view()\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass PasswordResetView(NextRedirectMixin, AjaxCapableProcessFormViewMixin, FormView):\n    template_name = f\"account/password_reset.{app_settings.TEMPLATE_EXTENSION}\"\n    form_class = ResetPasswordForm\n    success_url = reverse_lazy(\"account_reset_password_done\")\n\n    def get_success_url(self) -> str:\n        if not app_settings.PASSWORD_RESET_BY_CODE_ENABLED:\n            return super().get_success_url()\n        return self.passthrough_next_url(reverse(\"account_confirm_password_reset_code\"))\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"reset_password\", self.form_class)\n\n    def form_valid(self, form) -> HttpResponse:\n        r429 = ratelimit.consume_or_429(\n            self.request,\n            action=\"reset_password\",\n            key=form.cleaned_data[\"email\"].lower(),\n        )\n        if r429:\n            return r429\n        form.save(self.request)\n        return super().form_valid(form)\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        login_url = self.passthrough_next_url(reverse(\"account_login\"))\n        # NOTE: For backwards compatibility\n        ret[\"password_reset_form\"] = ret.get(\"form\")\n        # (end NOTE)\n        ret.update({\"login_url\": login_url})\n        return ret\n\n\npassword_reset = PasswordResetView.as_view()\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass PasswordResetDoneView(TemplateView):\n    template_name = f\"account/password_reset_done.{app_settings.TEMPLATE_EXTENSION}\"\n\n\npassword_reset_done = PasswordResetDoneView.as_view()\n\n\n@method_decorator(rate_limit(action=\"reset_password_from_key\"), name=\"dispatch\")\n@method_decorator(login_not_required, name=\"dispatch\")\nclass PasswordResetFromKeyView(\n    AjaxCapableProcessFormViewMixin,\n    NextRedirectMixin,\n    LogoutFunctionalityMixin,\n    FormView,\n):\n    template_name = f\"account/password_reset_from_key.{app_settings.TEMPLATE_EXTENSION}\"\n    form_class = ResetPasswordKeyForm\n    success_url = reverse_lazy(\"account_reset_password_from_key_done\")\n    reset_url_key = \"set-password\"\n\n    def get_form_class(self):\n        return get_form_class(\n            app_settings.FORMS, \"reset_password_from_key\", self.form_class\n        )\n\n    def dispatch(self, request, uidb36, key, **kwargs) -> HttpResponseBase:\n        self.request = request\n        self.key = key\n\n        user_token_form_class = get_form_class(\n            app_settings.FORMS, \"user_token\", UserTokenForm\n        )\n        is_ajax = get_adapter().is_ajax(request)\n        if self.key == self.reset_url_key or is_ajax:\n            if not is_ajax:\n                self.key = self.request.session.get(INTERNAL_RESET_SESSION_KEY, \"\")\n            # (Ab)using forms here to be able to handle errors in XHR #890\n            token_form = user_token_form_class(data={\"uidb36\": uidb36, \"key\": self.key})\n            if token_form.is_valid():\n                self.reset_user = token_form.reset_user\n\n                # In the event someone clicks on a password reset link\n                # for one account while logged into another account,\n                # logout of the currently logged in account.\n                if (\n                    self.request.user.is_authenticated\n                    and self.request.user.pk != self.reset_user.pk\n                ):\n                    self.logout()\n                    self.request.session[INTERNAL_RESET_SESSION_KEY] = self.key\n\n                return super().dispatch(request, uidb36, self.key, **kwargs)\n        else:\n            token_form = user_token_form_class(data={\"uidb36\": uidb36, \"key\": self.key})\n            if token_form.is_valid():\n                # Store the key in the session and redirect to the\n                # password reset form at a URL without the key. That\n                # avoids the possibility of leaking the key in the\n                # HTTP Referer header.\n                self.request.session[INTERNAL_RESET_SESSION_KEY] = self.key\n                redirect_url = self.passthrough_next_url(\n                    self.request.path.replace(self.key, self.reset_url_key)\n                )\n                return redirect(redirect_url)\n\n        self.reset_user = None\n        response = self.render_to_response(self.get_context_data(token_fail=True))\n        return _ajax_response(self.request, response, form=token_form)\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        ret[\"action_url\"] = reverse(\n            \"account_reset_password_from_key\",\n            kwargs={\n                \"uidb36\": self.kwargs[\"uidb36\"],\n                \"key\": self.kwargs[\"key\"],\n            },\n        )\n        return ret\n\n    def get_form_kwargs(self) -> dict:\n        kwargs = super().get_form_kwargs()\n        kwargs[\"user\"] = self.reset_user\n        kwargs[\"temp_key\"] = self.key\n        return kwargs\n\n    def form_valid(self, form) -> HttpResponse:\n        form.save()\n        resp = flows.password_reset.finalize_password_reset(\n            self.request, self.reset_user\n        )\n        if resp:\n            return resp\n        return super().form_valid(form)\n\n\npassword_reset_from_key = PasswordResetFromKeyView.as_view()\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass PasswordResetFromKeyDoneView(TemplateView):\n    template_name = (\n        f\"account/password_reset_from_key_done.{app_settings.TEMPLATE_EXTENSION}\"\n    )\n\n\npassword_reset_from_key_done = PasswordResetFromKeyDoneView.as_view()\n\n\n@method_decorator(rate_limit(action=\"reset_password_from_key\"), name=\"dispatch\")\n@method_decorator(login_not_required, name=\"dispatch\")\nclass CompletePasswordResetView(\n    NextRedirectMixin,\n    FormView,\n):\n    template_name = f\"account/password_reset_from_key.{app_settings.TEMPLATE_EXTENSION}\"\n    form_class = ResetPasswordKeyForm\n    success_url = reverse_lazy(\"account_password_reset_completed\")\n\n    def dispatch(self, request, **kwargs) -> HttpResponseBase:\n        self._process = (\n            flows.password_reset_by_code.PasswordResetVerificationProcess.resume(\n                request\n            )\n        )\n        if not self._process:\n            return HttpResponseRedirect(\n                self.passthrough_next_url(reverse(\"account_reset_password\"))\n            )\n        if not self._process.state.get(\"code_confirmed\"):\n            return HttpResponseRedirect(reverse(\"account_confirm_password_reset_code\"))\n        return super().dispatch(request, **kwargs)\n\n    def get_form_class(self):\n        return get_form_class(\n            app_settings.FORMS, \"reset_password_from_key\", self.form_class\n        )\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        ret[\"action_url\"] = reverse(\"account_complete_password_reset\")\n        return ret\n\n    def get_form_kwargs(self):\n        kwargs = super().get_form_kwargs()\n        kwargs[\"user\"] = self._process.user\n        return kwargs\n\n    def form_valid(self, form):\n        form.save()\n        resp = self._process.finish()\n        if resp:\n            return resp\n        return super().form_valid(form)\n\n\ncomplete_password_reset = CompletePasswordResetView.as_view()\n\n\nclass ConfirmPasswordResetCodeView(NextRedirectMixin, FormView):\n    template_name = (\n        f\"account/confirm_password_reset_code.{app_settings.TEMPLATE_EXTENSION}\"\n    )\n    form_class = ConfirmPasswordResetCodeForm\n\n    @method_decorator(login_not_required)\n    def dispatch(self, request, *args, **kwargs) -> HttpResponseBase:\n        self._process = (\n            flows.password_reset_by_code.PasswordResetVerificationProcess.resume(\n                request\n            )\n        )\n        if not self._process:\n            return HttpResponseRedirect(reverse(\"account_login\"))\n        if self._process.state.get(\"code_confirmed\"):\n            return HttpResponseRedirect(reverse(\"account_complete_password_reset\"))\n        return super().dispatch(request, *args, **kwargs)\n\n    def get_form_class(self):\n        return get_form_class(\n            app_settings.FORMS, \"confirm_password_reset_code\", self.form_class\n        )\n\n    def get_form_kwargs(self):\n        ret = super().get_form_kwargs()\n        ret[\"code\"] = self._process.code\n        return ret\n\n    def get_context_data(self, **kwargs):\n        ret = super().get_context_data(**kwargs)\n        ret[\"email\"] = self._process.state[\"email\"]\n        ret[\"verify_form\"] = ret[\"form\"]\n        return ret\n\n    def form_valid(self, form):\n        self._process.confirm_code()\n        return HttpResponseRedirect(\n            self.passthrough_next_url(reverse(\"account_complete_password_reset\"))\n        )\n\n    def form_invalid(self, form):\n        attempts_left = self._process.record_invalid_attempt()\n        if attempts_left:\n            return super().form_invalid(form)\n        adapter = get_adapter(self.request)\n        adapter.add_message(\n            self.request,\n            messages.ERROR,\n            message=adapter.error_messages[\"too_many_login_attempts\"],\n        )\n        return HttpResponseRedirect(self.passthrough_next_url(reverse(\"account_login\")))\n\n\nconfirm_password_reset_code = ConfirmPasswordResetCodeView.as_view()\n\n\nclass LogoutView(NextRedirectMixin, LogoutFunctionalityMixin, TemplateView):\n    template_name = f\"account/logout.{app_settings.TEMPLATE_EXTENSION}\"\n\n    def get(self, *args, **kwargs) -> HttpResponse:\n        if app_settings.LOGOUT_ON_GET:\n            return self.post(*args, **kwargs)\n        if not self.request.user.is_authenticated:\n            response = redirect(self.get_redirect_url())\n            return _ajax_response(self.request, response)\n        ctx = self.get_context_data()\n        response = self.render_to_response(ctx)\n        return _ajax_response(self.request, response)\n\n    def post(self, *args, **kwargs) -> HttpResponse:\n        url = self.get_redirect_url()\n        self.logout()\n        response = redirect(url)\n        return _ajax_response(self.request, response)\n\n    def get_redirect_url(self) -> str:\n        return self.get_next_url() or get_adapter(self.request).get_logout_redirect_url(\n            self.request\n        )\n\n\nlogout = LogoutView.as_view()\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass AccountInactiveView(TemplateView):\n    template_name = f\"account/account_inactive.{app_settings.TEMPLATE_EXTENSION}\"\n\n\naccount_inactive = AccountInactiveView.as_view()\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass EmailVerificationSentView(TemplateView):\n    template_name = f\"account/verification_sent.{app_settings.TEMPLATE_EXTENSION}\"\n\n\nclass ConfirmEmailVerificationCodeView(NextRedirectMixin, FormView):\n    template_name = (\n        f\"account/confirm_email_verification_code.{app_settings.TEMPLATE_EXTENSION}\"\n    )\n    form_class = ConfirmEmailVerificationCodeForm\n\n    def dispatch(self, request, *args, **kwargs) -> HttpResponseBase:\n        self.stage = LoginStageController.enter(request, EmailVerificationStage.key)\n        self._process = (\n            flows.email_verification_by_code.EmailVerificationProcess.resume(request)\n        )\n        # preventing enumeration?\n        verification_is_fake = self._process and \"user_id\" not in self._process.state\n        # Can we at all continue?\n        if (\n            # No verification pending?\n            (not self._process)  # Anonymous, yet no stage (or fake verifcation)?\n            or (\n                request.user.is_anonymous\n                and not self.stage\n                and not verification_is_fake\n            )\n        ):\n            return HttpResponseRedirect(\n                reverse(\n                    \"account_login\" if request.user.is_anonymous else \"account_email\"\n                )\n            )\n        return super().dispatch(request, *args, **kwargs)\n\n    @cached_property\n    def _action(self):\n        action = self.request.POST.get(\"action\")\n        valid_actions = [\"verify\"]\n        if self._process.can_change:\n            valid_actions.append(\"change\")\n        if self._process.can_resend:\n            valid_actions.append(\"resend\")\n        if action not in valid_actions:\n            action = \"verify\"\n        return action\n\n    def get_form_class(self):\n        if self._action == \"change\":\n            return self._get_change_form_class()\n        elif self._action == \"resend\":\n            return Form\n        return self._get_verify_form_class()\n\n    def _get_change_form_class(self):\n        return get_form_class(app_settings.FORMS, \"change_email\", ChangeEmailForm)\n\n    def _get_verify_form_class(self):\n        return get_form_class(\n            app_settings.FORMS, \"confirm_email_verification_code\", self.form_class\n        )\n\n    def get_form_kwargs(self):\n        ret = super().get_form_kwargs()\n        if self._action == \"change\":\n            pass\n        elif self._action == \"verify\":\n            ret[\"code\"] = self._process.code if self._process else \"\"\n            ret[\"user\"] = self._process.user\n            ret[\"email\"] = self._process.email\n        return ret\n\n    def get_context_data(self, **kwargs):\n        ret = super().get_context_data(**kwargs)\n        ret[\"can_change\"] = self._process.can_change\n        ret[\"can_resend\"] = self._process.can_resend\n        ret[\"email\"] = self._process.state[\"email\"]\n        ret[\"cancel_url\"] = None if self.stage else reverse(\"account_email\")\n        if self._action == \"change\":\n            ret[\"change_form\"] = ret[\"form\"]\n            ret[\"verify_form\"] = self._get_verify_form_class()()\n        else:\n            ret[\"change_form\"] = self._get_change_form_class()()\n            ret[\"verify_form\"] = ret[\"form\"]\n        return ret\n\n    def form_valid(self, form) -> HttpResponse:\n        if self._action == \"change\":\n            return self._change_form_valid(form)\n        elif self._action == \"resend\":\n            return self._resend_form_valid(form)\n        return self._verify_form_valid(form)\n\n    def _resend_form_valid(self, form):\n        adapter = get_adapter()\n        try:\n            self._process.resend()\n        except RateLimited:\n            adapter.add_message(\n                self.request,\n                messages.ERROR,\n                message=adapter.error_messages[\"rate_limited\"],\n            )\n        return HttpResponseRedirect(\n            self.passthrough_next_url(reverse(\"account_email_verification_sent\"))\n        )\n\n    def _change_form_valid(self, form):\n        self._process.change_to(form.cleaned_data[\"email\"], form.account_already_exists)\n        return HttpResponseRedirect(\n            self.passthrough_next_url(reverse(\"account_email_verification_sent\"))\n        )\n\n    def _verify_form_valid(self, form):\n        email_address = self._process.finish()\n        if self.stage:\n            if not email_address:\n                return self.stage.abort()\n            return self.stage.exit()\n        url = self.get_next_url()\n        if url:\n            pass\n        elif not email_address:\n            url = reverse(\"account_email\")\n        else:\n            url = get_adapter(self.request).get_email_verification_redirect_url(\n                email_address\n            )\n        return HttpResponseRedirect(url)\n\n    def form_invalid(self, form):\n        if self._action == \"change\":\n            return self._change_form_invalid(form)\n        return self._verify_form_invalid(form)\n\n    def _verify_form_invalid(self, form):\n        attempts_left = self._process.record_invalid_attempt()\n        if attempts_left:\n            return super().form_invalid(form)\n        adapter = get_adapter(self.request)\n        adapter.add_message(\n            self.request,\n            messages.ERROR,\n            message=adapter.error_messages[\"too_many_login_attempts\"],\n        )\n        return HttpResponseRedirect(reverse(\"account_login\"))\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\ndef email_verification_sent(request) -> HttpResponseBase:\n    if app_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED:\n        return ConfirmEmailVerificationCodeView.as_view()(request)\n    else:\n        return EmailVerificationSentView.as_view()(request)\n\n\nclass BaseReauthenticateView(NextRedirectMixin, FormView):\n    def dispatch(self, request, *args, **kwargs) -> HttpResponseBase:\n        resp = self._check_reauthentication_method_available(request)\n        if resp:\n            return resp\n        resp = self._check_ratelimit(request)\n        if resp:\n            return resp\n        return super().dispatch(request, *args, **kwargs)\n\n    def _check_ratelimit(self, request):\n        return ratelimit.consume_or_429(\n            self.request,\n            action=\"reauthenticate\",\n            user=self.request.user,\n        )\n\n    def _check_reauthentication_method_available(self, request):\n        methods = get_adapter().get_reauthentication_methods(self.request.user)\n        if any([m[\"url\"] == request.path for m in methods]):\n            # Method is available\n            return None\n        if not methods:\n            # Reauthentication not available\n            raise PermissionDenied(\"Reauthentication not available\")\n        url = self.passthrough_next_url(methods[0][\"url\"])\n        return HttpResponseRedirect(url)\n\n    def get_default_success_url(self):\n        url = get_adapter(self.request).get_login_redirect_url(self.request)\n        return url\n\n    def form_valid(self, form) -> HttpResponse:\n        response = flows.reauthentication.resume_request(self.request)\n        if response:\n            return response\n        return super().form_valid(form)\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        ret.update(\n            {\n                \"reauthentication_alternatives\": self.get_reauthentication_alternatives(),\n            }\n        )\n        return ret\n\n    def get_reauthentication_alternatives(self):\n        methods = get_adapter().get_reauthentication_methods(self.request.user)\n        alts = []\n        for method in methods:\n            alt = dict(method)\n            if self.request.path == alt[\"url\"]:\n                continue\n            alt[\"url\"] = self.passthrough_next_url(alt[\"url\"])\n            alts.append(alt)\n        alts = sorted(alts, key=lambda alt: alt[\"description\"])\n        return alts\n\n\n@method_decorator(login_required, name=\"dispatch\")\nclass ReauthenticateView(BaseReauthenticateView):\n    form_class = ReauthenticateForm\n    template_name = f\"account/reauthenticate.{app_settings.TEMPLATE_EXTENSION}\"\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"reauthenticate\", self.form_class)\n\n    def get_form_kwargs(self) -> dict:\n        ret = super().get_form_kwargs()\n        ret[\"user\"] = self.request.user\n        return ret\n\n    def form_valid(self, form) -> HttpResponse:\n        flows.reauthentication.reauthenticate_by_password(self.request)\n        return super().form_valid(form)\n\n\nreauthenticate = ReauthenticateView.as_view()\n\n\nclass RequestLoginCodeView(RedirectAuthenticatedUserMixin, NextRedirectMixin, FormView):\n    form_class = RequestLoginCodeForm\n    template_name = f\"account/request_login_code.{app_settings.TEMPLATE_EXTENSION}\"\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"request_login_code\", self.form_class)\n\n    def form_valid(self, form) -> HttpResponse:\n        flows.login_by_code.LoginCodeVerificationProcess.initiate(\n            request=self.request,\n            user=form._user,\n            email=form.cleaned_data.get(\"email\"),\n            phone=form.cleaned_data.get(\"phone\"),\n        )\n        return super().form_valid(form)\n\n    def get_success_url(self):\n        if self.request.user.is_authenticated:\n            return None\n        url = reverse_lazy(\"account_confirm_login_code\")\n        url = self.passthrough_next_url(reverse(\"account_confirm_login_code\"))\n        return url\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        site = get_current_site(self.request)\n        ret.update({\"site\": site})\n        return ret\n\n\nrequest_login_code = RequestLoginCodeView.as_view()\n\n\ndef _login_by_code_urlname() -> str:\n    # NOTE: Having this as a method instead of a constant allows changing\n    # settings in test cases...\n    return (\n        \"account_request_login_code\"\n        if app_settings.LOGIN_BY_CODE_ENABLED\n        else \"account_login\"\n    )\n\n\n@method_decorator(\n    login_stage_required(\n        stage=LoginByCodeStage.key, redirect_urlname=(_login_by_code_urlname())\n    ),\n    name=\"dispatch\",\n)\nclass ConfirmLoginCodeView(NextRedirectMixin, FormView):\n    form_class = ConfirmLoginCodeForm\n    template_name = f\"account/confirm_login_code.{app_settings.TEMPLATE_EXTENSION}\"\n\n    @method_decorator(never_cache)\n    def dispatch(self, request, *args, **kwargs) -> HttpResponseBase:\n        self.stage = request._login_stage\n        self._process = flows.login_by_code.LoginCodeVerificationProcess.resume(\n            self.stage\n        )\n        if not self._process:\n            return HttpResponseRedirect(reverse(_login_by_code_urlname()))\n        return super().dispatch(request, *args, **kwargs)\n\n    @cached_property\n    def _action(self) -> str:\n        action = self.request.POST.get(\"action\")\n        valid_actions = [\"verify\"]\n        if self._process.can_resend:\n            valid_actions.append(\"resend\")\n        if action not in valid_actions:\n            action = \"verify\"\n        return action\n\n    def get_form_class(self):\n        if self._action == \"resend\":\n            return Form\n        return get_form_class(app_settings.FORMS, \"confirm_login_code\", self.form_class)\n\n    def get_form_kwargs(self) -> dict:\n        kwargs = super().get_form_kwargs()\n        if self._action == \"resend\":\n            pass\n        else:\n            kwargs[\"code\"] = self._process.code\n        return kwargs\n\n    def form_valid(self, form) -> HttpResponse:\n        if self._action == \"resend\":\n            return self._resend_form_valid(form)\n        return self._verify_form_valid(form)\n\n    def _resend_form_valid(self, form) -> HttpResponse:\n        try:\n            self._process.resend()\n        except RateLimited:\n            adapter = get_adapter()\n            adapter.add_message(\n                self.request,\n                messages.ERROR,\n                message=adapter.error_messages[\"rate_limited\"],\n            )\n        return HttpResponseRedirect(\n            self.passthrough_next_url(reverse(\"account_confirm_login_code\"))\n        )\n\n    def _verify_form_valid(self, form) -> HttpResponse:\n        redirect_url = self.get_next_url()\n        return self._process.finish(redirect_url)\n\n    def form_invalid(self, form) -> HttpResponse:\n        attempts_left = self._process.record_invalid_attempt()\n        if attempts_left:\n            return super().form_invalid(form)\n        adapter = get_adapter(self.request)\n        adapter.add_message(\n            self.request,\n            messages.ERROR,\n            message=adapter.error_messages[\"too_many_login_attempts\"],\n        )\n        return HttpResponseRedirect(\n            reverse(\n                _login_by_code_urlname()\n                if self._process.state[\"initiated_by_user\"]\n                else \"account_login\"\n            )\n        )\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        site = get_current_site(self.request)\n        email = self._process.state.get(\"email\")\n        phone = self._process.state.get(\"phone\")\n        ret.update(\n            {\n                \"can_resend\": self._process.can_resend,\n                \"site\": site,\n                \"email\": email,\n                \"phone\": phone,\n                \"verify_form\": ret[\"form\"],\n            }\n        )\n        return ret\n\n\nconfirm_login_code = ConfirmLoginCodeView.as_view()\n\n\nclass _BaseVerifyPhoneView(NextRedirectMixin, FormView):\n    form_class = VerifyPhoneForm\n    template_name = (\n        f\"account/confirm_phone_verification_code.{app_settings.TEMPLATE_EXTENSION}\"\n    )\n\n    @cached_property\n    def _action(self):\n        action = self.request.POST.get(\"action\")\n        valid_actions = [\"verify\"]\n        if self.process.can_change:\n            valid_actions.append(\"change\")\n        if self.process.can_resend:\n            valid_actions.append(\"resend\")\n        if action not in valid_actions:\n            action = \"verify\"\n        return action\n\n    def get_form_class(self):\n        if self._action == \"change\":\n            return self._get_change_form_class()\n        elif self._action == \"resend\":\n            return Form\n        return self._get_verify_form_class()\n\n    def _get_change_form_class(self):\n        return get_form_class(app_settings.FORMS, \"change_phone\", ChangePhoneForm)\n\n    def _get_verify_form_class(self):\n        return get_form_class(app_settings.FORMS, \"verify_phone\", self.form_class)\n\n    def get_form_kwargs(self):\n        kwargs = super().get_form_kwargs()\n        if self._action == \"change\":\n            kwargs[\"phone\"] = self.process.phone\n            kwargs[\"user\"] = self.process.user\n        elif self._action == \"resend\":\n            pass\n        else:\n            kwargs[\"code\"] = self.process.code\n            kwargs[\"phone\"] = self.process.phone\n            kwargs[\"user\"] = self.process.user\n        return kwargs\n\n    def form_valid(self, form) -> HttpResponse:\n        if self._action == \"change\":\n            return self._change_form_valid(form)\n        elif self._action == \"resend\":\n            return self._resend_form_valid(form)\n        return self._verify_form_valid(form)\n\n    def _resend_form_valid(self, form):\n        try:\n            self.process.resend()\n        except RateLimited:\n            adapter = get_adapter()\n            adapter.add_message(\n                self.request,\n                messages.ERROR,\n                message=adapter.error_messages[\"rate_limited\"],\n            )\n        return HttpResponseRedirect(\n            self.passthrough_next_url(reverse(\"account_verify_phone\"))\n        )\n\n    def _change_form_valid(self, form):\n        self.process.change_to(form.cleaned_data[\"phone\"], form.account_already_exists)\n        return HttpResponseRedirect(\n            self.passthrough_next_url(reverse(\"account_verify_phone\"))\n        )\n\n    def _verify_form_valid(self, form):\n        self.process.finish()\n        return self.respond_process_succeeded(form)\n\n    def form_invalid(self, form) -> HttpResponse:\n        if self._action == \"change\":\n            return self._change_form_invalid(form)\n        return self._verify_form_invalid(form)\n\n    def _change_form_invalid(self, form):\n        return super().form_invalid(form)\n\n    def _verify_form_invalid(self, form):\n        attempts_left = self.process.record_invalid_attempt()\n        if attempts_left:\n            return super().form_invalid(form)\n        self.process.abort()\n        return self.respond_process_failed(form)\n\n    def get_context_data(self, **kwargs):\n        ret = super().get_context_data(**kwargs)\n        ret[\"can_change\"] = self.process.can_change\n        ret[\"can_resend\"] = self.process.can_resend\n        site = get_current_site(self.request)\n        if self._action == \"change\":\n            ret[\"change_form\"] = ret[\"form\"]\n            ret[\"verify_form\"] = self._get_verify_form_class()()\n        else:\n            ret[\"change_form\"] = self._get_change_form_class()()\n            ret[\"verify_form\"] = ret[\"form\"]\n        ret.update(\n            {\n                \"site\": site,\n                \"phone\": self.process.phone,\n                \"action\": self._action,\n            }\n        )\n        return ret\n\n\n@method_decorator(\n    login_stage_required(\n        stage=PhoneVerificationStage.key, redirect_urlname=\"account_login\"\n    ),\n    name=\"dispatch\",\n)\nclass _VerifyPhoneSignupView(_BaseVerifyPhoneView):\n    @method_decorator(never_cache)\n    def dispatch(self, request, *args, **kwargs) -> HttpResponseBase:\n        self.stage = request._login_stage\n        self.process = flows.phone_verification.PhoneVerificationStageProcess.resume(\n            self.stage\n        )\n        if not self.process:\n            return self.stage.abort()\n        return super().dispatch(request, *args, **kwargs)\n\n    def respond_process_succeeded(self, form):\n        return self.stage.exit()\n\n    def respond_process_failed(self, form):\n        adapter = get_adapter(self.request)\n        adapter.add_message(\n            self.request,\n            messages.ERROR,\n            message=adapter.error_messages[\"too_many_login_attempts\"],\n        )\n        return self.stage.abort()\n\n\nclass _VerifyPhoneChangeView(_BaseVerifyPhoneView):\n    @method_decorator(never_cache)\n    def dispatch(self, request, *args, **kwargs) -> HttpResponseBase:\n        self.process = flows.phone_verification.ChangePhoneVerificationProcess.resume(\n            request\n        )\n        if not self.process:\n            return HttpResponseRedirect(reverse(\"account_change_phone\"))\n        return super().dispatch(request, *args, **kwargs)\n\n    def respond_process_succeeded(self, form):\n        return HttpResponseRedirect(reverse(\"account_change_phone\"))\n\n    def respond_process_failed(self, form):\n        return HttpResponseRedirect(reverse(\"account_change_phone\"))\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        ret.update({\"cancel_url\": reverse(\"account_change_phone\")})\n        return ret\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\ndef verify_phone(request):\n    if request.user.is_authenticated:\n        return _VerifyPhoneChangeView.as_view()(request)\n    return _VerifyPhoneSignupView.as_view()(request)\n\n\n@method_decorator(login_required, name=\"dispatch\")\n@method_decorator(rate_limit(action=\"change_phone\"), name=\"dispatch\")\nclass ChangePhoneView(FormView):\n    template_name = f\"account/phone_change.{app_settings.TEMPLATE_EXTENSION}\"\n    form_class = ChangePhoneForm\n    success_url = reverse_lazy(\"account_verify_phone\")\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"change_phone\", self.form_class)\n\n    def get_form_kwargs(self) -> dict:\n        ret = super().get_form_kwargs()\n        self._phone_verified = get_adapter().get_phone(self.request.user)\n        if (\n            self.request.POST.get(\"action\") == \"verify\"\n            and self._phone_verified\n            and not self._phone_verified[1]\n        ):\n            # We're (re-)sending the verificaton code, so just feed the existing\n            # phone to the form...\n            ret[\"data\"] = {\"phone\": self._phone_verified[0]}\n            ret[\"phone\"] = None\n        else:\n            ret[\"phone\"] = self._phone_verified[0] if self._phone_verified else None\n        ret[\"user\"] = self.request.user\n        return ret\n\n    def form_valid(self, form) -> HttpResponse:\n        flows.phone_verification.ChangePhoneVerificationProcess.initiate(\n            self.request, form.cleaned_data[\"phone\"]\n        )\n        return super().form_valid(form)\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        phone = None\n        phone_verified = False\n        if self._phone_verified:\n            phone, phone_verified = self._phone_verified\n        ret.update(\n            {\n                \"phone\": phone,\n                \"phone_verified\": phone_verified,\n            }\n        )\n        return ret\n\n\nchange_phone = ChangePhoneView.as_view()\n"
  },
  {
    "path": "allauth/app_settings.py",
    "content": "from django.apps import apps\n\nfrom allauth.core.internal.cryptokit import UserCodeFormat\n\n\nclass AppSettings:\n    def __init__(self, prefix: str) -> None:\n        self.prefix = prefix\n\n    def _setting(self, name: str, dflt):\n        from allauth.utils import get_setting\n\n        return get_setting(self.prefix + name, dflt)\n\n    @property\n    def SITES_ENABLED(self) -> bool:\n        return apps.is_installed(\"django.contrib.sites\")\n\n    @property\n    def SOCIALACCOUNT_ENABLED(self) -> bool:\n        return apps.is_installed(\"allauth.socialaccount\")\n\n    @property\n    def SOCIALACCOUNT_ONLY(self) -> bool:\n        from allauth.utils import get_setting\n\n        return get_setting(\"SOCIALACCOUNT_ONLY\", False)\n\n    @property\n    def MFA_ENABLED(self) -> bool:\n        return apps.is_installed(\"allauth.mfa\")\n\n    @property\n    def USERSESSIONS_ENABLED(self) -> bool:\n        return apps.is_installed(\"allauth.usersessions\")\n\n    @property\n    def HEADLESS_ENABLED(self) -> bool:\n        return apps.is_installed(\"allauth.headless\")\n\n    @property\n    def HEADLESS_ONLY(self) -> bool:\n        from allauth.utils import get_setting\n\n        return get_setting(\"HEADLESS_ONLY\", False)\n\n    @property\n    def DEFAULT_AUTO_FIELD(self):\n        return self._setting(\"DEFAULT_AUTO_FIELD\", None)\n\n    @property\n    def TRUSTED_PROXY_COUNT(self) -> int:\n        \"\"\"\n        As the ``X-Forwarded-For`` header can be spoofed, you need to\n        configure the number of proxies that are under your control and hence,\n        can be trusted. The default is 0, meaning, no proxies are trusted.  As a\n        result, the ``X-Forwarded-For`` header will be disregarded by default.\n        \"\"\"\n        return self._setting(\"TRUSTED_PROXY_COUNT\", 0)\n\n    @property\n    def TRUSTED_CLIENT_IP_HEADER(self) -> str | None:\n        \"\"\"\n        If your service is running behind a trusted proxy that sets a custom header\n        containing the client IP address, specify that header name here. The client\n        IP will be extracted from this header instead of ``X-Forwarded-For``.\n        Examples: ``\"CF-Connecting-IP\"`` (Cloudflare), ``\"X-Real-IP\"`` (nginx).\n        \"\"\"\n        return self._setting(\"TRUSTED_CLIENT_IP_HEADER\", None)\n\n    @property\n    def USER_CODE_FORMAT(self) -> UserCodeFormat:\n        \"\"\"\n        Controls the format of user-facing verification codes (e.g. email\n        verification, phone verification, login codes).\n        \"\"\"\n        return self._setting(\"USER_CODE_FORMAT\", {})\n\n\n_app_settings = AppSettings(\"ALLAUTH_\")\n\n\ndef __getattr__(name):\n    # See https://peps.python.org/pep-0562/\n    return getattr(_app_settings, name)\n"
  },
  {
    "path": "allauth/core/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/core/context.py",
    "content": "from contextlib import contextmanager\nfrom contextvars import ContextVar\n\n\n_request_var = ContextVar(\"request\", default=None)\n\n\ndef __getattr__(name):\n    if name == \"request\":\n        return _request_var.get()\n    raise AttributeError(name)\n\n\n@contextmanager\ndef request_context(request):\n    token = _request_var.set(request)\n    try:\n        yield\n    finally:\n        _request_var.reset(token)\n"
  },
  {
    "path": "allauth/core/exceptions.py",
    "content": "class ImmediateHttpResponse(Exception):\n    \"\"\"\n    This exception is used to interrupt the flow of processing to immediately\n    return a custom HttpResponse.\n    \"\"\"\n\n    def __init__(self, response):\n        self.response = response\n\n\nclass ReauthenticationRequired(Exception):\n    \"\"\"\n    The action could not be performed because the user needs to\n    reauthenticate.\n    \"\"\"\n\n    pass\n\n\nclass SignupClosedException(Exception):\n    \"\"\"\n    Throws when attemtping to signup while signup is closed.\n    \"\"\"\n\n    pass\n\n\nclass RateLimited(Exception):\n    pass\n"
  },
  {
    "path": "allauth/core/internal/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/core/internal/adapter.py",
    "content": "from django.core.exceptions import ValidationError\n\nfrom allauth.core import context\n\n\nclass BaseAdapter:\n    def __init__(self, request=None):\n        # Explicitly passing `request` is deprecated, just use:\n        # `allauth.core.context.request`.\n        self.request = context.request\n\n    def validation_error(self, code, *args):\n        message = self.error_messages[code]\n        if args:\n            message = message % args\n        exc = ValidationError(message, code=code)\n        return exc\n"
  },
  {
    "path": "allauth/core/internal/cryptokit.py",
    "content": "import math\nimport string\nfrom typing import TypedDict\n\nfrom django.utils.crypto import get_random_string\n\n\nclass UserCodeFormat(TypedDict, total=False):\n    dashed: bool\n    length: int\n    numeric: bool\n\n\n# https://datatracker.ietf.org/doc/html/rfc8628#section-6.1\n_ALPHA_ALLOWED_CHARS = \"BCDFGHJKLMNPQRSTVWXZ\"\n\n\ndef generate_user_code(\n    *,\n    length: int | None = None,\n    numeric: bool = False,\n    allowed_chars: str | None = None,\n    dashed: bool = True,\n) -> str:\n    \"\"\" \"\"\"\n    if not allowed_chars:\n        if numeric:\n            allowed_chars = string.digits\n        else:\n            allowed_chars = _ALPHA_ALLOWED_CHARS\n    if length is None:\n        length = 9 if numeric else 8\n    code = get_random_string(length=length, allowed_chars=allowed_chars)\n    if dashed:\n        parts = 2 if length <= 8 else 3\n        chunk = math.ceil(length / parts)\n        code = \"-\".join(code[i : i + chunk] for i in range(0, length, chunk))\n    return code\n\n\ndef _strip_punctuation(code: str) -> str:\n    \"\"\"https://datatracker.ietf.org/doc/html/rfc8628#section-6.1\n\n    When processing the inputted user code, the server should strip dashes and\n    other punctuation that it added for readability (making the inclusion of\n    such punctuation by the user optional).\n    \"\"\"\n    return code.translate(str.maketrans(\"\", \"\", string.punctuation + string.whitespace))\n\n\ndef compare_user_code(*, actual: str, expected: str) -> bool:\n    actual = _strip_punctuation(actual).lower()\n    expected = _strip_punctuation(expected).lower()\n    return bool(expected) and actual == expected\n"
  },
  {
    "path": "allauth/core/internal/httpkit.py",
    "content": "import ipaddress\nimport json\nfrom urllib.parse import parse_qs, quote, urlencode, urlparse, urlunparse\n\nfrom django import shortcuts\nfrom django.core.exceptions import ImproperlyConfigured\nfrom django.http import (\n    HttpRequest,\n    HttpResponseRedirect,\n    HttpResponseServerError,\n    QueryDict,\n)\nfrom django.http.request import split_domain_port\nfrom django.urls import NoReverseMatch, reverse\n\nfrom allauth import app_settings as allauth_settings\n\n\nHTTP_USER_AGENT_MAX_LENGTH = 200\n\n\ndef serialize_request(request):\n    return json.dumps(\n        {\n            \"path\": request.path,\n            \"path_info\": request.path_info,\n            \"META\": {k: v for k, v in request.META.items() if isinstance(v, str)},\n            \"GET\": request.GET.urlencode(),\n            \"POST\": request.POST.urlencode(),\n            \"method\": request.method,\n            \"scheme\": request.scheme,\n        }\n    )\n\n\ndef deserialize_request(s, request):\n    data = json.loads(s)\n    request.GET = QueryDict(data[\"GET\"])\n    request.POST = QueryDict(data[\"POST\"])\n    request.META = data[\"META\"]\n    request.path = data[\"path\"]\n    request.path_info = data[\"path_info\"]\n    request.method = data[\"method\"]\n    request._get_scheme = lambda: data[\"scheme\"]\n    return request\n\n\ndef redirect(to):\n    try:\n        return shortcuts.redirect(to)\n    except NoReverseMatch:\n        return shortcuts.redirect(f\"/{to}\")\n\n\ndef del_query_params(url: str, *params: str) -> str:\n    parsed_url = urlparse(url)\n    query_params = parse_qs(parsed_url.query, keep_blank_values=True)\n    for param in params:\n        query_params.pop(param, None)\n    encoded_query = urlencode(query_params, doseq=True)\n    new_url = urlunparse(\n        (\n            parsed_url.scheme,\n            parsed_url.netloc,\n            parsed_url.path,\n            parsed_url.params,\n            encoded_query,\n            parsed_url.fragment,\n        )\n    )\n    return new_url\n\n\ndef add_query_params(url: str, params: dict) -> str:\n    parsed_url = urlparse(url)\n    query_params = parse_qs(parsed_url.query)\n    query_params.update(params)\n    encoded_query = urlencode(query_params, doseq=True)\n    new_url = urlunparse(\n        (\n            parsed_url.scheme,\n            parsed_url.netloc,\n            parsed_url.path,\n            parsed_url.params,\n            encoded_query,\n            parsed_url.fragment,\n        )\n    )\n    return new_url\n\n\ndef render_url(request, url_template, **kwargs):\n    url = url_template\n    for k, v in kwargs.items():\n        qi = url.find(\"?\")\n        ki = url.find(f\"{{{k}}}\")\n        if ki < 0:\n            raise ImproperlyConfigured(url_template)\n        is_query_param = qi >= 0 and ki > qi\n        if is_query_param:\n            qv = urlencode({\"k\": v}).partition(\"k=\")[2]\n        else:\n            qv = quote(v)\n        url = url.replace(f\"{{{k}}}\", qv)\n    p = urlparse(url)\n    if not p.netloc:\n        url = request.build_absolute_uri(url)\n    return url\n\n\ndef default_get_frontend_url(request, urlname, **kwargs):\n    from allauth import app_settings as allauth_settings\n\n    if allauth_settings.HEADLESS_ENABLED:\n        from allauth.headless import app_settings as headless_settings\n\n        url = headless_settings.FRONTEND_URLS.get(urlname)\n        if allauth_settings.HEADLESS_ONLY and not url:\n            raise ImproperlyConfigured(f\"settings.HEADLESS_FRONTEND_URLS['{urlname}']\")\n        if url:\n            return render_url(request, url, **kwargs)\n    return None\n\n\ndef get_frontend_url(request, urlname, **kwargs):\n    from allauth import app_settings as allauth_settings\n\n    if allauth_settings.HEADLESS_ENABLED:\n        from allauth.headless.adapter import get_adapter\n\n        return get_adapter().get_frontend_url(urlname, **kwargs)\n    return default_get_frontend_url(request, urlname, **kwargs)\n\n\ndef headed_redirect_response(viewname, query=None):\n    \"\"\"\n    In some cases, we're redirecting to a non-headless view. In case of\n    headless-only mode, that view clearly does not exist.\n    \"\"\"\n    try:\n        url = reverse(viewname)\n        if query:\n            url = add_query_params(url, query)\n        return HttpResponseRedirect(url)\n    except NoReverseMatch:\n        if allauth_settings.HEADLESS_ONLY:\n            # The response we would be rendering here is not actually used.\n            return HttpResponseServerError()\n        raise\n\n\ndef is_headless_request(request: HttpRequest) -> str | None:\n    \"\"\"\n    Returns the headless client type (app/browser)in case of a headless\n    request.\n    \"\"\"\n    return getattr(\n        getattr(getattr(request, \"allauth\", None), \"headless\", None), \"client\", None\n    )\n\n\ndef get_authorization_credential(request: HttpRequest, auth_scheme: str) -> str | None:\n    auth = request.META.get(\"HTTP_AUTHORIZATION\")\n    if not auth:\n        return None\n    parts = auth.split()\n    if not parts or len(parts) != 2 or parts[0].lower() != auth_scheme.lower():\n        return None\n    return parts[1]\n\n\ndef clean_client_ip(ip: str) -> str | None:\n    \"\"\"\n    Try to parse the value as an IP address to make sure it's a valid one.\n    \"\"\"\n    ip = ip.strip()\n    try:\n        domain, port = split_domain_port(ip)\n        if port and domain:\n            ip = domain\n            # If Django splits off the port of an IPv6 address, the domain\n            # has brackets.\n            if ip[0] == \"[\" and ip[-1] == \"]\":\n                ip = ip[1:-1]\n        ip = str(ipaddress.ip_address(ip))\n    except ValueError:\n        return None\n    else:\n        return ip\n\n\ndef get_client_ip_from_xff(request: HttpRequest) -> str | None:\n    trusted_proxy_count = allauth_settings.TRUSTED_PROXY_COUNT\n    xff = request.headers.get(\"x-forwarded-for\")\n    if trusted_proxy_count > 0 and xff:\n        ips = xff.split(\",\")\n        if len(ips) < trusted_proxy_count:\n            raise ImproperlyConfigured(\n                \"ALLAUTH_TRUSTED_PROXY_COUNT does not match X-Forwarded-For\"\n            )\n        ip = ips[-trusted_proxy_count]\n    else:\n        ip = None\n    return ip\n\n\ndef get_client_ip(request: HttpRequest) -> str | None:\n    trusted_client_ip_header = allauth_settings.TRUSTED_CLIENT_IP_HEADER\n    if trusted_client_ip_header:\n        ip = request.headers.get(trusted_client_ip_header)\n    else:\n        ip = get_client_ip_from_xff(request)\n        if not ip:\n            ip = request.META[\"REMOTE_ADDR\"]\n    return clean_client_ip(ip) if ip else None\n"
  },
  {
    "path": "allauth/core/internal/jwkkit.py",
    "content": "# https://github.com/jpadilla/pyjwt/issues/1032\nimport base64\nimport hashlib\nimport json\n\nimport jwt\nfrom cryptography.hazmat.primitives.asymmetric.rsa import RSAPrivateKey\nfrom cryptography.hazmat.primitives.serialization import load_pem_private_key\nfrom jwt.algorithms import RSAAlgorithm\n\n\n# In lexicographic order as described in RFC7638\nJWK_REQUIRED_MEMBERS = {\n    \"EC\": (\"crv\", \"kty\", \"x\", \"y\"),\n    \"RSA\": (\"e\", \"kty\", \"n\"),\n    \"oct\": (\"k\", \"kty\"),\n}\n\n\ndef jwk_thumbprint(jwk_dict: dict) -> str:\n    key_type = jwk_dict[\"kty\"]\n    members = JWK_REQUIRED_MEMBERS.get(key_type)\n    if members is None:\n        raise jwt.exceptions.PyJWKError(f\"Unable to canonicalize key type {key_type}\")\n    json_bytes = json.dumps(\n        {k: jwk_dict[k] for k in members},\n        separators=(\",\", \":\"),\n    ).encode()\n    json_hash = hashlib.sha256(json_bytes).digest()\n    return base64.urlsafe_b64encode(json_hash).rstrip(b\"=\").decode()\n\n\ndef load_pem(pem: str) -> RSAPrivateKey:\n    private_key = load_pem_private_key(\n        pem.encode(\"utf8\"),\n        password=None,\n    )\n    if not isinstance(private_key, RSAPrivateKey):\n        raise ValueError\n    return private_key\n\n\ndef load_jwk_from_pem(pem: str) -> tuple[dict, RSAPrivateKey]:\n    private_key = load_pem(pem)\n    public_key = private_key.public_key()\n    jwk_dict = json.loads(RSAAlgorithm.to_jwk(public_key))\n    jwk_dict[\"kid\"] = jwk_thumbprint(jwk_dict)\n    return jwk_dict, private_key\n"
  },
  {
    "path": "allauth/core/internal/modelkit.py",
    "content": "import base64\nimport json\n\nfrom django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured\nfrom django.core.files.base import ContentFile\nfrom django.core.serializers.json import DjangoJSONEncoder\nfrom django.db.models import FileField\nfrom django.db.models.fields import BinaryField, DateField, DateTimeField, TimeField\nfrom django.utils import dateparse\nfrom django.utils.encoding import force_bytes, force_str\n\n\nSERIALIZED_DB_FIELD_PREFIX = \"_db_\"\n\n\ndef serialize_instance(instance) -> dict:\n    \"\"\"\n    Since Django 1.6 items added to the session are no longer pickled,\n    but JSON encoded by default. We are storing partially complete models\n    in the session (user, account, token, ...). We cannot use standard\n    Django serialization, as these are models are not \"complete\" yet.\n    Serialization will start complaining about missing relations et al.\n    \"\"\"\n    data = {}\n    for k, v in instance.__dict__.items():\n        if k.startswith(\"_\") or callable(v):\n            continue\n        try:\n            field = instance._meta.get_field(k)\n            if isinstance(field, BinaryField):\n                if v is not None:\n                    v = force_str(base64.b64encode(v))\n            elif isinstance(field, FileField):\n                if v and not isinstance(v, str):\n                    v = {\n                        \"name\": v.name,\n                        \"content\": base64.b64encode(v.read()).decode(\"ascii\"),\n                    }\n            # Check if the field is serializable. If not, we'll fall back\n            # to serializing the DB values which should cover most use cases.\n            try:\n                json.dumps(v, cls=DjangoJSONEncoder)\n            except TypeError:\n                v = field.get_prep_value(v)\n                k = SERIALIZED_DB_FIELD_PREFIX + k\n        except FieldDoesNotExist:\n            pass\n        data[k] = v\n    return json.loads(json.dumps(data, cls=DjangoJSONEncoder))\n\n\ndef deserialize_instance(model, data):\n    if not isinstance(data, dict):\n        raise ValueError()\n    ret = model()\n    for k, v in data.items():\n        is_db_value = False\n        if k.startswith(SERIALIZED_DB_FIELD_PREFIX):\n            k = k[len(SERIALIZED_DB_FIELD_PREFIX) :]\n            is_db_value = True\n        if v is not None:\n            try:\n                f = model._meta.get_field(k)\n                if isinstance(f, DateTimeField):\n                    v = dateparse.parse_datetime(v)\n                elif isinstance(f, TimeField):\n                    v = dateparse.parse_time(v)\n                elif isinstance(f, DateField):\n                    v = dateparse.parse_date(v)\n                elif isinstance(f, BinaryField):\n                    v = force_bytes(base64.b64decode(force_bytes(v)))\n                elif isinstance(f, FileField):\n                    if isinstance(v, dict):\n                        v = ContentFile(base64.b64decode(v[\"content\"]), name=v[\"name\"])\n                elif is_db_value:\n                    try:\n                        # This is quite an ugly hack, but will cover most\n                        # use cases...\n                        # The signature of `from_db_value` changed in Django 3\n                        # https://docs.djangoproject.com/en/3.0/releases/3.0/#features-removed-in-3-0\n                        v = f.from_db_value(v, None, None)\n                    except Exception:\n                        raise ImproperlyConfigured(\n                            f\"Unable to auto serialize field '{k}', custom serialization override required\"\n                        )\n            except FieldDoesNotExist:\n                pass\n        setattr(ret, k, v)\n    return ret\n"
  },
  {
    "path": "allauth/core/internal/ratelimit.py",
    "content": "\"\"\"\nRate limiting in this implementation relies on a cache and uses non-atomic\noperations, making it vulnerable to race conditions. As a result, users may\noccasionally bypass the intended rate limit due to concurrent access. However,\nsuch race conditions are rare in practice. For example, if the limit is set to\n10 requests per minute and a large number of parallel processes attempt to test\nthat limit, you may occasionally observe slight overruns—such as 11 or 12\nrequests slipping through. Nevertheless, exceeding the limit by a large margin\nis highly unlikely due to the low probability of many processes entering the\ncritical non-atomic code section simultaneously.\n\"\"\"\n\nimport hashlib\nimport time\nfrom collections import namedtuple\nfrom dataclasses import dataclass\nfrom http import HTTPStatus\n\nfrom django.core.cache import cache\nfrom django.core.exceptions import ImproperlyConfigured\nfrom django.http import HttpRequest, HttpResponse\nfrom django.shortcuts import render\nfrom django.template.exceptions import TemplateDoesNotExist\n\nfrom allauth.core.exceptions import RateLimited\n\n\nRate = namedtuple(\"Rate\", \"amount duration per\")\n\n\n@dataclass\nclass SingleRateLimitUsage:\n    cache_key: str\n    cache_duration: float | int\n    timestamp: float\n\n    def rollback(self) -> None:\n        history = cache.get(self.cache_key, [])\n        history = [ts for ts in history if ts != self.timestamp]\n        cache.set(self.cache_key, history, self.cache_duration)\n\n\n@dataclass\nclass RateLimitUsage:\n    usage: list[SingleRateLimitUsage]\n\n    def rollback(self) -> None:\n        for usage in self.usage:\n            usage.rollback()\n\n\ndef parse_duration(duration) -> int | float:\n    if len(duration) == 0:\n        raise ValueError(duration)\n    unit = duration[-1]\n    value = duration[0:-1]\n    unit_map = {\"s\": 1, \"m\": 60, \"h\": 3600, \"d\": 86400}\n    if unit not in unit_map:\n        raise ValueError(f\"Invalid duration unit: {unit}\")\n    if len(value) == 0:\n        value = 1\n    else:\n        value = float(value)\n    return value * unit_map[unit]\n\n\ndef parse_rate(rate: str) -> Rate:\n    parts = rate.split(\"/\")\n    if len(parts) == 2:\n        amount, duration = parts\n        per = \"ip\"\n    elif len(parts) == 3:\n        amount, duration, per = parts\n    else:\n        raise ValueError(rate)\n    amount_v = int(amount)\n    duration_v = parse_duration(duration)\n    return Rate(amount_v, duration_v, per)\n\n\ndef parse_rates(rates: str | None) -> list[Rate]:\n    ret = []\n    if rates:\n        rates = rates.strip()\n        if rates:\n            parts = rates.split(\",\")\n            for part in parts:\n                ret.append(parse_rate(part.strip()))\n    return ret\n\n\ndef get_cache_key(request, *, action: str, rate: Rate, key=None, user=None) -> str:\n    from allauth.account.adapter import get_adapter\n\n    source: tuple[str, ...]\n    if rate.per == \"ip\":\n        source = (\"ip\", get_adapter().get_client_ip(request))\n    elif rate.per == \"user\":\n        if user is None:\n            if not request.user.is_authenticated:\n                raise ImproperlyConfigured(\n                    \"ratelimit configured per user but used anonymously\"\n                )\n            user = request.user\n        source = (\"user\", str(user.pk))\n    elif rate.per == \"key\":\n        if key is None:\n            raise ImproperlyConfigured(\n                \"ratelimit configured per key but no key specified\"\n            )\n        key_hash = hashlib.sha256(key.encode(\"utf8\")).hexdigest()\n        source = (key_hash,)\n    else:\n        raise ValueError(rate.per)\n    keys = [\"allauth\", \"rl\", action, *source]\n    return \":\".join(keys)\n\n\ndef _consume_single_rate(\n    request,\n    *,\n    action: str,\n    rate: Rate,\n    key=None,\n    user=None,\n    dry_run: bool = False,\n    raise_exception: bool = False,\n) -> SingleRateLimitUsage | None:\n    cache_key = get_cache_key(request, action=action, rate=rate, key=key, user=user)\n    history = cache.get(cache_key, [])\n    now = time.time()\n    while history and history[-1] <= now - rate.duration:\n        history.pop()\n    allowed = len(history) < rate.amount\n    if allowed:\n        usage = SingleRateLimitUsage(\n            cache_key=cache_key, timestamp=now, cache_duration=rate.duration\n        )\n    else:\n        usage = None\n    if allowed and not dry_run:\n        history.insert(0, now)\n        cache.set(cache_key, history, rate.duration)\n    if not allowed and raise_exception:\n        raise RateLimited\n    return usage\n\n\ndef consume(\n    request: HttpRequest,\n    *,\n    action: str,\n    config: dict[str, str],\n    key=None,\n    user=None,\n    dry_run: bool = False,\n    limit_get: bool = False,\n    raise_exception: bool = False,\n) -> RateLimitUsage | None:\n    usage = RateLimitUsage(usage=[])\n    if (not limit_get) and request.method == \"GET\":\n        return usage\n    rates = parse_rates(config.get(action))\n    if not rates:\n        return usage\n    allowed = True\n    for rate in rates:\n        single_usage = _consume_single_rate(\n            request,\n            action=action,\n            rate=rate,\n            key=key,\n            user=user,\n            dry_run=dry_run,\n            raise_exception=raise_exception,\n        )\n        if not single_usage:\n            allowed = False\n            break\n        usage.usage.append(single_usage)\n    return usage if allowed else None\n\n\ndef handler429(request) -> HttpResponse:\n    from allauth.account import app_settings\n\n    try:\n        return render(\n            request,\n            f\"429.{app_settings.TEMPLATE_EXTENSION}\",\n            status=HTTPStatus.TOO_MANY_REQUESTS,\n        )\n    except TemplateDoesNotExist:\n        content = \"\"\"<html>\n    <head><title>Too Many Requests</title></head>\n    <body>\n        <h1>429 Too Many Requests</h1>\n        <p>You have sent too many requests. Please try again later.</p>\n    </body>\n</html>\"\"\"\n        return HttpResponse(\n            content=content,\n            content_type=\"text/html\",\n            status=HTTPStatus.TOO_MANY_REQUESTS,\n        )\n\n\ndef clear(request, *, config: dict, action: str, key=None, user=None) -> None:\n    rates = parse_rates(config.get(action))\n    for rate in rates:\n        cache_key = get_cache_key(request, action=action, rate=rate, key=key, user=user)\n        cache.delete(cache_key)\n"
  },
  {
    "path": "allauth/core/internal/sessionkit.py",
    "content": "from django.contrib.auth import get_user\nfrom django.contrib.sessions.backends.base import SessionBase\nfrom django.http import HttpRequest\n\n\ndef get_session_user(session: SessionBase):\n    request = HttpRequest()\n    request.session = session\n    user = get_user(request)\n    if not user or user.is_anonymous:\n        return None\n    return user\n"
  },
  {
    "path": "allauth/core/internal/urlkit.py",
    "content": "from django.conf import settings\nfrom django.urls import resolve\n\n\ndef script_aware_resolve(path: str):\n    \"\"\"\n    Django's reverse/resolve is asymmetric. reverse() adds `FORCE_SCRIPT_NAME`,\n    yet, resolve() won't handle it.\n    \"\"\"\n    if settings.FORCE_SCRIPT_NAME and path.startswith(settings.FORCE_SCRIPT_NAME):\n        path = path.removeprefix(settings.FORCE_SCRIPT_NAME)\n    return resolve(path)\n"
  },
  {
    "path": "allauth/core/ratelimit.py",
    "content": "from django.conf import settings\nfrom django.http import HttpResponse\n\nfrom allauth import app_settings\nfrom allauth.core.exceptions import RateLimited  # noqa\nfrom allauth.core.internal import ratelimit as _impl\nfrom allauth.core.internal.ratelimit import Rate  # noqa\nfrom allauth.utils import import_callable\n\n\ndef clear(request, *, action: str, key=None, user=None) -> None:\n    from allauth.account import app_settings\n\n    _impl.clear(\n        request=request,\n        config=app_settings.RATE_LIMITS,\n        action=action,\n        key=key,\n        user=user,\n    )\n\n\ndef consume(\n    request,\n    *,\n    action,\n    key=None,\n    user=None,\n    dry_run: bool = False,\n    raise_exception: bool = False,\n) -> bool:\n    \"\"\"\n    TODO: We ened to deprecate this module and keep rate limiting internal\n    to allauth. This method is using `allauth.account.app_settings` as a\n    hard-coded source of settings, which is bad for reusability elsewhere.\n    \"\"\"\n    from allauth.account import app_settings\n\n    usage = _impl.consume(\n        request=request,\n        config=app_settings.RATE_LIMITS,\n        action=action,\n        key=key,\n        user=user,\n        dry_run=dry_run,\n        raise_exception=raise_exception,\n    )\n    if not usage:\n        return False\n    return True\n\n\ndef respond_429(request) -> HttpResponse:\n    if app_settings.HEADLESS_ENABLED and hasattr(request.allauth, \"headless\"):\n        from allauth.headless.base.response import RateLimitResponse\n\n        return RateLimitResponse(request)\n\n    try:\n        handler429 = import_callable(f\"{settings.ROOT_URLCONF}.handler429\")\n        handler429 = import_callable(handler429)\n    except (ImportError, AttributeError):\n        handler429 = _impl.handler429\n    return handler429(request)\n\n\ndef consume_or_429(request, *args, **kwargs) -> HttpResponse | None:\n    if not consume(request, *args, **kwargs):\n        return respond_429(request)\n    return None\n"
  },
  {
    "path": "allauth/decorators.py",
    "content": "from functools import wraps\n\nfrom allauth.core import ratelimit\n\n\ndef rate_limit(*, action, **rl_kwargs):\n    def decorator(function):\n        @wraps(function)\n        def wrap(request, *args, **kwargs):\n            resp = ratelimit.consume_or_429(request, action=action, **rl_kwargs)\n            if not resp:\n                resp = function(request, *args, **kwargs)\n            return resp\n\n        return wrap\n\n    return decorator\n"
  },
  {
    "path": "allauth/exceptions.py",
    "content": "import warnings\n\nfrom allauth.core.exceptions import ImmediateHttpResponse\n\n\n__all__ = [\"ImmediateHttpResponse\"]\n\n\nwarnings.warn(\"allauth.exceptions is deprecated, use allauth.core.exceptions\")\n"
  },
  {
    "path": "allauth/headless/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/headless/account/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/headless/account/inputs.py",
    "content": "from django.core.exceptions import ValidationError\nfrom django.core.validators import validate_email\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.fields import PhoneField\nfrom allauth.account.forms import (\n    AddEmailForm,\n    BaseSignupForm,\n    ChangeEmailForm,\n    ChangePhoneForm,\n    ConfirmLoginCodeForm,\n    ReauthenticateForm,\n    RequestLoginCodeForm,\n    ResetPasswordForm,\n    UserTokenForm,\n    VerifyPhoneForm,\n)\nfrom allauth.account.internal import flows\nfrom allauth.account.models import EmailAddress, Login, get_emailconfirmation_model\nfrom allauth.core import context\nfrom allauth.core.internal.cryptokit import compare_user_code\nfrom allauth.headless.adapter import get_adapter\nfrom allauth.headless.internal.restkit import inputs\n\n\nclass SignupInput(BaseSignupForm, inputs.Input):\n    password = inputs.CharField()\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        password = account_settings.SIGNUP_FIELDS.get(\"password1\")\n        if not password:\n            del self.fields[\"password\"]\n        else:\n            self.fields[\"password\"].required = password[\"required\"]\n\n    def clean_password(self):\n        password = self.cleaned_data[\"password\"]\n        if password:\n            return get_account_adapter().clean_password(password)\n        return password\n\n\nclass LoginInput(inputs.Input):\n    username = inputs.CharField(required=False)\n    email = inputs.EmailField(required=False)\n    # NOTE: Always require E164, no need to use adapter.phone_form_field\n    phone = PhoneField(required=False)\n    password = inputs.CharField()\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        for field in [\"username\", \"email\", \"phone\"]:\n            if field not in account_settings.LOGIN_METHODS:\n                del self.fields[field]\n        if len(account_settings.LOGIN_METHODS) == 1:\n            self.fields[next(iter(account_settings.LOGIN_METHODS))].required = True\n\n    def clean(self):\n        cleaned_data = super().clean()\n        if self.errors:\n            return cleaned_data\n        credentials = {}\n        for login_method in account_settings.LOGIN_METHODS:\n            value = cleaned_data.get(login_method)\n            if value is not None and login_method in self.data.keys():\n                credentials[login_method] = value\n        if len(credentials) != 1:\n            raise get_account_adapter().validation_error(\"invalid_login\")\n        password = cleaned_data.get(\"password\")\n        if password:\n            auth_method = next(iter(credentials.keys()))\n            credentials[\"password\"] = password\n            user = get_account_adapter().authenticate(context.request, **credentials)\n            if user:\n                self.login = Login(user=user, email=credentials.get(\"email\"))\n                if flows.login.is_login_rate_limited(context.request, self.login):\n                    raise get_account_adapter().validation_error(\n                        \"too_many_login_attempts\"\n                    )\n            else:\n                error_code = f\"{auth_method.value}_password_mismatch\"\n                self.add_error(\n                    \"password\", get_account_adapter().validation_error(error_code)\n                )\n        return cleaned_data\n\n\nclass VerifyEmailInput(inputs.Input):\n    key = inputs.CharField()\n\n    def __init__(self, *args, **kwargs):\n        self.process = kwargs.pop(\"process\", None)\n        super().__init__(*args, **kwargs)\n\n    def clean_key(self):\n        key = self.cleaned_data[\"key\"]\n        if self.process:\n            if not compare_user_code(actual=key, expected=self.process.code):\n                raise get_account_adapter().validation_error(\"incorrect_code\")\n            valid = True\n            email_address = self.process.email_address\n        else:\n            model = get_emailconfirmation_model()\n            verification = model.from_key(key)\n            valid = verification and not verification.key_expired()\n            if not valid:\n                raise get_account_adapter().validation_error(\n                    \"incorrect_code\"\n                    if account_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED\n                    else \"invalid_or_expired_key\"\n                )\n            email_address = verification.email_address\n            self.verification = verification\n        if valid and not email_address.can_set_verified():\n            raise get_account_adapter().validation_error(\"email_taken\")\n        return key\n\n\nclass RequestPasswordResetInput(ResetPasswordForm, inputs.Input):\n    pass\n\n\nclass ResetPasswordKeyInput(inputs.Input):\n    key = inputs.CharField()\n\n    def __init__(self, *args, **kwargs):\n        self.user = kwargs.pop(\"user\", None)\n        self.code = kwargs.pop(\"code\", None)\n        super().__init__(*args, **kwargs)\n\n    def clean_key(self):\n        if account_settings.PASSWORD_RESET_BY_CODE_ENABLED:\n            return self._clean_key_code()\n        else:\n            return self._clean_key_link()\n\n    def _clean_key_code(self):\n        key = self.cleaned_data[\"key\"]\n        if not compare_user_code(actual=key, expected=self.code):\n            raise get_account_adapter().validation_error(\"incorrect_code\")\n        return key\n\n    def _clean_key_link(self):\n        key = self.cleaned_data[\"key\"]\n        uidb36, _, subkey = key.partition(\"-\")\n        token_form = UserTokenForm(data={\"uidb36\": uidb36, \"key\": subkey})\n        if not token_form.is_valid():\n            raise get_account_adapter().validation_error(\"invalid_password_reset\")\n        self.user = token_form.reset_user\n        return key\n\n\nclass ResetPasswordInput(ResetPasswordKeyInput):\n    password = inputs.CharField()\n\n    def clean(self):\n        cleaned_data = super().clean()\n        password = self.cleaned_data.get(\"password\")\n        if self.user and password is not None:\n            try:\n                get_account_adapter().clean_password(password, user=self.user)\n            except ValidationError as e:\n                self.add_error(\"password\", e)\n        return cleaned_data\n\n\nclass ChangePasswordInput(inputs.Input):\n    current_password = inputs.CharField(required=False)\n    new_password = inputs.CharField()\n\n    def __init__(self, *args, **kwargs):\n        self.user = kwargs.pop(\"user\")\n        super().__init__(*args, **kwargs)\n        self.fields[\"current_password\"].required = self.user.has_usable_password()\n\n    def clean_current_password(self):\n        current_password = self.cleaned_data[\"current_password\"]\n        if current_password:\n            if not self.user.check_password(current_password):\n                raise get_account_adapter().validation_error(\"enter_current_password\")\n        return current_password\n\n    def clean_new_password(self):\n        new_password = self.cleaned_data[\"new_password\"]\n        adapter = get_account_adapter()\n        return adapter.clean_password(new_password, user=self.user)\n\n\nclass AddEmailInput(AddEmailForm, inputs.Input):\n    pass\n\n\nclass SelectEmailInput(inputs.Input):\n    email = inputs.CharField()\n\n    def __init__(self, *args, **kwargs):\n        self.user = kwargs.pop(\"user\")\n        super().__init__(*args, **kwargs)\n\n    def clean_email(self):\n        self.process = None\n        email = self.cleaned_data[\"email\"]\n        validate_email(email)\n\n        # Select a database backed email...\n        try:\n            return EmailAddress.objects.get_for_user(user=self.user, email=email)\n        except EmailAddress.DoesNotExist:\n            pass\n\n        # Or, if email verification by code is active, try the pending email\n        request = context.request\n        self.process = flows.email_verification_by_code.EmailVerificationProcess.resume(\n            request\n        )\n        if self.process:\n            email_address = self.process.email_address\n            if email_address.email.lower() == email.lower() and (\n                request.user.is_anonymous or email_address.user_id == request.user.pk\n            ):\n                return email_address\n\n        raise get_adapter().validation_error(\"unknown_email\")\n\n\nclass DeleteEmailInput(SelectEmailInput):\n    def clean_email(self):\n        email = super().clean_email()\n        if not flows.manage_email.can_delete_email(email):\n            raise get_account_adapter().validation_error(\"cannot_remove_primary_email\")\n        return email\n\n\nclass MarkAsPrimaryEmailInput(SelectEmailInput):\n    primary = inputs.BooleanField(required=True)\n\n    def clean_email(self):\n        email = super().clean_email()\n        if not flows.manage_email.can_mark_as_primary(email):\n            raise get_account_adapter().validation_error(\"unverified_primary_email\")\n        return email\n\n\nclass ResendEmailVerificationInput(SelectEmailInput):\n    pass\n\n\nclass ReauthenticateInput(ReauthenticateForm, inputs.Input):\n    pass\n\n\nclass RequestLoginCodeInput(RequestLoginCodeForm, inputs.Input):\n    pass\n\n\nclass ConfirmLoginCodeInput(ConfirmLoginCodeForm, inputs.Input):\n    pass\n\n\nclass VerifyPhoneInput(VerifyPhoneForm, inputs.Input):\n    pass\n\n\nclass ChangePhoneInput(ChangePhoneForm, inputs.Input):\n    pass\n\n\nclass ChangeEmailInput(ChangeEmailForm, inputs.Input):\n    pass\n"
  },
  {
    "path": "allauth/headless/account/response.py",
    "content": "from http import HTTPStatus\n\nfrom allauth.headless.adapter import get_adapter\nfrom allauth.headless.base.response import APIResponse\n\n\ndef email_address_data(addr) -> dict:\n    return {\n        \"email\": addr.email,\n        \"verified\": addr.verified,\n        \"primary\": addr.primary,\n    }\n\n\nclass RequestEmailVerificationResponse(APIResponse):\n    def __init__(self, request, verification_sent):\n        super().__init__(\n            request, status=HTTPStatus.OK if verification_sent else HTTPStatus.FORBIDDEN\n        )\n\n\nclass VerifyEmailResponse(APIResponse):\n    def __init__(self, request, email_address, stage):\n        adapter = get_adapter()\n        data = {\n            \"email\": email_address.email,\n            \"user\": adapter.serialize_user(email_address.user),\n        }\n        meta = {\n            \"is_authenticating\": stage is not None,\n        }\n        super().__init__(request, data=data, meta=meta)\n\n\nclass EmailAddressesResponse(APIResponse):\n    def __init__(self, request, email_addresses):\n        data = [email_address_data(addr) for addr in email_addresses]\n        super().__init__(request, data=data)\n\n\nclass PhoneNumbersResponse(APIResponse):\n    def __init__(self, request, phone_numbers, status=HTTPStatus.OK):\n        super().__init__(request, data=phone_numbers, status=status)\n\n\nclass RequestPasswordResponse(APIResponse):\n    pass\n\n\nclass PasswordResetKeyResponse(APIResponse):\n    def __init__(self, request, user):\n        adapter = get_adapter()\n        data = {\"user\": adapter.serialize_user(user)}\n        super().__init__(request, data=data)\n"
  },
  {
    "path": "allauth/headless/account/urls.py",
    "content": "from django.urls import include, path\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.account import app_settings as account_settings\nfrom allauth.headless.account import views\n\n\ndef build_urlpatterns(client):\n    account_patterns = []\n    auth_patterns = [\n        path(\n            \"session\",\n            views.SessionView.as_api_view(client=client),\n            name=\"current_session\",\n        ),\n        path(\n            \"reauthenticate\",\n            views.ReauthenticateView.as_api_view(client=client),\n            name=\"reauthenticate\",\n        ),\n        path(\n            \"code/confirm\",\n            views.ConfirmLoginCodeView.as_api_view(client=client),\n            name=\"confirm_login_code\",\n        ),\n    ]\n    if not allauth_settings.SOCIALACCOUNT_ONLY:\n        account_patterns.extend(\n            [\n                path(\n                    \"password/change\",\n                    views.ChangePasswordView.as_api_view(client=client),\n                    name=\"change_password\",\n                ),\n                path(\n                    \"email\",\n                    views.ManageEmailView.as_api_view(client=client),\n                    name=\"manage_email\",\n                ),\n                path(\n                    \"phone\",\n                    views.ManagePhoneView.as_api_view(client=client),\n                    name=\"manage_phone\",\n                ),\n            ]\n        )\n        auth_patterns.extend(\n            [\n                path(\n                    \"password/\",\n                    include(\n                        [\n                            path(\n                                \"request\",\n                                views.RequestPasswordResetView.as_api_view(\n                                    client=client\n                                ),\n                                name=\"request_password_reset\",\n                            ),\n                            path(\n                                \"reset\",\n                                views.ResetPasswordView.as_api_view(client=client),\n                                name=\"reset_password\",\n                            ),\n                        ]\n                    ),\n                ),\n                path(\n                    \"login\",\n                    views.LoginView.as_api_view(client=client),\n                    name=\"login\",\n                ),\n                path(\n                    \"signup\",\n                    views.SignupView.as_api_view(client=client),\n                    name=\"signup\",\n                ),\n                path(\n                    \"email/verify\",\n                    views.VerifyEmailView.as_api_view(client=client),\n                    name=\"verify_email\",\n                ),\n                path(\n                    \"email/verify/resend\",\n                    views.ResendEmailVerificationCodeView.as_api_view(client=client),\n                    name=\"resend_email_verification_code\",\n                ),\n                path(\n                    \"phone/verify\",\n                    views.VerifyPhoneView.as_api_view(client=client),\n                    name=\"verify_phone\",\n                ),\n                path(\n                    \"phone/verify/resend\",\n                    views.ResendPhoneVerificationCodeView.as_api_view(client=client),\n                    name=\"resend_phone_verification_code\",\n                ),\n            ]\n        )\n    if account_settings.LOGIN_BY_CODE_ENABLED:\n        auth_patterns.extend(\n            [\n                path(\n                    \"code/request\",\n                    views.RequestLoginCodeView.as_api_view(client=client),\n                    name=\"request_login_code\",\n                ),\n                path(\n                    \"code/resend\",\n                    views.ResendLoginCodeView.as_api_view(client=client),\n                    name=\"resend_login_code\",\n                ),\n            ]\n        )\n    return [\n        path(\"auth/\", include(auth_patterns)),\n        path(\n            \"account/\",\n            include(account_patterns),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/headless/account/views.py",
    "content": "from http import HTTPStatus\n\nfrom django.http import HttpResponse\nfrom django.utils.decorators import method_decorator\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.internal import flows\nfrom allauth.account.internal.constants import LoginStageKey\nfrom allauth.account.internal.flows import (\n    email_verification,\n    manage_email,\n    password_change,\n    password_reset,\n    password_reset_by_code,\n)\nfrom allauth.account.internal.flows.email_verification import (\n    send_verification_email_to_address,\n)\nfrom allauth.account.internal.flows.email_verification_by_code import (\n    EmailVerificationProcess,\n)\nfrom allauth.account.internal.flows.phone_verification import (\n    PhoneVerificationStageProcess,\n)\nfrom allauth.account.stages import (\n    EmailVerificationStage,\n    LoginStageController,\n    PhoneVerificationStage,\n)\nfrom allauth.core import ratelimit\nfrom allauth.core.exceptions import ImmediateHttpResponse, RateLimited\nfrom allauth.decorators import rate_limit\nfrom allauth.headless.account import response\nfrom allauth.headless.account.inputs import (\n    AddEmailInput,\n    ChangeEmailInput,\n    ChangePasswordInput,\n    ChangePhoneInput,\n    ConfirmLoginCodeInput,\n    DeleteEmailInput,\n    LoginInput,\n    MarkAsPrimaryEmailInput,\n    ReauthenticateInput,\n    RequestLoginCodeInput,\n    RequestPasswordResetInput,\n    ResendEmailVerificationInput,\n    ResetPasswordInput,\n    ResetPasswordKeyInput,\n    SignupInput,\n    VerifyEmailInput,\n    VerifyPhoneInput,\n)\nfrom allauth.headless.base.response import (\n    APIResponse,\n    AuthenticationResponse,\n    ConflictResponse,\n    ForbiddenResponse,\n    RateLimitResponse,\n)\nfrom allauth.headless.base.views import APIView, AuthenticatedAPIView\nfrom allauth.headless.internal import authkit\nfrom allauth.headless.internal.restkit.response import ErrorResponse\n\n\nclass RequestLoginCodeView(APIView):\n    input_class = RequestLoginCodeInput\n\n    def post(self, request, *args, **kwargs):\n        flows.login_by_code.LoginCodeVerificationProcess.initiate(\n            request=self.request,\n            user=self.input._user,\n            email=self.input.cleaned_data.get(\"email\"),\n            phone=self.input.cleaned_data.get(\"phone\"),\n        )\n        return AuthenticationResponse(self.request)\n\n\nclass ResendLoginCodeView(APIView):\n    handle_json_input = False\n\n    def post(self, request, *args, **kwargs):\n        process = None\n        stage = LoginStageController.enter(request, LoginStageKey.LOGIN_BY_CODE)\n        if stage:\n            process = flows.login_by_code.LoginCodeVerificationProcess.resume(stage)\n        if not process or not process.can_resend:\n            return ConflictResponse(request)\n        try:\n            process.resend()\n        except RateLimited:\n            return RateLimitResponse(request)\n        return APIResponse(request)\n\n\nclass ConfirmLoginCodeView(APIView):\n    input_class = ConfirmLoginCodeInput\n\n    def dispatch(self, request, *args, **kwargs):\n        auth_status = authkit.AuthenticationStatus(request)\n        self.stage = auth_status.get_pending_stage()\n        if not self.stage or self.stage.key != LoginStageKey.LOGIN_BY_CODE:\n            return ConflictResponse(request)\n        self.process = flows.login_by_code.LoginCodeVerificationProcess.resume(\n            self.stage\n        )\n        if not self.process:\n            return ConflictResponse(request)\n        return super().dispatch(request, *args, **kwargs)\n\n    def post(self, request, *args, **kwargs):\n        response = self.process.finish(None)\n        return AuthenticationResponse.from_response(request, response)\n\n    def get_input_kwargs(self) -> dict:\n        kwargs = super().get_input_kwargs()\n        kwargs[\"code\"] = self.process.code\n        return kwargs\n\n    def handle_invalid_input(self, input):\n        self.process.record_invalid_attempt()\n        return super().handle_invalid_input(input)\n\n\n@method_decorator(rate_limit(action=\"login\"), name=\"handle\")\nclass LoginView(APIView):\n    input_class = LoginInput\n\n    def post(self, request, *args, **kwargs):\n        if request.user.is_authenticated:\n            return ConflictResponse(request)\n        credentials = self.input.cleaned_data\n        response = flows.login.perform_password_login(\n            request, credentials, self.input.login\n        )\n        return AuthenticationResponse.from_response(request, response)\n\n\n@method_decorator(rate_limit(action=\"signup\"), name=\"handle\")\nclass SignupView(APIView):\n    input_class = {\"POST\": SignupInput}\n    by_passkey = False\n\n    def post(self, request, *args, **kwargs):\n        if request.user.is_authenticated:\n            return ConflictResponse(request)\n        if not get_account_adapter().is_open_for_signup(request):\n            return ForbiddenResponse(request)\n        user, resp = self.input.try_save(request)\n        if not resp:\n            try:\n                resp = flows.signup.complete_signup(\n                    request, user=user, by_passkey=self.by_passkey\n                )\n            except ImmediateHttpResponse:\n                pass\n        return AuthenticationResponse.from_response(request, resp)\n\n\nclass SessionView(APIView):\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        return AuthenticationResponse(request)\n\n    def delete(self, request, *args, **kwargs):\n        adapter = get_account_adapter()\n        adapter.logout(request)\n        return AuthenticationResponse(request)\n\n\nclass VerifyEmailView(APIView):\n    input_class = VerifyEmailInput\n\n    def handle(self, request, *args, **kwargs):\n        self.stage = LoginStageController.enter(request, EmailVerificationStage.key)\n        if (\n            not self.stage\n            and account_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED\n            and not request.user.is_authenticated\n        ):\n            return ConflictResponse(request)\n        self.process = None\n        if account_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED:\n            self.process = (\n                flows.email_verification_by_code.EmailVerificationProcess.resume(\n                    request\n                )\n            )\n            if not self.process:\n                return ConflictResponse(request)\n        return super().handle(request, *args, **kwargs)\n\n    def get_input_kwargs(self) -> dict:\n        return {\"process\": self.process}\n\n    def handle_invalid_input(self, input: VerifyEmailInput):\n        if self.process:\n            self.process.record_invalid_attempt()\n        return super().handle_invalid_input(input)\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        key = request.headers.get(\"x-email-verification-key\", \"\")\n        input = self.input_class({\"key\": key}, process=self.process)\n        if not input.is_valid():\n            if self.process:\n                self.process.record_invalid_attempt()\n            return ErrorResponse(request, input=input)\n        if self.process:\n            email_address = self.process.email_address\n        else:\n            email_address = input.verification.email_address\n        return response.VerifyEmailResponse(request, email_address, stage=self.stage)\n\n    def post(self, request, *args, **kwargs):\n        if self.process:\n            email_address = self.process.finish()\n        else:\n            email_address = self.input.verification.confirm(request)\n        if not email_address:\n            # Should not happen, VerifyInputInput should have verified all\n            # preconditions.\n            return APIResponse(request, status=HTTPStatus.INTERNAL_SERVER_ERROR)\n        response = None\n        if self.stage:\n            # Verifying email as part of login/signup flow may imply the user is\n            # to be logged in...\n            response = email_verification.login_on_verification(request, email_address)\n        return AuthenticationResponse.from_response(request, response)\n\n\nclass VerifyPhoneView(APIView):\n    input_class = VerifyPhoneInput\n\n    def handle(self, request, *args, **kwargs):\n        self.stage = LoginStageController.enter(request, PhoneVerificationStage.key)\n        if self.stage:\n            self.process = (\n                flows.phone_verification.PhoneVerificationStageProcess.resume(\n                    self.stage\n                )\n            )\n        else:\n            if not request.user.is_authenticated:\n                return ConflictResponse(request)\n            self.process = (\n                flows.phone_verification.ChangePhoneVerificationProcess.resume(request)\n            )\n        if not self.process:\n            return ConflictResponse(request)\n        return super().handle(request, *args, **kwargs)\n\n    def get_input_kwargs(self) -> dict:\n        return {\n            \"code\": self.process.code,\n            \"user\": self.process.user,\n            \"phone\": self.process.phone,\n        }\n\n    def handle_invalid_input(self, input: VerifyPhoneInput):\n        self.process.record_invalid_attempt()\n        return super().handle_invalid_input(input)\n\n    def post(self, request, *args, **kwargs):\n        self.process.finish()\n        response = None\n        if self.stage:\n            response = self.stage.exit()\n        return AuthenticationResponse.from_response(request, response)\n\n\nclass ResendPhoneVerificationCodeView(APIView):\n    handle_json_input = False\n\n    def post(self, request, *args, **kwargs):\n        process = None\n        stage = LoginStageController.enter(request, PhoneVerificationStage.key)\n        if stage:\n            process = flows.phone_verification.PhoneVerificationStageProcess.resume(\n                stage\n            )\n        if not process or not process.can_resend:\n            return ConflictResponse(request)\n        try:\n            process.resend()\n        except RateLimited:\n            return RateLimitResponse(request)\n        return APIResponse(request)\n\n\nclass ResendEmailVerificationCodeView(APIView):\n    handle_json_input = False\n\n    def post(self, request, *args, **kwargs):\n        if not account_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED:\n            return ConflictResponse(request)\n        process = flows.email_verification_by_code.EmailVerificationProcess.resume(\n            request\n        )\n        if not process or not process.can_resend:\n            return ConflictResponse(request)\n        try:\n            process.resend()\n        except RateLimited:\n            return RateLimitResponse(request)\n        return APIResponse(request)\n\n\nclass RequestPasswordResetView(APIView):\n    input_class = RequestPasswordResetInput\n\n    def post(self, request, *args, **kwargs):\n        r429 = ratelimit.consume_or_429(\n            self.request,\n            action=\"reset_password\",\n            key=self.input.cleaned_data[\"email\"].lower(),\n        )\n        if r429:\n            return r429\n        self.input.save(request)\n        if account_settings.PASSWORD_RESET_BY_CODE_ENABLED:\n            return AuthenticationResponse(request)\n        return response.RequestPasswordResponse(request)\n\n\n@method_decorator(rate_limit(action=\"reset_password_from_key\"), name=\"handle\")\nclass ResetPasswordView(APIView):\n    input_class = ResetPasswordInput\n\n    def handle_invalid_input(self, input: ResetPasswordInput):\n        if self.process and \"key\" in input.errors:\n            self.process.record_invalid_attempt()\n        return super().handle_invalid_input(input)\n\n    def handle(self, request, *args, **kwargs):\n        self.process = None\n        if account_settings.PASSWORD_RESET_BY_CODE_ENABLED:\n            self.process = (\n                password_reset_by_code.PasswordResetVerificationProcess.resume(\n                    self.request\n                )\n            )\n            if not self.process:\n                return ConflictResponse(request)\n        return super().handle(request, *args, **kwargs)\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        key = request.headers.get(\"X-Password-Reset-Key\", \"\")\n        if self.process:\n            input = ResetPasswordKeyInput({\"key\": key}, code=self.process.code)\n            if not input.is_valid():\n                self.process.record_invalid_attempt()\n                return ErrorResponse(request, input=input)\n            self.process.confirm_code()\n            return response.PasswordResetKeyResponse(request, self.process.user)\n        else:\n            input = ResetPasswordKeyInput({\"key\": key})\n            if not input.is_valid():\n                return ErrorResponse(request, input=input)\n            return response.PasswordResetKeyResponse(request, input.user)\n\n    def get_input_kwargs(self) -> dict:\n        ret = {}\n        if self.process:\n            ret.update({\"code\": self.process.code, \"user\": self.process.user})\n        return ret\n\n    def post(self, request, *args, **kwargs):\n        user = self.input.user\n        flows.password_reset.reset_password(user, self.input.cleaned_data[\"password\"])\n        if self.process:\n            self.process.confirm_code()\n            self.process.finish()\n        else:\n            password_reset.finalize_password_reset(request, user)\n        return AuthenticationResponse(self.request)\n\n\n@method_decorator(rate_limit(action=\"change_password\"), name=\"handle\")\nclass ChangePasswordView(AuthenticatedAPIView):\n    input_class = ChangePasswordInput\n\n    def post(self, request, *args, **kwargs):\n        password_change.change_password(\n            self.request.user, self.input.cleaned_data[\"new_password\"]\n        )\n        is_set = not self.input.cleaned_data.get(\"current_password\")\n        if is_set:\n            password_change.finalize_password_set(request, request.user)\n        else:\n            password_change.finalize_password_change(request, request.user)\n        return AuthenticationResponse(request)\n\n    def get_input_kwargs(self) -> dict:\n        return {\"user\": self.request.user}\n\n\nclass ManageEmailView(APIView):\n    input_class = {\n        \"POST\": AddEmailInput,\n        \"PUT\": ResendEmailVerificationInput,\n        \"DELETE\": DeleteEmailInput,\n        \"PATCH\": MarkAsPrimaryEmailInput,\n    }\n\n    def dispatch(self, request, *args, **kwargs):\n        self.verification_stage_process = None\n        if request.user.is_authenticated:\n            self.user = request.user\n        elif request.method != \"POST\":\n            return AuthenticationResponse(request)\n        else:\n            self.verification_stage_process = EmailVerificationProcess.resume(request)\n            if (\n                not self.verification_stage_process\n                or not self.verification_stage_process.can_change\n            ):\n                return ConflictResponse(request)\n            self.user = self.verification_stage_process.user\n        resp = ratelimit.consume_or_429(request, action=\"manage_email\", user=self.user)\n        if resp:\n            return resp\n        return super().dispatch(request, *args, **kwargs)\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        return self._respond_email_list()\n\n    def _respond_email_list(self):\n        addrs = manage_email.list_email_addresses(self.request, self.user)\n        return response.EmailAddressesResponse(self.request, addrs)\n\n    def post(self, request, *args, **kwargs):\n        if self.verification_stage_process:\n            self.verification_stage_process.change_to(\n                email=self.input.cleaned_data[\"email\"],\n                account_already_exists=self.input.account_already_exists,\n            )\n        else:\n            flows.manage_email.add_email(request, self.input)\n        return self._respond_email_list()\n\n    def delete(self, request, *args, **kwargs):\n        addr = self.input.cleaned_data[\"email\"]\n        if addr.pk:\n            flows.manage_email.delete_email(request, addr)\n        else:\n            self.input.process.abort()\n        return self._respond_email_list()\n\n    def patch(self, request, *args, **kwargs):\n        addr = self.input.cleaned_data[\"email\"]\n        flows.manage_email.mark_as_primary(request, addr)\n        return self._respond_email_list()\n\n    def put(self, request, *args, **kwargs):\n        addr = self.input.cleaned_data[\"email\"]\n        if process := self.input.process:\n            sent = False\n            if process.can_resend:\n                try:\n                    self.input.process.resend()\n                    sent = True\n                except RateLimited:\n                    pass\n        else:\n            sent = send_verification_email_to_address(request, addr)\n        return response.RequestEmailVerificationResponse(\n            request, verification_sent=sent\n        )\n\n    def get_input_class(self):\n        if self.verification_stage_process:\n            return ChangeEmailInput\n        return super().get_input_class()\n\n    def get_input_kwargs(self) -> dict:\n        if self.verification_stage_process:\n            return {\"email\": self.verification_stage_process.email}\n        return {\"user\": self.user}\n\n\nclass ManagePhoneView(APIView):\n    input_class = ChangePhoneInput\n\n    def dispatch(self, request, *args, **kwargs):\n        self.verification_stage_process = None\n        if request.user.is_authenticated:\n            self.user = request.user\n        elif request.method == \"GET\":\n            return AuthenticationResponse(request)\n        elif request.method == \"POST\":\n            stage = LoginStageController.enter(request, PhoneVerificationStage.key)\n            if stage:\n                self.verification_stage_process = PhoneVerificationStageProcess.resume(\n                    stage\n                )\n            if (\n                not self.verification_stage_process\n                or not self.verification_stage_process.can_change\n            ):\n                return ConflictResponse(request)\n            self.user = self.verification_stage_process.user\n        resp = ratelimit.consume_or_429(request, action=\"change_phone\", user=self.user)\n        if resp:\n            return resp\n        return super().dispatch(request, *args, **kwargs)\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        phone_numbers = []\n        phone_verified = get_account_adapter().get_phone(self.request.user)\n        if phone_verified:\n            phone_numbers.append(\n                {\"phone\": phone_verified[0], \"verified\": phone_verified[1]}\n            )\n        return response.PhoneNumbersResponse(self.request, phone_numbers)\n\n    def post(self, request, *args, **kwargs):\n        phone = self.input.cleaned_data[\"phone\"]\n        if self.verification_stage_process:\n            self.verification_stage_process.change_to(\n                phone=phone, account_already_exists=self.input.account_already_exists\n            )\n        else:\n            flows.phone_verification.ChangePhoneVerificationProcess.initiate(\n                self.request,\n                phone,\n            )\n        return response.PhoneNumbersResponse(\n            self.request,\n            [\n                {\n                    \"phone\": phone,\n                    \"verified\": False,\n                }\n            ],\n            status=HTTPStatus.ACCEPTED,\n        )\n\n    def get_input_kwargs(self) -> dict:\n        phone = None\n        phone_verified = get_account_adapter().get_phone(self.user)\n        if phone_verified:\n            phone = phone_verified[0]\n        return {\"phone\": phone, \"user\": self.user}\n\n\n@method_decorator(rate_limit(action=\"reauthenticate\"), name=\"handle\")\nclass ReauthenticateView(AuthenticatedAPIView):\n    input_class = ReauthenticateInput\n\n    def post(self, request, *args, **kwargs):\n        flows.reauthentication.reauthenticate_by_password(self.request)\n        return AuthenticationResponse(self.request)\n\n    def get_input_kwargs(self) -> dict:\n        return {\"user\": self.request.user}\n"
  },
  {
    "path": "allauth/headless/adapter.py",
    "content": "import dataclasses\nimport uuid\nfrom typing import Any, Optional\n\nfrom django.contrib.auth import get_user_model\nfrom django.db import models\nfrom django.forms.fields import Field\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.models import EmailAddress\nfrom allauth.account.utils import user_display, user_username\nfrom allauth.core.internal.adapter import BaseAdapter\nfrom allauth.core.internal.httpkit import default_get_frontend_url\nfrom allauth.headless import app_settings\nfrom allauth.utils import import_attribute\n\n\nclass DefaultHeadlessAdapter(BaseAdapter):\n    \"\"\"The adapter class allows you to override various functionality of the\n    ``allauth.headless`` app.  To do so, point ``settings.HEADLESS_ADAPTER`` to your own\n    class that derives from ``DefaultHeadlessAdapter`` and override the behavior by\n    altering the implementation of the methods according to your own need.\n    \"\"\"\n\n    error_messages = {\n        # For the following error messages i18n is not an issue as these should not be\n        # showing up in a UI.\n        \"account_not_found\": \"Unknown account.\",\n        \"client_id_required\": \"`client_id` required.\",\n        \"invalid_token\": \"Invalid token.\",  # nosec\n        \"token_authentication_not_supported\": \"Provider does not support token authentication.\",\n        \"token_required\": \"`id_token` and/or `access_token` required.\",\n        \"required\": Field.default_error_messages[\"required\"],\n        \"unknown_email\": \"Unknown email address.\",\n        \"unknown_provider\": \"Unknown provider.\",\n        \"invalid_url\": \"Invalid URL.\",\n    }\n\n    def serialize_user(self, user) -> dict[str, Any]:\n        \"\"\"\n        Returns the basic user data. Note that this data is also exposed in\n        partly authenticated scenario's (e.g. password reset, email\n        verification).\n\n        Do not override this method if you would like your customized user payloads\n        to be reflected in the (dynamically rendered) OpenAPI specification. In that\n        case, override ``get_user_dataclass()`` and ``user_as_dataclass`` instead.\n        \"\"\"\n        return {\n            k: v\n            for k, v in dataclasses.asdict(self.user_as_dataclass(user)).items()\n            if v not in (\"\", None)\n        }\n\n    def get_frontend_url(self, urlname: str, **kwargs) -> str | None:\n        \"\"\"Return the frontend URL for the given URL name.\"\"\"\n        return default_get_frontend_url(self.request, urlname, **kwargs)\n\n    def user_as_dataclass(self, user):\n        \"\"\"\n        See ``get_user_dataclass()``. This method returns an instance of\n        that ``dataclass``, populated with the given ``user`` fields.\n        \"\"\"\n        UserDc = self.get_user_dataclass()\n        kwargs = {}\n        User = get_user_model()\n        pk_field_class = type(User._meta.pk)\n        if not user.pk:\n            id_dc = None\n        elif issubclass(pk_field_class, models.IntegerField):\n            id_dc = user.pk\n        else:\n            id_dc = str(user.pk)\n        if account_settings.USER_MODEL_USERNAME_FIELD:\n            kwargs[\"username\"] = user_username(user)\n        if user.pk:\n            email = EmailAddress.objects.get_primary_email(user)\n        else:\n            email = None\n        kwargs.update(\n            {\n                \"id\": id_dc,\n                \"email\": email if email else None,\n                \"display\": user_display(user),\n                \"has_usable_password\": user.has_usable_password(),\n            }\n        )\n        return UserDc(**kwargs)\n\n    def get_user_dataclass(self):\n        \"\"\"\n        Basic user data payloads are exposed in some of the headless responses. If\n        you need to customize these payloads in such a way that your custom user\n        payload is also reflected in the OpenAPI specification, you wil need to\n        provide a ``dataclass`` representing the schema of your custom payload,\n        as well as method that takes a ``User`` instance and wraps it into your\n        dataclass. This method returns that ``dataclass``.\n        \"\"\"\n        fields = []\n        User = get_user_model()\n        pk_field_class = type(User._meta.pk)\n        if issubclass(pk_field_class, models.UUIDField):\n            id_type = str\n            id_example = str(uuid.uuid4())\n        elif issubclass(pk_field_class, models.IntegerField):\n            id_type = int\n            id_example = 123\n        else:\n            id_type = str\n            id_example = \"uid\"\n\n        def dc_field(attr, typ, description, example):\n            return (\n                attr,\n                typ,\n                dataclasses.field(\n                    metadata={\n                        \"description\": description,\n                        \"example\": example,\n                    }\n                ),\n            )\n\n        fields.extend(\n            [\n                dc_field(\"id\", Optional[id_type], \"The user ID.\", id_example),\n                dc_field(\n                    \"display\", str, \"The display name for the user.\", \"Magic Wizard\"\n                ),\n                dc_field(\n                    \"email\", Optional[str], \"The email address.\", \"email@domain.org\"\n                ),\n                dc_field(\n                    \"has_usable_password\",\n                    bool,\n                    \"Whether or not the account has a password set.\",\n                    True,\n                ),\n            ]\n        )\n        if account_settings.USER_MODEL_USERNAME_FIELD:\n            fields.append(dc_field(\"username\", str, \"The username.\", \"wizard\"))\n        return dataclasses.make_dataclass(\"User\", fields)\n\n\ndef get_adapter() -> DefaultHeadlessAdapter:\n    return import_attribute(app_settings.ADAPTER)()\n"
  },
  {
    "path": "allauth/headless/app_settings.py",
    "content": "class AppSettings:\n    def __init__(self, prefix: str) -> None:\n        self.prefix = prefix\n\n    def _setting(self, name: str, dflt):\n        from allauth.utils import get_setting\n\n        return get_setting(self.prefix + name, dflt)\n\n    @property\n    def ADAPTER(self) -> str:\n        return self._setting(\n            \"ADAPTER\", \"allauth.headless.adapter.DefaultHeadlessAdapter\"\n        )\n\n    @property\n    def TOKEN_STRATEGY(self):\n        from allauth.utils import import_attribute\n\n        path = self._setting(\n            \"TOKEN_STRATEGY\",\n            \"allauth.headless.tokens.strategies.sessions.SessionTokenStrategy\",\n        )\n        cls = import_attribute(path)\n        return cls()\n\n    @property\n    def SERVE_SPECIFICATION(self) -> bool:\n        return self._setting(\"SERVE_SPECIFICATION\", False)\n\n    @property\n    def SPECIFICATION_TEMPLATE_NAME(self) -> str | None:\n        return self._setting(\n            \"SPECIFICATION_TEMPLATE_NAME\", \"headless/spec/redoc_cdn.html\"\n        )\n\n    @property\n    def CLIENTS(self) -> tuple[str]:\n        return tuple(self._setting(\"CLIENTS\", (\"browser\", \"app\")))\n\n    @property\n    def FRONTEND_URLS(self) -> dict:\n        return self._setting(\"FRONTEND_URLS\", {})\n\n    @property\n    def JWT_ALGORITHM(self) -> str:\n        return self._setting(\"JWT_ALGORITHM\", \"RS256\")\n\n    @property\n    def JWT_PRIVATE_KEY(self) -> str:\n        return self._setting(\"JWT_PRIVATE_KEY\", \"\")\n\n    @property\n    def JWT_ACCESS_TOKEN_EXPIRES_IN(self) -> int:\n        return self._setting(\"JWT_ACCESS_TOKEN_EXPIRES_IN\", 300)\n\n    @property\n    def JWT_REFRESH_TOKEN_EXPIRES_IN(self) -> int:\n        return self._setting(\"JWT_REFRESH_TOKEN_EXPIRES_IN\", 86400)\n\n    @property\n    def JWT_AUTHORIZATION_HEADER_SCHEME(self) -> str:\n        return self._setting(\"JWT_AUTHORIZATION_HEADER_SCHEME\", \"Bearer\")\n\n    @property\n    def JWT_STATEFUL_VALIDATION_ENABLED(self) -> bool:\n        return self._setting(\"JWT_STATEFUL_VALIDATION_ENABLED\", False)\n\n    @property\n    def JWT_ROTATE_REFRESH_TOKEN(self) -> bool:\n        return self._setting(\"JWT_ROTATE_REFRESH_TOKEN\", True)\n\n\n_app_settings = AppSettings(\"HEADLESS_\")\n\n\ndef __getattr__(name):\n    # See https://peps.python.org/pep-0562/\n    return getattr(_app_settings, name)\n"
  },
  {
    "path": "allauth/headless/apps.py",
    "content": "from django.apps import AppConfig\nfrom django.utils.translation import gettext_lazy as _\n\n\nclass HeadlessConfig(AppConfig):\n    name = \"allauth.headless\"\n    verbose_name = _(\"Headless\")\n\n    def ready(self):\n        from allauth.headless import checks  # noqa\n"
  },
  {
    "path": "allauth/headless/base/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/headless/base/response.py",
    "content": "from http import HTTPStatus\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.app_settings import LoginMethod\nfrom allauth.account.authentication import get_authentication_records\nfrom allauth.account.internal import flows\nfrom allauth.account.internal.stagekit import LOGIN_SESSION_KEY\nfrom allauth.headless.adapter import get_adapter\nfrom allauth.headless.constants import Flow\nfrom allauth.headless.internal import authkit\nfrom allauth.headless.internal.restkit.response import APIResponse\nfrom allauth.mfa import app_settings as mfa_settings\n\n\nclass BaseAuthenticationResponse(APIResponse):\n    def __init__(self, request, user=None, status=None):\n        data = {}\n        if user and user.is_authenticated:\n            adapter = get_adapter()\n            data[\"user\"] = adapter.serialize_user(user)\n            data[\"methods\"] = get_authentication_records(request)\n            status = status or HTTPStatus.OK\n        else:\n            status = status or HTTPStatus.UNAUTHORIZED\n        if status != HTTPStatus.OK:\n            data[\"flows\"] = self._get_flows(request, user)\n        meta = {\n            \"is_authenticated\": user and user.is_authenticated,\n        }\n        super().__init__(\n            request,\n            data=data,\n            meta=meta,\n            status=status,\n        )\n\n    def _get_flows(self, request, user):\n        auth_status = authkit.AuthenticationStatus(request)\n        ret = []\n        if user and user.is_authenticated:\n            ret.extend(flows.reauthentication.get_reauthentication_flows(user))\n        else:\n            if not allauth_settings.SOCIALACCOUNT_ONLY:\n                ret.append({\"id\": Flow.LOGIN})\n            if account_settings.LOGIN_BY_CODE_ENABLED:\n                ret.append({\"id\": Flow.LOGIN_BY_CODE})\n            if (\n                get_account_adapter().is_open_for_signup(request)\n                and not allauth_settings.SOCIALACCOUNT_ONLY\n            ):\n                ret.append({\"id\": Flow.SIGNUP})\n            if allauth_settings.SOCIALACCOUNT_ENABLED:\n                from allauth.headless.socialaccount.response import provider_flows\n\n                ret.extend(provider_flows(request))\n            if allauth_settings.MFA_ENABLED:\n                if mfa_settings.PASSKEY_LOGIN_ENABLED:\n                    ret.append({\"id\": Flow.MFA_LOGIN_WEBAUTHN})\n        stage_key = None\n        stage = auth_status.get_pending_stage()\n        if stage:\n            stage_key = stage.key\n        else:\n            lsk = request.session.get(LOGIN_SESSION_KEY)\n            if isinstance(lsk, str):\n                stage_key = lsk\n        if stage_key:\n            pending_flow = {\"id\": stage_key, \"is_pending\": True}\n            if stage and stage_key == Flow.MFA_AUTHENTICATE:\n                self._enrich_mfa_flow(stage, pending_flow)\n            self._upsert_pending_flow(ret, pending_flow)\n\n        if (\n            not allauth_settings.SOCIALACCOUNT_ONLY\n            and account_settings.PASSWORD_RESET_BY_CODE_ENABLED\n        ):\n            from allauth.account.internal.flows import password_reset_by_code\n\n            ret.append(\n                {\n                    \"id\": Flow.PASSWORD_RESET_BY_CODE,\n                    \"is_pending\": bool(\n                        password_reset_by_code.PasswordResetVerificationProcess.resume(\n                            request\n                        )\n                    ),\n                }\n            )\n        return ret\n\n    def _upsert_pending_flow(self, flows, pending_flow):\n        flow = next((flow for flow in flows if flow[\"id\"] == pending_flow[\"id\"]), None)\n        if flow:\n            flow.update(pending_flow)\n        else:\n            flows.append(pending_flow)\n\n    def _enrich_mfa_flow(self, stage, flow: dict) -> None:\n        from allauth.mfa.adapter import get_adapter as get_mfa_adapter\n        from allauth.mfa.models import Authenticator\n\n        adapter = get_mfa_adapter()\n        types = []\n        for typ in Authenticator.Type:\n            if adapter.is_mfa_enabled(stage.login.user, types=[typ]):\n                types.append(typ)\n        flow[\"types\"] = types\n\n\nclass AuthenticationResponse(BaseAuthenticationResponse):\n    def __init__(self, request):\n        super().__init__(request, user=request.user)\n\n    @classmethod\n    def from_response(cls, request, response):\n        \"\"\"\n        The response might be a headed redirect to e.g. the confirmation\n        email page, because allauth.account is not (much) headless\n        aware. Also, what if an adapter method return headed responses in\n        post_login()?  So, let's ensure we always return a headless\n        response.\n        \"\"\"\n        if isinstance(response, AuthenticationResponse):\n            return response\n        return AuthenticationResponse(request)\n\n\nclass ReauthenticationResponse(BaseAuthenticationResponse):\n    def __init__(self, request):\n        super().__init__(request, user=request.user, status=HTTPStatus.UNAUTHORIZED)\n\n\nclass UnauthorizedResponse(BaseAuthenticationResponse):\n    def __init__(self, request, status=HTTPStatus.UNAUTHORIZED):\n        super().__init__(request, user=None, status=status)\n\n\nclass ForbiddenResponse(APIResponse):\n    def __init__(self, request):\n        super().__init__(request, status=HTTPStatus.FORBIDDEN)\n\n\nclass ConflictResponse(APIResponse):\n    def __init__(self, request):\n        super().__init__(request, status=HTTPStatus.CONFLICT)\n\n\ndef get_config_data(request) -> dict:\n    login_methods = account_settings.LOGIN_METHODS\n    data = {\n        \"login_methods\": list(login_methods),\n        \"is_open_for_signup\": get_account_adapter().is_open_for_signup(request),\n        \"email_verification_by_code_enabled\": account_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED,\n        \"login_by_code_enabled\": account_settings.LOGIN_BY_CODE_ENABLED,\n        \"password_reset_by_code_enabled\": account_settings.PASSWORD_RESET_BY_CODE_ENABLED,\n    }\n    # NOTE: For backwards compatibility only.\n    if LoginMethod.EMAIL in login_methods and LoginMethod.USERNAME in login_methods:\n        data[\"authentication_method\"] = \"username_email\"\n    elif LoginMethod.EMAIL in login_methods:\n        data[\"authentication_method\"] = \"email\"\n    elif LoginMethod.USERNAME in login_methods:\n        data[\"authentication_method\"] = \"username\"\n    # (end NOTE)\n    return {\"account\": data}\n\n\nclass ConfigResponse(APIResponse):\n    def __init__(self, request):\n        data = get_config_data(request)\n        if allauth_settings.SOCIALACCOUNT_ENABLED:\n            from allauth.headless.socialaccount.response import (\n                get_config_data as get_socialaccount_config_data,\n            )\n\n            data.update(get_socialaccount_config_data(request))\n        if allauth_settings.MFA_ENABLED:\n            from allauth.headless.mfa.response import (\n                get_config_data as get_mfa_config_data,\n            )\n\n            data.update(get_mfa_config_data(request))\n        if allauth_settings.USERSESSIONS_ENABLED:\n            from allauth.headless.usersessions.response import (\n                get_config_data as get_usersessions_config_data,\n            )\n\n            data.update(get_usersessions_config_data(request))\n        return super().__init__(request, data=data)\n\n\nclass RateLimitResponse(APIResponse):\n    def __init__(self, request):\n        super().__init__(request, status=HTTPStatus.TOO_MANY_REQUESTS)\n"
  },
  {
    "path": "allauth/headless/base/urls.py",
    "content": "from django.urls import path\n\nfrom allauth.headless.base import views\n\n\ndef build_urlpatterns(client):\n    return [\n        path(\n            \"config\",\n            views.ConfigView.as_api_view(client=client),\n            name=\"config\",\n        ),\n    ]\n"
  },
  {
    "path": "allauth/headless/base/views.py",
    "content": "from django.utils.decorators import classonlymethod\n\nfrom allauth.account.stages import LoginStage, LoginStageController\nfrom allauth.core.exceptions import ReauthenticationRequired\nfrom allauth.headless.base import response\nfrom allauth.headless.constants import Client\nfrom allauth.headless.internal import decorators\nfrom allauth.headless.internal.restkit.views import RESTView\n\n\nclass APIView(RESTView):\n    client = None\n\n    @classonlymethod\n    def as_api_view(cls, **initkwargs):\n        view_func = cls.as_view(**initkwargs)\n        if initkwargs[\"client\"] == Client.APP:\n            view_func = decorators.app_view(view_func)\n        else:\n            view_func = decorators.browser_view(view_func)\n        return view_func\n\n    def dispatch(self, request, *args, **kwargs):\n        try:\n            return super().dispatch(request, *args, **kwargs)\n        except ReauthenticationRequired:\n            return response.ReauthenticationResponse(self.request)\n\n\nclass AuthenticationStageAPIView(APIView):\n    stage_class: type[LoginStage] | None = None\n\n    def handle(self, request, *args, **kwargs):\n        self.stage = LoginStageController.enter(request, self.stage_class.key)\n        if not self.stage:\n            return response.UnauthorizedResponse(request)\n        return super().handle(request, *args, **kwargs)\n\n    def respond_stage_error(self) -> response.UnauthorizedResponse:\n        return response.UnauthorizedResponse(self.request)\n\n    def respond_next_stage(self) -> response.AuthenticationResponse:\n        self.stage.exit()\n        return response.AuthenticationResponse(self.request)\n\n\nclass AuthenticatedAPIView(APIView):\n    def dispatch(self, request, *args, **kwargs):\n        if not request.user.is_authenticated:\n            return response.AuthenticationResponse(request)\n        return super().dispatch(request, *args, **kwargs)\n\n\nclass ConfigView(APIView):\n    def get(self, request, *args, **kwargs):\n        \"\"\"\n        The frontend queries (GET) this endpoint, expecting to receive\n        either a 401 if no user is authenticated, or user information.\n        \"\"\"\n        return response.ConfigResponse(request)\n"
  },
  {
    "path": "allauth/headless/checks.py",
    "content": "from django.core.checks import Critical, register\n\n\n@register()\ndef settings_check(app_configs, **kwargs):\n    from allauth.headless import app_settings\n\n    ret = []\n    if app_settings.SERVE_SPECIFICATION:\n        try:\n            import yaml  # noqa\n        except ImportError:\n            ret.append(\n                Critical(\n                    msg=\"HEADLESS_SERVE_SPECIFICATION requires the django-allauth[headless-spec] extra to be installed\"\n                )\n            )\n    return ret\n"
  },
  {
    "path": "allauth/headless/constants.py",
    "content": "from enum import Enum\n\nfrom allauth.account.internal.constants import LoginStageKey as AccountLoginStageKey\nfrom allauth.mfa.internal.constants import LoginStageKey as MFALoginStageKey\n\n\nclass Client(str, Enum):\n    APP = \"app\"\n    BROWSER = \"browser\"\n\n\nclass Flow(str, Enum):\n    LOGIN = \"login\"\n    LOGIN_BY_CODE = AccountLoginStageKey.LOGIN_BY_CODE.value\n    MFA_AUTHENTICATE = MFALoginStageKey.MFA_AUTHENTICATE.value\n    MFA_LOGIN_WEBAUTHN = \"mfa_login_webauthn\"\n    MFA_REAUTHENTICATE = \"mfa_reauthenticate\"\n    MFA_SIGNUP_WEBAUTHN = MFALoginStageKey.MFA_SIGNUP_WEBAUTHN.value\n    MFA_TRUST = MFALoginStageKey.MFA_TRUST.value\n    PASSWORD_RESET_BY_CODE = \"password_reset_by_code\"  # nosec\n    PROVIDER_REDIRECT = \"provider_redirect\"\n    PROVIDER_SIGNUP = \"provider_signup\"\n    PROVIDER_TOKEN = \"provider_token\"  # nosec\n    REAUTHENTICATE = \"reauthenticate\"\n    SIGNUP = \"signup\"\n    VERIFY_EMAIL = AccountLoginStageKey.VERIFY_EMAIL.value\n    VERIFY_PHONE = AccountLoginStageKey.VERIFY_PHONE.value\n"
  },
  {
    "path": "allauth/headless/contrib/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/headless/contrib/ninja/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/headless/contrib/ninja/security.py",
    "content": "from django.http import HttpRequest\n\nfrom ninja.security.base import AuthBase\n\nfrom allauth.core.internal.httpkit import get_authorization_credential\nfrom allauth.headless import app_settings\nfrom allauth.headless.internal.sessionkit import authenticate_by_x_session_token\nfrom allauth.headless.tokens.strategies.jwt.internal import validate_access_token\n\n\nclass XSessionTokenAuth(AuthBase):\n    \"\"\"\n    This security class uses the X-Session-Token that django-allauth\n    is using for authentication purposes.\n    \"\"\"\n\n    openapi_type: str = \"apiKey\"\n\n    def __call__(self, request: HttpRequest):\n        token = self.get_session_token(request)\n        if token:\n            user_session = authenticate_by_x_session_token(token)\n            if user_session:\n                return user_session[0]\n        return None\n\n    def get_session_token(self, request: HttpRequest) -> str | None:\n        \"\"\"\n        Returns the session token for the given request, by looking up the\n        ``X-Session-Token`` header. Override this if you want to extract the token\n        from e.g. the ``Authorization`` header.\n        \"\"\"\n        return request.headers.get(\"X-Session-Token\")\n\n\nx_session_token_auth = XSessionTokenAuth()\n\n\nclass JWTTokenAuth(AuthBase):\n\n    openapi_type: str = \"apiKey\"\n\n    def __call__(self, request: HttpRequest):\n        token = get_authorization_credential(\n            request, app_settings.JWT_AUTHORIZATION_HEADER_SCHEME\n        )\n        if token is None:\n            return None\n        user_payload = validate_access_token(token)\n        if user_payload is None:\n            return None\n        user, payload = user_payload\n        request.user = user\n        return payload\n\n\njwt_token_auth = JWTTokenAuth()\n"
  },
  {
    "path": "allauth/headless/contrib/rest_framework/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/headless/contrib/rest_framework/authentication.py",
    "content": "from django.http import HttpRequest\n\nfrom rest_framework import authentication\nfrom rest_framework.exceptions import AuthenticationFailed\n\nfrom allauth.headless import app_settings\nfrom allauth.headless.internal.sessionkit import authenticate_by_x_session_token\n\n\nclass XSessionTokenAuthentication(authentication.BaseAuthentication):\n    \"\"\"\n    This authentication class uses the X-Session-Token that django-allauth\n    is using for authentication purposes.\n    \"\"\"\n\n    def authenticate(self, request: HttpRequest):\n        token = self.get_session_token(request)\n        if token:\n            return authenticate_by_x_session_token(token)\n        return None\n\n    def get_session_token(self, request: HttpRequest) -> str | None:\n        \"\"\"\n        Returns the session token for the given request, by looking up the\n        ``X-Session-Token`` header. Override this if you want to extract the token\n        from e.g. the ``Authorization`` header.\n        \"\"\"\n        return request.headers.get(\"X-Session-Token\")\n\n\nclass JWTTokenAuthentication(authentication.TokenAuthentication):\n\n    @property\n    def keyword(self) -> str:\n        \"\"\"\n        See: ``settings.HEADLESS_JWT_AUTHORIZATION_HEADER_SCHEME``.\n        \"\"\"\n        return app_settings.JWT_AUTHORIZATION_HEADER_SCHEME\n\n    def authenticate_credentials(self, key: str):\n        \"\"\"\n        Validates the given access token.\n        \"\"\"\n        from allauth.headless.tokens.strategies.jwt.internal import (\n            validate_access_token,\n        )\n\n        user_payload = validate_access_token(key)\n        if user_payload is None:\n            raise AuthenticationFailed(\"Invalid token.\")\n        return user_payload\n"
  },
  {
    "path": "allauth/headless/internal/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/headless/internal/authkit.py",
    "content": "from contextlib import contextmanager\nfrom typing import Any\n\nfrom django.utils.functional import SimpleLazyObject, empty\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.account.internal.stagekit import get_pending_stage\nfrom allauth.core.exceptions import ImmediateHttpResponse\nfrom allauth.headless import app_settings\nfrom allauth.headless.constants import Client\nfrom allauth.headless.internal import sessionkit\n\n\nclass AuthenticationStatus:\n    def __init__(self, request) -> None:\n        self.request = request\n\n    @property\n    def is_authenticated(self) -> bool:\n        return self.request.user.is_authenticated\n\n    def get_pending_stage(self):\n        return get_pending_stage(self.request)\n\n    @property\n    def has_pending_signup(self) -> bool:\n        if not allauth_settings.SOCIALACCOUNT_ENABLED:\n            return False\n        from allauth.socialaccount.internal import flows\n\n        return bool(flows.signup.get_pending_signup(self.request))\n\n\ndef purge_request_user_cache(request) -> None:\n    for attr in [\"_cached_user\", \"_acached_user\"]:\n        if hasattr(request, attr):\n            delattr(request, attr)\n    if isinstance(request.user, SimpleLazyObject):\n        request.user._wrapped = empty\n\n\n@contextmanager\ndef authentication_context(request):\n    from allauth.headless.base.response import UnauthorizedResponse\n\n    old_user = request.user\n    old_session = request.session\n    try:\n        request.session = sessionkit.new_session()\n        purge_request_user_cache(request)\n\n        strategy = app_settings.TOKEN_STRATEGY\n        session_token = strategy.get_session_token(request)\n        if session_token:\n            session = strategy.lookup_session(session_token)\n            if not session:\n                raise ImmediateHttpResponse(UnauthorizedResponse(request, status=410))\n            request.session = session\n            purge_request_user_cache(request)\n        request.allauth.headless._pre_user = request.user\n        # request.user is lazy -- force evaluation\n        request.allauth.headless._pre_user.pk\n        yield\n    finally:\n        if request.session.modified and not request.session.is_empty():\n            request.session.save()\n        request.user = old_user\n        request.session = old_session\n        # e.g. logging in calls csrf `rotate_token()` -- this prevents setting a new CSRF cookie.\n        request.META[\"CSRF_COOKIE_NEEDS_UPDATE\"] = False\n\n\ndef expose_access_token(request) -> dict[str, Any] | None:\n    \"\"\"\n    Determines if a new access token needs to be exposed.\n    \"\"\"\n    if request.allauth.headless.client != Client.APP:\n        return None\n    if not request.user.is_authenticated:\n        return None\n    pre_user = request.allauth.headless._pre_user\n    if pre_user.is_authenticated and pre_user.pk == request.user.pk:\n        return None\n    strategy = app_settings.TOKEN_STRATEGY\n    return strategy.create_access_token_payload(request)\n"
  },
  {
    "path": "allauth/headless/internal/decorators.py",
    "content": "from functools import wraps\nfrom types import SimpleNamespace\n\nfrom django.middleware.csrf import get_token\nfrom django.views.decorators.csrf import csrf_exempt\n\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.headless.constants import Client\nfrom allauth.headless.internal import authkit\n\n\ndef mark_request_as_headless(request, client) -> None:\n    request.allauth.headless = SimpleNamespace()\n    request.allauth.headless.client = client\n\n\ndef app_view(\n    function=None,\n):\n    def decorator(view_func):\n        @login_not_required\n        @wraps(view_func)\n        def _wrapper_view(request, *args, **kwargs):\n            mark_request_as_headless(request, Client.APP)\n            with authkit.authentication_context(request):\n                return view_func(request, *args, **kwargs)\n\n        return _wrapper_view\n\n    ret = decorator\n    if function:\n        ret = decorator(function)\n    return csrf_exempt(ret)\n\n\ndef browser_view(\n    function=None,\n):\n    def decorator(view_func):\n        @login_not_required\n        @wraps(view_func)\n        def _wrapper_view(request, *args, **kwargs):\n            mark_request_as_headless(request, Client.BROWSER)\n            # Needed -- so that the CSRF token is set in the response for the\n            # frontend to pick up.\n            get_token(request)\n            return view_func(request, *args, **kwargs)\n\n        return _wrapper_view\n\n    ret = decorator\n    if function:\n        ret = decorator(function)\n    return ret\n"
  },
  {
    "path": "allauth/headless/internal/restkit/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/headless/internal/restkit/inputs.py",
    "content": "from django.forms import (\n    BooleanField,\n    CharField,\n    ChoiceField,\n    Field,\n    Form,\n    ModelChoiceField,\n    ModelMultipleChoiceField,\n)\n\nfrom allauth.account.fields import EmailField\n\n\n__all__ = [\n    \"Field\",\n    \"CharField\",\n    \"ChoiceField\",\n    \"EmailField\",\n    \"BooleanField\",\n    \"ModelMultipleChoiceField\",\n    \"ModelChoiceField\",\n]\n\n\nclass Input(Form):\n    pass\n"
  },
  {
    "path": "allauth/headless/internal/restkit/response.py",
    "content": "from http import HTTPStatus\nfrom typing import Any\n\nfrom django.forms.utils import ErrorList\nfrom django.http import JsonResponse\nfrom django.utils.cache import add_never_cache_headers\n\nfrom allauth.headless.internal import authkit, sessionkit\n\n\nclass APIResponse(JsonResponse):\n    def __init__(\n        self,\n        request,\n        errors=None,\n        data=None,\n        meta: dict | None = None,\n        status: int = HTTPStatus.OK,\n    ):\n        d: dict[str, Any] = {\"status\": status}\n        if data is not None:\n            d[\"data\"] = data\n        meta = self._add_session_meta(request, meta)\n        if meta is not None:\n            d[\"meta\"] = meta\n        if errors:\n            d[\"errors\"] = errors\n        super().__init__(d, status=status)\n        add_never_cache_headers(self)\n\n    def _add_session_meta(self, request, meta: dict | None) -> dict | None:\n        session_token = sessionkit.expose_session_token(request)\n        access_token_payload = authkit.expose_access_token(request)\n        if session_token:\n            meta = meta or {}\n            meta[\"session_token\"] = session_token\n        if access_token_payload:\n            meta = meta or {}\n            meta.update(access_token_payload)\n        return meta\n\n\nclass ErrorResponse(APIResponse):\n    def __init__(\n        self, request, exception=None, input=None, status=HTTPStatus.BAD_REQUEST\n    ):\n        errors = []\n        if exception is not None:\n            error_datas = ErrorList(exception.error_list).get_json_data()\n            errors.extend(error_datas)\n        if input is not None:\n            for field, error_list in input.errors.items():\n                error_datas = error_list.get_json_data()\n                for error_data in error_datas:\n                    if field != \"__all__\":\n                        error_data[\"param\"] = field\n                errors.extend(error_datas)\n        super().__init__(request, status=status, errors=errors)\n"
  },
  {
    "path": "allauth/headless/internal/restkit/views.py",
    "content": "import json\n\nfrom django.http import HttpResponseBadRequest\nfrom django.views.generic import View\n\nfrom allauth.core.exceptions import ImmediateHttpResponse\nfrom allauth.headless.internal.restkit.inputs import Input\nfrom allauth.headless.internal.restkit.response import ErrorResponse\n\n\nclass RESTView(View):\n    input_class: dict[str, type[Input]] | None | type[Input] = None\n    handle_json_input = True\n\n    def dispatch(self, request, *args, **kwargs):\n        return self.handle(request, *args, **kwargs)\n\n    def handle(self, request, *args, **kwargs):\n        if self.handle_json_input and request.method != \"GET\":\n            self.data = self._parse_json(request)\n            response = self.handle_input(self.data)\n            if response:\n                return response\n        return super().dispatch(request, *args, **kwargs)\n\n    def get_input_class(self):\n        input_class = self.input_class\n        if isinstance(input_class, dict):\n            input_class = input_class.get(self.request.method)\n        return input_class\n\n    def get_input_kwargs(self) -> dict:\n        return {}\n\n    def handle_input(self, data):\n        input_class = self.get_input_class()\n        if not input_class:\n            return\n        input_kwargs = self.get_input_kwargs()\n        if data is None:\n            # Make form bound on empty POST\n            data = {}\n        self.input = input_class(data=data, **input_kwargs)\n        if not self.input.is_valid():\n            return self.handle_invalid_input(self.input)\n\n    def handle_invalid_input(self, input):\n        return ErrorResponse(self.request, input=input)\n\n    def _parse_json(self, request):\n        if request.method == \"GET\" or not request.body:\n            return\n        try:\n            return json.loads(request.body.decode(\"utf8\"))\n        except (UnicodeDecodeError, json.JSONDecodeError):\n            raise ImmediateHttpResponse(response=HttpResponseBadRequest())\n"
  },
  {
    "path": "allauth/headless/internal/sessionkit.py",
    "content": "from importlib import import_module\n\nfrom django.conf import settings\nfrom django.contrib.auth import SESSION_KEY, get_user_model\nfrom django.contrib.sessions.backends.base import SessionBase\n\nfrom allauth.headless import app_settings\nfrom allauth.headless.constants import Client\n\n\ndef session_store(session_key=None):\n    engine = import_module(settings.SESSION_ENGINE)\n    return engine.SessionStore(session_key=session_key)\n\n\ndef new_session() -> SessionBase:\n    return session_store()\n\n\ndef expose_session_token(request):\n    if request.allauth.headless.client != Client.APP:\n        return\n    strategy = app_settings.TOKEN_STRATEGY\n    hdr_token = strategy.get_session_token(request)\n    modified = request.session.modified\n    empty = request.session.is_empty()\n    if modified and not empty:\n        new_token = strategy.create_session_token(request)\n        if not hdr_token or hdr_token != new_token:\n            return new_token\n\n\ndef authenticate_by_x_session_token(token: str) -> tuple | None:\n    session = app_settings.TOKEN_STRATEGY.lookup_session(token)\n    if not session:\n        return None\n    user_id_str = session.get(SESSION_KEY)\n    if user_id_str:\n        meta_pk = get_user_model()._meta.pk\n        if meta_pk:\n            user_id = meta_pk.to_python(user_id_str)\n            user = get_user_model().objects.filter(pk=user_id).first()\n            if user and user.is_active:\n                return (user, session)\n    return None\n\n\ndef lookup_session(session_key: str) -> SessionBase | None:\n    if session_store().exists(session_key):\n        return session_store(session_key)\n    return None\n"
  },
  {
    "path": "allauth/headless/mfa/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/headless/mfa/inputs.py",
    "content": "from allauth.account.forms import BaseSignupForm\nfrom allauth.headless.internal.restkit import inputs\nfrom allauth.mfa.base.forms import AuthenticateForm\nfrom allauth.mfa.models import Authenticator\nfrom allauth.mfa.recovery_codes.forms import GenerateRecoveryCodesForm\nfrom allauth.mfa.totp.forms import ActivateTOTPForm\nfrom allauth.mfa.webauthn.forms import (\n    AddWebAuthnForm,\n    AuthenticateWebAuthnForm,\n    LoginWebAuthnForm,\n    ReauthenticateWebAuthnForm,\n    SignupWebAuthnForm,\n)\n\n\nclass AuthenticateInput(AuthenticateForm, inputs.Input):\n    pass\n\n\nclass ActivateTOTPInput(ActivateTOTPForm, inputs.Input):\n    pass\n\n\nclass GenerateRecoveryCodesInput(GenerateRecoveryCodesForm, inputs.Input):\n    pass\n\n\nclass AddWebAuthnInput(AddWebAuthnForm, inputs.Input):\n    pass\n\n\nclass CreateWebAuthnInput(SignupWebAuthnForm, inputs.Input):\n    pass\n\n\nclass UpdateWebAuthnInput(inputs.Input):\n    id = inputs.ModelChoiceField(queryset=Authenticator.objects.none())\n    name = inputs.CharField(required=True, max_length=100)\n\n    def __init__(self, *args, **kwargs):\n        self.user = kwargs.pop(\"user\")\n        super().__init__(*args, **kwargs)\n        self.fields[\"id\"].queryset = Authenticator.objects.filter(\n            user=self.user, type=Authenticator.Type.WEBAUTHN\n        )\n\n\nclass DeleteWebAuthnInput(inputs.Input):\n    authenticators = inputs.ModelMultipleChoiceField(\n        queryset=Authenticator.objects.none()\n    )\n\n    def __init__(self, *args, **kwargs):\n        self.user = kwargs.pop(\"user\")\n        super().__init__(*args, **kwargs)\n        self.fields[\"authenticators\"].queryset = Authenticator.objects.filter(\n            user=self.user, type=Authenticator.Type.WEBAUTHN\n        )\n\n\nclass ReauthenticateWebAuthnInput(ReauthenticateWebAuthnForm, inputs.Input):\n    pass\n\n\nclass AuthenticateWebAuthnInput(AuthenticateWebAuthnForm, inputs.Input):\n    pass\n\n\nclass LoginWebAuthnInput(LoginWebAuthnForm, inputs.Input):\n    pass\n\n\nclass SignupWebAuthnInput(BaseSignupForm, inputs.Input):\n    pass\n\n\nclass TrustInput(inputs.Input):\n    trust = inputs.BooleanField(required=False)\n"
  },
  {
    "path": "allauth/headless/mfa/response.py",
    "content": "from http import HTTPStatus\n\nfrom allauth.headless.base.response import APIResponse\nfrom allauth.mfa import app_settings as mfa_settings\n\n\ndef get_config_data(request) -> dict:\n    data = {\n        \"mfa\": {\n            \"supported_types\": mfa_settings.SUPPORTED_TYPES,\n            \"passkey_login_enabled\": mfa_settings.PASSKEY_LOGIN_ENABLED,\n        }\n    }\n    return data\n\n\ndef _authenticator_data(authenticator, sensitive: bool = False) -> dict:\n    data = {\n        \"type\": authenticator.type,\n        \"created_at\": authenticator.created_at.timestamp(),\n        \"last_used_at\": (\n            authenticator.last_used_at.timestamp()\n            if authenticator.last_used_at\n            else None\n        ),\n    }\n    if authenticator.type == authenticator.Type.TOTP:\n        pass\n    elif authenticator.type == authenticator.Type.RECOVERY_CODES:\n        wrapped = authenticator.wrap()\n        unused_codes = wrapped.get_unused_codes()\n        data.update(\n            {\n                \"total_code_count\": len(wrapped.generate_codes()),\n                \"unused_code_count\": len(unused_codes),\n            }\n        )\n        if sensitive:\n            data[\"unused_codes\"] = unused_codes\n    elif authenticator.type == authenticator.Type.WEBAUTHN:\n        wrapped = authenticator.wrap()\n        data[\"id\"] = authenticator.pk\n        data[\"name\"] = wrapped.name\n        passwordless = wrapped.is_passwordless\n        if passwordless is not None:\n            data[\"is_passwordless\"] = passwordless\n    return data\n\n\nclass AuthenticatorDeletedResponse(APIResponse):\n    pass\n\n\nclass AuthenticatorsDeletedResponse(APIResponse):\n    pass\n\n\nclass TOTPNotFoundResponse(APIResponse):\n    def __init__(self, request, secret, totp_url):\n        super().__init__(\n            request,\n            meta={\n                \"secret\": secret,\n                \"totp_url\": totp_url,\n            },\n            status=HTTPStatus.NOT_FOUND,\n        )\n\n\nclass TOTPResponse(APIResponse):\n    def __init__(self, request, authenticator):\n        data = _authenticator_data(authenticator)\n        super().__init__(request, data=data)\n\n\nclass AuthenticatorsResponse(APIResponse):\n    def __init__(self, request, authenticators):\n        data = [_authenticator_data(authenticator) for authenticator in authenticators]\n        super().__init__(request, data=data)\n\n\nclass AuthenticatorResponse(APIResponse):\n    def __init__(self, request, authenticator, meta=None):\n        data = _authenticator_data(authenticator)\n        super().__init__(request, data=data, meta=meta)\n\n\nclass RecoveryCodesNotFoundResponse(APIResponse):\n    def __init__(self, request):\n        super().__init__(request, status=HTTPStatus.NOT_FOUND)\n\n\nclass RecoveryCodesResponse(APIResponse):\n    def __init__(self, request, authenticator):\n        data = _authenticator_data(authenticator, sensitive=True)\n        super().__init__(request, data=data)\n\n\nclass AddWebAuthnResponse(APIResponse):\n    def __init__(self, request, registration_data):\n        super().__init__(request, data={\"creation_options\": registration_data})\n\n\nclass WebAuthnRequestOptionsResponse(APIResponse):\n    def __init__(self, request, request_options):\n        super().__init__(request, data={\"request_options\": request_options})\n"
  },
  {
    "path": "allauth/headless/mfa/urls.py",
    "content": "from django.urls import include, path\n\nfrom allauth.headless.constants import Client\nfrom allauth.headless.mfa import views\nfrom allauth.mfa import app_settings as mfa_settings\n\n\ndef build_urlpatterns(client):\n    auth_patterns = [\n        path(\n            \"2fa/authenticate\",\n            views.AuthenticateView.as_api_view(client=client),\n            name=\"authenticate\",\n        ),\n        path(\n            \"2fa/reauthenticate\",\n            views.ReauthenticateView.as_api_view(client=client),\n            name=\"reauthenticate\",\n        ),\n    ]\n    if mfa_settings.TRUST_ENABLED and client == Client.BROWSER:\n        auth_patterns.append(\n            path(\n                \"2fa/trust\",\n                views.TrustView.as_api_view(client=client),\n                name=\"trust\",\n            )\n        )\n\n    authenticators = []\n    if \"totp\" in mfa_settings.SUPPORTED_TYPES:\n        authenticators.append(\n            path(\n                \"totp\",\n                views.ManageTOTPView.as_api_view(client=client),\n                name=\"manage_totp\",\n            )\n        )\n    if \"recovery_codes\" in mfa_settings.SUPPORTED_TYPES:\n        authenticators.append(\n            path(\n                \"recovery-codes\",\n                views.ManageRecoveryCodesView.as_api_view(client=client),\n                name=\"manage_recovery_codes\",\n            )\n        )\n    if \"webauthn\" in mfa_settings.SUPPORTED_TYPES:\n        authenticators.extend(\n            [\n                path(\n                    \"webauthn\",\n                    views.ManageWebAuthnView.as_api_view(client=client),\n                    name=\"manage_webauthn\",\n                ),\n            ]\n        )\n        auth_patterns.extend(\n            [\n                path(\n                    \"webauthn/authenticate\",\n                    views.AuthenticateWebAuthnView.as_api_view(client=client),\n                    name=\"authenticate_webauthn\",\n                ),\n                path(\n                    \"webauthn/reauthenticate\",\n                    views.ReauthenticateWebAuthnView.as_api_view(client=client),\n                    name=\"reauthenticate_webauthn\",\n                ),\n            ]\n        )\n        if mfa_settings.PASSKEY_LOGIN_ENABLED:\n            auth_patterns.append(\n                path(\n                    \"webauthn/login\",\n                    views.LoginWebAuthnView.as_api_view(client=client),\n                    name=\"login_webauthn\",\n                )\n            )\n        if mfa_settings.PASSKEY_SIGNUP_ENABLED:\n            auth_patterns.append(\n                path(\n                    \"webauthn/signup\",\n                    views.SignupWebAuthnView.as_api_view(client=client),\n                    name=\"signup_webauthn\",\n                )\n            )\n\n    return [\n        path(\n            \"auth/\",\n            include(auth_patterns),\n        ),\n        path(\n            \"account/\",\n            include(\n                [\n                    path(\n                        \"authenticators\",\n                        views.AuthenticatorsView.as_api_view(client=client),\n                        name=\"authenticators\",\n                    ),\n                    path(\n                        \"authenticators/\",\n                        include(authenticators),\n                    ),\n                ]\n            ),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/headless/mfa/views.py",
    "content": "from http import HTTPStatus\n\nfrom django.core.exceptions import ValidationError\nfrom django.http import HttpResponse\n\nfrom allauth.account.internal.stagekit import get_pending_stage\nfrom allauth.account.models import Login\nfrom allauth.headless.account.views import SignupView\nfrom allauth.headless.base.response import (\n    APIResponse,\n    AuthenticationResponse,\n    ConflictResponse,\n)\nfrom allauth.headless.base.views import (\n    APIView,\n    AuthenticatedAPIView,\n    AuthenticationStageAPIView,\n)\nfrom allauth.headless.internal.restkit.response import ErrorResponse\nfrom allauth.headless.mfa import response\nfrom allauth.headless.mfa.inputs import (\n    ActivateTOTPInput,\n    AddWebAuthnInput,\n    AuthenticateInput,\n    AuthenticateWebAuthnInput,\n    CreateWebAuthnInput,\n    DeleteWebAuthnInput,\n    GenerateRecoveryCodesInput,\n    LoginWebAuthnInput,\n    ReauthenticateWebAuthnInput,\n    SignupWebAuthnInput,\n    TrustInput,\n    UpdateWebAuthnInput,\n)\nfrom allauth.mfa.adapter import DefaultMFAAdapter, get_adapter\nfrom allauth.mfa.internal.flows import add\nfrom allauth.mfa.internal.flows.trust import trust_browser\nfrom allauth.mfa.models import Authenticator\nfrom allauth.mfa.recovery_codes.internal import flows as recovery_codes_flows\nfrom allauth.mfa.stages import AuthenticateStage, TrustStage\nfrom allauth.mfa.totp.internal import auth as totp_auth, flows as totp_flows\nfrom allauth.mfa.webauthn.internal import auth as webauthn_auth, flows as webauthn_flows\nfrom allauth.mfa.webauthn.stages import PasskeySignupStage\n\n\ndef _validate_can_add_authenticator(request):\n    try:\n        add.validate_can_add_authenticator(request.user)\n    except ValidationError as e:\n        return ErrorResponse(request, status=HTTPStatus.CONFLICT, exception=e)\n\n\nclass AuthenticateView(AuthenticationStageAPIView):\n    input_class = AuthenticateInput\n    stage_class = AuthenticateStage\n\n    def post(self, request, *args, **kwargs):\n        self.input.save()\n        return self.respond_next_stage()\n\n    def get_input_kwargs(self) -> dict:\n        return {\"user\": self.stage.login.user}\n\n\nclass ReauthenticateView(AuthenticatedAPIView):\n    input_class = AuthenticateInput\n\n    def post(self, request, *args, **kwargs):\n        self.input.save()\n        return AuthenticationResponse(self.request)\n\n    def get_input_kwargs(self) -> dict:\n        return {\"user\": self.request.user}\n\n\nclass AuthenticatorsView(AuthenticatedAPIView):\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        authenticators = Authenticator.objects.filter(user=request.user)\n        return response.AuthenticatorsResponse(request, authenticators)\n\n\nclass ManageTOTPView(AuthenticatedAPIView):\n    input_class = {\"POST\": ActivateTOTPInput}\n\n    def get(self, request, *args, **kwargs) -> APIResponse:\n        authenticator = self._get_authenticator()\n        if not authenticator:\n            err = _validate_can_add_authenticator(request)\n            if err:\n                return err\n            adapter: DefaultMFAAdapter = get_adapter()\n            secret = totp_auth.get_totp_secret(regenerate=True)\n            totp_url: str = adapter.build_totp_url(request.user, secret)\n            return response.TOTPNotFoundResponse(request, secret, totp_url)\n        return response.TOTPResponse(request, authenticator)\n\n    def _get_authenticator(self):\n        return Authenticator.objects.filter(\n            type=Authenticator.Type.TOTP, user=self.request.user\n        ).first()\n\n    def get_input_kwargs(self) -> dict:\n        return {\"user\": self.request.user}\n\n    def post(self, request, *args, **kwargs):\n        authenticator = totp_flows.activate_totp(request, self.input)[0]\n        return response.TOTPResponse(request, authenticator)\n\n    def delete(self, request, *args, **kwargs):\n        authenticator = self._get_authenticator()\n        if authenticator:\n            authenticator = totp_flows.deactivate_totp(request, authenticator)\n        return response.AuthenticatorDeletedResponse(request)\n\n\nclass ManageRecoveryCodesView(AuthenticatedAPIView):\n    input_class = GenerateRecoveryCodesInput\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        authenticator = recovery_codes_flows.view_recovery_codes(request)\n        if not authenticator:\n            return response.RecoveryCodesNotFoundResponse(request)\n        return response.RecoveryCodesResponse(request, authenticator)\n\n    def post(self, request, *args, **kwargs):\n        authenticator = recovery_codes_flows.generate_recovery_codes(request)\n        return response.RecoveryCodesResponse(request, authenticator)\n\n    def get_input_kwargs(self) -> dict:\n        return {\"user\": self.request.user}\n\n\nclass ManageWebAuthnView(AuthenticatedAPIView):\n    input_class = {\n        \"POST\": AddWebAuthnInput,\n        \"PUT\": UpdateWebAuthnInput,\n        \"DELETE\": DeleteWebAuthnInput,\n    }\n\n    def handle(self, request, *args, **kwargs):\n        if request.method in [\"GET\", \"POST\"]:\n            err = _validate_can_add_authenticator(request)\n            if err:\n                return err\n        return super().handle(request, *args, **kwargs)\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        passwordless = \"passwordless\" in request.GET\n        creation_options = webauthn_flows.begin_registration(\n            request, request.user, passwordless\n        )\n        return response.AddWebAuthnResponse(request, creation_options)\n\n    def get_input_kwargs(self) -> dict:\n        return {\"user\": self.request.user}\n\n    def post(self, request, *args, **kwargs):\n        auth, rc_auth = webauthn_flows.add_authenticator(\n            request,\n            name=self.input.cleaned_data[\"name\"],\n            credential=self.input.cleaned_data[\"credential\"],\n        )\n        did_generate_recovery_codes = bool(rc_auth)\n        return response.AuthenticatorResponse(\n            request,\n            auth,\n            meta={\"recovery_codes_generated\": did_generate_recovery_codes},\n        )\n\n    def put(self, request, *args, **kwargs):\n        authenticator = self.input.cleaned_data[\"id\"]\n        webauthn_flows.rename_authenticator(\n            request, authenticator, self.input.cleaned_data[\"name\"]\n        )\n        return response.AuthenticatorResponse(request, authenticator)\n\n    def delete(self, request, *args, **kwargs):\n        authenticators = self.input.cleaned_data[\"authenticators\"]\n        webauthn_flows.remove_authenticators(request, authenticators)\n        return response.AuthenticatorsDeletedResponse(request)\n\n\nclass ReauthenticateWebAuthnView(AuthenticatedAPIView):\n    input_class = {\n        \"POST\": ReauthenticateWebAuthnInput,\n    }\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        request_options = webauthn_auth.begin_authentication(request.user)\n        return response.WebAuthnRequestOptionsResponse(request, request_options)\n\n    def get_input_kwargs(self) -> dict:\n        return {\"user\": self.request.user}\n\n    def post(self, request, *args, **kwargs):\n        authenticator = self.input.cleaned_data[\"credential\"]\n        webauthn_flows.reauthenticate(request, authenticator)\n        return AuthenticationResponse(self.request)\n\n\nclass AuthenticateWebAuthnView(AuthenticationStageAPIView):\n    input_class = {\n        \"POST\": AuthenticateWebAuthnInput,\n    }\n    stage_class = AuthenticateStage\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        request_options = webauthn_auth.begin_authentication(self.stage.login.user)\n        return response.WebAuthnRequestOptionsResponse(request, request_options)\n\n    def get_input_kwargs(self) -> dict:\n        return {\"user\": self.stage.login.user}\n\n    def post(self, request, *args, **kwargs):\n        self.input.save()\n        return self.respond_next_stage()\n\n\nclass LoginWebAuthnView(APIView):\n    input_class = {\n        \"POST\": LoginWebAuthnInput,\n    }\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        request_options = webauthn_auth.begin_authentication()\n        return response.WebAuthnRequestOptionsResponse(request, request_options)\n\n    def post(self, request, *args, **kwargs):\n        authenticator = self.input.cleaned_data[\"credential\"]\n        redirect_url = None\n        login = Login(user=authenticator.user, redirect_url=redirect_url)\n        webauthn_flows.perform_passwordless_login(request, authenticator, login)\n        return AuthenticationResponse(request)\n\n\nclass SignupWebAuthnView(SignupView):\n    input_class = {\n        \"POST\": SignupWebAuthnInput,\n        \"PUT\": CreateWebAuthnInput,\n    }\n    by_passkey = True\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        resp = self._require_stage()\n        if resp:\n            return resp\n        creation_options = webauthn_flows.begin_registration(\n            request, self.stage.login.user, passwordless=True, signup=True\n        )\n        return response.AddWebAuthnResponse(request, creation_options)\n\n    def _prep_stage(self):\n        if hasattr(self, \"stage\"):\n            return self.stage\n        self.stage = get_pending_stage(self.request)\n        return self.stage\n\n    def _require_stage(self):\n        self._prep_stage()\n        if not self.stage or self.stage.key != PasskeySignupStage.key:\n            return ConflictResponse(self.request)\n        return None\n\n    def get_input_kwargs(self) -> dict:\n        ret = super().get_input_kwargs()\n        self._prep_stage()\n        if self.stage and self.request.method == \"PUT\":\n            ret[\"user\"] = self.stage.login.user\n        return ret\n\n    def put(self, request, *args, **kwargs):\n        resp = self._require_stage()\n        if resp:\n            return resp\n        webauthn_flows.signup_authenticator(\n            request,\n            user=self.stage.login.user,\n            name=self.input.cleaned_data[\"name\"],\n            credential=self.input.cleaned_data[\"credential\"],\n        )\n        self.stage.exit()\n        return AuthenticationResponse(request)\n\n\nclass TrustView(AuthenticationStageAPIView):\n    input_class = TrustInput\n    stage_class = TrustStage\n\n    def post(self, request, *args, **kwargs):\n        trust = self.input.cleaned_data[\"trust\"]\n        response = self.respond_next_stage()\n        if trust:\n            trust_browser(request, self.stage.login.user, response)\n        return response\n"
  },
  {
    "path": "allauth/headless/socialaccount/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/headless/socialaccount/forms.py",
    "content": "from django import forms\nfrom django.core.exceptions import ObjectDoesNotExist\n\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.core import context\nfrom allauth.headless.adapter import get_adapter\nfrom allauth.socialaccount.adapter import get_adapter as get_socialaccount_adapter\nfrom allauth.socialaccount.providers.base.constants import AuthProcess\n\n\nclass RedirectToProviderForm(forms.Form):\n    provider = forms.CharField()\n    callback_url = forms.CharField()\n    process = forms.ChoiceField(\n        choices=[\n            (AuthProcess.LOGIN, AuthProcess.LOGIN),\n            (AuthProcess.CONNECT, AuthProcess.CONNECT),\n        ]\n    )\n\n    def clean_callback_url(self) -> str:\n        url = self.cleaned_data[\"callback_url\"]\n        if not get_account_adapter().is_safe_url(url):\n            raise get_adapter().validation_error(\"invalid_url\")\n        return url\n\n    def clean_provider(self):\n        provider_id = self.cleaned_data[\"provider\"]\n        try:\n            provider = get_socialaccount_adapter().get_provider(\n                context.request, provider_id\n            )\n        except ObjectDoesNotExist:\n            raise get_adapter().validation_error(\"unknown_provider\")\n        return provider\n"
  },
  {
    "path": "allauth/headless/socialaccount/inputs.py",
    "content": "from django.core.exceptions import ValidationError\n\nfrom allauth.core import context\nfrom allauth.headless.adapter import get_adapter\nfrom allauth.headless.internal.restkit import inputs\nfrom allauth.socialaccount.adapter import get_adapter as get_socialaccount_adapter\nfrom allauth.socialaccount.forms import SignupForm\nfrom allauth.socialaccount.internal.flows.connect import validate_disconnect\nfrom allauth.socialaccount.models import SocialAccount, SocialApp\nfrom allauth.socialaccount.providers import registry\nfrom allauth.socialaccount.providers.base.constants import AuthProcess\n\n\nclass SignupInput(SignupForm, inputs.Input):\n    pass\n\n\nclass DeleteProviderAccountInput(inputs.Input):\n    provider = inputs.CharField()\n    account = inputs.CharField()\n\n    def __init__(self, *args, **kwargs):\n        self.user = kwargs.pop(\"user\")\n        super().__init__(*args, **kwargs)\n\n    def clean(self):\n        cleaned_data = super().clean()\n        uid = cleaned_data.get(\"account\")\n        provider_id = cleaned_data.get(\"provider\")\n        if uid and provider_id:\n            accounts = SocialAccount.objects.filter(user=self.user)\n            account = accounts.filter(\n                uid=uid,\n                provider=provider_id,\n            ).first()\n            if not account:\n                raise get_adapter().validation_error(\"account_not_found\")\n            validate_disconnect(context.request, account)\n            self.cleaned_data[\"account\"] = account\n        return cleaned_data\n\n\nclass ProviderTokenInput(inputs.Input):\n    provider = inputs.CharField()\n    process = inputs.ChoiceField(\n        choices=[\n            (AuthProcess.LOGIN, AuthProcess.LOGIN),\n            (AuthProcess.CONNECT, AuthProcess.CONNECT),\n        ]\n    )\n    token = inputs.Field()\n\n    def clean(self):\n        cleaned_data = super().clean()\n        token = self.data.get(\"token\")\n        adapter = get_adapter()\n        if not isinstance(token, dict):\n            self.add_error(\"token\", adapter.validation_error(\"invalid_token\"))\n            token = None\n\n        provider_id = cleaned_data.get(\"provider\")\n        provider = None\n        if provider_id and token:\n            provider_class = registry.get_class(provider_id)\n            # If `provider_id` is a sub provider ID we won't find it by class.\n            client_id_required = provider_class is None or provider_class.uses_apps\n            client_id = token.get(\"client_id\")\n            if client_id_required and not isinstance(client_id, str):\n                self.add_error(\"token\", adapter.validation_error(\"client_id_required\"))\n            else:\n                try:\n                    provider = get_socialaccount_adapter().get_provider(\n                        context.request, provider_id, client_id=client_id\n                    )\n                except SocialApp.DoesNotExist:\n                    self.add_error(\"token\", adapter.validation_error(\"invalid_token\"))\n                else:\n                    if not provider.supports_token_authentication:\n                        self.add_error(\n                            \"provider\",\n                            adapter.validation_error(\n                                \"token_authentication_not_supported\"\n                            ),\n                        )\n                    elif (\n                        provider.uses_apps\n                        and client_id\n                        and provider.app.client_id != client_id\n                    ):\n                        self.add_error(\n                            \"token\", adapter.validation_error(\"client_id_mismatch\")\n                        )\n                    else:\n                        id_token = token.get(\"id_token\")\n                        access_token = token.get(\"access_token\")\n                        if (\n                            (id_token is not None and not isinstance(id_token, str))\n                            or (\n                                access_token is not None\n                                and not isinstance(access_token, str)\n                            )\n                            or (not id_token and not access_token)\n                        ):\n                            self.add_error(\n                                \"token\", adapter.validation_error(\"token_required\")\n                            )\n        if not self.errors:\n            cleaned_data[\"provider\"] = provider\n            try:\n                login = provider.verify_token(context.request, token)\n                login.state[\"process\"] = cleaned_data[\"process\"]\n                cleaned_data[\"sociallogin\"] = login\n            except ValidationError as e:\n                self.add_error(\"token\", e)\n        return cleaned_data\n"
  },
  {
    "path": "allauth/headless/socialaccount/internal.py",
    "content": "from django.core.exceptions import PermissionDenied, ValidationError\nfrom django.http import HttpResponseRedirect\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.core.exceptions import (\n    ImmediateHttpResponse,\n    ReauthenticationRequired,\n    SignupClosedException,\n)\nfrom allauth.core.internal import httpkit\nfrom allauth.headless.internal.authkit import AuthenticationStatus\nfrom allauth.socialaccount.internal import flows, statekit\nfrom allauth.socialaccount.providers.base.constants import AuthError, AuthProcess\n\n\ndef on_authentication_error(\n    request,\n    provider,\n    error=None,\n    exception=None,\n    extra_context=None,\n    state_id=None,\n) -> None:\n    \"\"\"\n    Called at a time when it is not clear whether or not this is a headless flow.\n    \"\"\"\n    state = None\n    if extra_context:\n        state = extra_context.get(\"state\")\n        if state is None:\n            state_id = extra_context.get(\"state_id\")\n            if state_id:\n                state = statekit.unstash_state(request, state_id)\n    params = {\"error\": error}\n    if state is not None:\n        headless = state.get(\"headless\")\n        next_url = state.get(\"next\")\n        params[\"error_process\"] = state[\"process\"]\n    else:\n        headless = allauth_settings.HEADLESS_ONLY\n        next_url = None\n        params[\"error_process\"] = AuthProcess.LOGIN\n    if not headless:\n        return\n    if not next_url:\n        next_url = httpkit.get_frontend_url(request, \"socialaccount_login_error\") or \"/\"\n    next_url = httpkit.add_query_params(next_url, params)\n    raise ImmediateHttpResponse(HttpResponseRedirect(next_url))\n\n\ndef complete_token_login(request, sociallogin):\n    return flows.login.complete_login(request, sociallogin, raises=True)\n\n\ndef complete_login(request, sociallogin):\n    \"\"\"\n    Called when `sociallogin.is_headless`.\n    \"\"\"\n    error = None\n    try:\n        flows.login.complete_login(request, sociallogin, raises=True)\n    except ReauthenticationRequired:\n        error = \"reauthentication_required\"\n    except SignupClosedException:\n        error = \"signup_closed\"\n    except PermissionDenied:\n        error = \"permission_denied\"\n    except ValidationError as e:\n        error = e.code\n    else:\n        # At this stage, we're either:\n        # 1) logged in (or in of the login pipeline stages, such as email verification)\n        # 2) auto signed up -- a pipeline stage, so see 1)\n        # 3) performing a social signup\n\n        # 4) Stopped, due to not being open-for-signup\n        # It would be good to refactor the above into a more generic social login\n        # pipeline with clear stages, but for now the /auth endpoint properly responds\n        status = AuthenticationStatus(request)\n        if all(\n            [\n                not status.is_authenticated,\n                not status.has_pending_signup,\n                not status.get_pending_stage(),\n            ]\n        ):\n            error = AuthError.UNKNOWN\n    next_url = sociallogin.state[\"next\"]\n    if error:\n        next_url = httpkit.add_query_params(\n            next_url,\n            {\"error\": error, \"error_process\": sociallogin.state[\"process\"]},\n        )\n    return HttpResponseRedirect(next_url)\n"
  },
  {
    "path": "allauth/headless/socialaccount/response.py",
    "content": "from allauth.headless.account.response import email_address_data\nfrom allauth.headless.adapter import get_adapter\nfrom allauth.headless.base.response import APIResponse\nfrom allauth.headless.constants import Client, Flow\nfrom allauth.socialaccount.adapter import get_adapter as get_socialaccount_adapter\nfrom allauth.socialaccount.internal.flows import signup\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\ndef _socialaccount_data(request, account):\n    return {\n        \"uid\": account.uid,\n        \"provider\": _provider_data(request, account.get_provider()),\n        \"display\": account.get_provider_account().to_str(),\n    }\n\n\ndef _provider_data(request, provider):\n    ret = {\"id\": provider.sub_id, \"name\": provider.name, \"flows\": []}\n    if provider.supports_redirect:\n        ret[\"flows\"].append(Flow.PROVIDER_REDIRECT)\n    if provider.supports_token_authentication:\n        ret[\"flows\"].append(Flow.PROVIDER_TOKEN)\n    if isinstance(provider, OAuth2Provider):\n        ret[\"client_id\"] = provider.app.client_id\n        if provider.id == \"openid_connect\":\n            ret[\"openid_configuration_url\"] = provider.server_url\n\n    return ret\n\n\ndef provider_flows(request):\n    flows = []\n    providers = _list_supported_providers(request)\n    if providers:\n        redirect_providers = [p.sub_id for p in providers if p.supports_redirect]\n        token_providers = [\n            p.sub_id for p in providers if p.supports_token_authentication\n        ]\n        if redirect_providers and request.allauth.headless.client == Client.BROWSER:\n            flows.append(\n                {\n                    \"id\": Flow.PROVIDER_REDIRECT,\n                    \"providers\": redirect_providers,\n                }\n            )\n        if token_providers:\n            flows.append(\n                {\n                    \"id\": Flow.PROVIDER_TOKEN,\n                    \"providers\": token_providers,\n                }\n            )\n        sociallogin = signup.get_pending_signup(request)\n        if sociallogin:\n            flows.append(_signup_flow(request, sociallogin))\n    return flows\n\n\ndef _signup_flow(request, sociallogin):\n    provider = sociallogin.provider\n    flow = {\n        \"id\": Flow.PROVIDER_SIGNUP,\n        \"provider\": _provider_data(request, provider),\n        \"is_pending\": True,\n    }\n    return flow\n\n\ndef _is_provider_supported(provider, client):\n    if client == Client.APP:\n        return provider.supports_token_authentication\n    elif client == Client.BROWSER:\n        return provider.supports_redirect\n    return False\n\n\ndef _list_supported_providers(request):\n    adapter = get_socialaccount_adapter()\n    providers = adapter.list_providers(request)\n    providers = [\n        p\n        for p in providers\n        if _is_provider_supported(p, request.allauth.headless.client)\n    ]\n    return providers\n\n\ndef get_config_data(request):\n    entries = []\n    data = {\"socialaccount\": {\"providers\": entries}}\n    providers = _list_supported_providers(request)\n    providers = sorted(providers, key=lambda p: p.name)\n    for provider in providers:\n        entries.append(_provider_data(request, provider))\n    return data\n\n\nclass SocialAccountsResponse(APIResponse):\n    def __init__(self, request, accounts):\n        data = [_socialaccount_data(request, account) for account in accounts]\n        super().__init__(request, data=data)\n\n\nclass SocialLoginResponse(APIResponse):\n    def __init__(self, request, sociallogin):\n        adapter = get_adapter()\n        data = {\n            \"user\": adapter.serialize_user(sociallogin.user),\n            \"account\": _socialaccount_data(request, sociallogin.account),\n            \"email\": [email_address_data(ea) for ea in sociallogin.email_addresses],\n        }\n        super().__init__(request, data=data)\n"
  },
  {
    "path": "allauth/headless/socialaccount/urls.py",
    "content": "from django.urls import include, path\n\nfrom allauth.headless.socialaccount import views\n\n\ndef build_urlpatterns(client):\n    return [\n        path(\n            \"account/\",\n            include(\n                [\n                    path(\n                        \"providers\",\n                        views.ManageProvidersView.as_api_view(client=client),\n                        name=\"manage_providers\",\n                    ),\n                ]\n            ),\n        ),\n        path(\n            \"auth/\",\n            include(\n                [\n                    path(\n                        \"provider/\",\n                        include(\n                            [\n                                path(\n                                    \"signup\",\n                                    views.ProviderSignupView.as_api_view(client=client),\n                                    name=\"provider_signup\",\n                                ),\n                                path(\n                                    \"redirect\",\n                                    views.RedirectToProviderView.as_api_view(\n                                        client=client\n                                    ),\n                                    name=\"redirect_to_provider\",\n                                ),\n                                path(\n                                    \"token\",\n                                    views.ProviderTokenView.as_api_view(client=client),\n                                    name=\"provider_token\",\n                                ),\n                            ]\n                        ),\n                    )\n                ]\n            ),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/headless/socialaccount/views.py",
    "content": "from django.core.exceptions import ValidationError\nfrom django.http import HttpResponse\n\nfrom allauth.core.exceptions import SignupClosedException\nfrom allauth.headless.base.response import (\n    AuthenticationResponse,\n    ConflictResponse,\n    ForbiddenResponse,\n)\nfrom allauth.headless.base.views import APIView, AuthenticatedAPIView\nfrom allauth.headless.internal.restkit.response import ErrorResponse\nfrom allauth.headless.socialaccount.forms import RedirectToProviderForm\nfrom allauth.headless.socialaccount.inputs import (\n    DeleteProviderAccountInput,\n    ProviderTokenInput,\n    SignupInput,\n)\nfrom allauth.headless.socialaccount.internal import complete_token_login\nfrom allauth.headless.socialaccount.response import (\n    SocialAccountsResponse,\n    SocialLoginResponse,\n)\nfrom allauth.socialaccount.adapter import get_adapter as get_socialaccount_adapter\nfrom allauth.socialaccount.helpers import render_authentication_error\nfrom allauth.socialaccount.internal import flows\nfrom allauth.socialaccount.models import SocialAccount\n\n\nclass ProviderSignupView(APIView):\n    input_class = SignupInput\n\n    def handle(self, request, *args, **kwargs):\n        self.sociallogin = flows.signup.get_pending_signup(self.request)\n        if not self.sociallogin:\n            return ConflictResponse(request)\n        if not get_socialaccount_adapter().is_open_for_signup(\n            request, self.sociallogin\n        ):\n            return ForbiddenResponse(request)\n        return super().handle(request, *args, **kwargs)\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        return SocialLoginResponse(request, self.sociallogin)\n\n    def post(self, request, *args, **kwargs):\n        response = flows.signup.signup_by_form(\n            self.request, self.sociallogin, self.input\n        )\n        return AuthenticationResponse.from_response(request, response)\n\n    def get_input_kwargs(self) -> dict:\n        return {\"sociallogin\": self.sociallogin}\n\n\nclass RedirectToProviderView(APIView):\n    handle_json_input = False\n\n    def post(self, request, *args, **kwargs):\n        form = RedirectToProviderForm(request.POST)\n        if not form.is_valid():\n            return render_authentication_error(\n                request,\n                provider=request.POST.get(\"provider\"),\n                exception=ValidationError(form.errors),\n            )\n        provider = form.cleaned_data[\"provider\"]\n        next_url = form.cleaned_data[\"callback_url\"]\n        process = form.cleaned_data[\"process\"]\n        return provider.redirect(\n            request,\n            process,\n            next_url=next_url,\n            headless=True,\n        )\n\n\nclass ManageProvidersView(AuthenticatedAPIView):\n    input_class = {\n        \"DELETE\": DeleteProviderAccountInput,\n    }\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        return self.respond_provider_accounts(request)\n\n    @classmethod\n    def respond_provider_accounts(self, request):\n        accounts = SocialAccount.objects.filter(user=request.user)\n        return SocialAccountsResponse(request, accounts)\n\n    def delete(self, request, *args, **kwargs):\n        flows.connect.disconnect(request, self.input.cleaned_data[\"account\"])\n        return self.respond_provider_accounts(request)\n\n    def get_input_kwargs(self) -> dict:\n        return {\"user\": self.request.user}\n\n\nclass ProviderTokenView(APIView):\n    input_class = ProviderTokenInput\n\n    def post(self, request, *args, **kwargs):\n        sociallogin = self.input.cleaned_data[\"sociallogin\"]\n        response = None\n        try:\n            response = complete_token_login(request, sociallogin)\n        except ValidationError as e:\n            return ErrorResponse(self.request, exception=e)\n        except SignupClosedException:\n            return ForbiddenResponse(self.request)\n        return AuthenticationResponse.from_response(self.request, response)\n"
  },
  {
    "path": "allauth/headless/spec/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/headless/spec/doc/description.md",
    "content": "# Introduction\n\nWelcome to the django-allauth API specification. This API is intended to be\nconsumed by two different kind of clients:\n\n- Web applications running in a **browser** context. For example, a\n  single-page React application, to which the end user can navigate using a web\n  browser.\n\n- Applications, **apps** for short, executing in non-browser contexts. For example,\n  a mobile Android or iOS application.\n\nThe security considerations for these two usage types are different. In a\nbrowser context, cookies play a role.  Without taking special precautions, your\nweb application may be vulnerable to Cross-Site Request Forgery attacks.  For\nmobile applications, this does not apply.\n\nThe API can be used for both use cases. Differences in handling of security is\nautomatically adjusted for, based on the request path used to make the API call.\nFor example, signing up can either be done using the\n`/_allauth/browser/v1/auth/signup` or the `/_allauth/app/v1/auth/signup`\nendpoint. For the **browser** usage, session cookies and CSRF protection\napplies. For the **app** usage, cookies play no role, instead, a session token\nis used.  The paths of all endpoints are documented in the form of\n`/_allauth/{client}/v1/auth/signup`. Depending on the client type (`{client}`),\nthere may be slight differences in request/response handling.  This is\ndocumented where applicable.\n\n\n# Scope\n\nThe following functionality is all in scope and handled as part of this API:\n\n- Regular accounts:\n  - Login\n  - Signup\n  - Password forgotten\n  - Manage email (add, remove, verify, select a different primary)\n  - Change password.\n  - Verification of email addresses.\n- Two-Factor Authentication:\n  - Authentication using an authenticator code\n  - (De)activate TOTP\n  - (Re)generate recovery codes\n  - \"Trust this browser\"\n- Third-party providers:\n  - Authenticate by performing a browser-level redirect (synchronous request).\n  - Authenticate by means of a provider token.\n  - Connect additional provider accounts.\n  - Disconnect existing provider accounts.\n  - Setting a password in case no password was set, yet.\n  - Querying additional information before signing up.\n- Session management:\n  - Listing all sessions for a user.\n  - Signing out of any of those sessions.\n\n\n# Browser Usage\n\nFor web applications running in a browser, routing needs to be setup correctly\nsuch that the sessions initiated at the backend are accessible in the frontend.\n\n## Routing\n\nWhen using the API in a browser context, regular Django sessions are used, along\nwith the usual session cookies. There are several options for setting up the\nrouting of your application.\n\n\n###  Single Domain Routing\n\nWith single domain, path-based routing, both your frontend and backend are\nserved from the same domain, for example `https://app.org`. You will have to\nmake sure that some paths are served by the frontend, and others by the backend.\n\n\n### Sub-domain Routing\n\nWith sub-domain based routing, the frontend and backend are served from\ndifferent domains.  However, as session cookies are used, these different\ndomains must share common main domain.\n\nFor example, you may use `app.project.org` for the frontend, which\ninterfaces with the backend over at `backend.project.org`.  In this\nsetup, Django will need to be configured with:\n\n```\nSESSION_COOKIE_DOMAIN = \"project.org\"\nCSRF_COOKIE_DOMAIN = \"project.org\"\n```\n\nIf your organization hosts unrelated applications, for example, a CMS for\nmarketing purposes, on the top level domain (`project.org`), it is not advisable\nto set the session cookie domain to `project.org`, as those other applications\ncould get access to the session cookie. In that case, it is advised to use\n`backend.app.project.org` for the backend, and set the session cookie domain to\n`app.project.org`.\n\n\n# App Usage\n\nFor app based usage, cookies play no role, yet, sessions are still used. When a\nuser walks through the authentication flow, a session is created.  Having an\nauthenticated session is proof that the user is allowed to further interact with\nthe backend. Unauthenticated sessions are also needed to remember state while\nthe user proceeds to go over the required steps necessary to authenticate.\n\n\n## Session Tokens\n\nGiven that there is no cookie to point to the session, the header\n`X-Session-Token` is used instead. The way of working is as follows:\n\n- If you do not have a session token yet, do not send the `X-Session-Token` header.\n\n- When making requests, session tokens can appear in the metadata\n  (`meta.session_token`) of authentication related responses. If a session\n  token appears, store it (overwriting any previous session token), and ensure\n  to add the token to the `X-Session-Token` header of all subsequent requests.\n\n- When receiving an authentication related response with status code 410\n  (`Gone`), that is meant to indicate that the session is no longer valid.\n  Remove the session token and start clean.\n\n\n## Access Tokens\n\nWhile session tokens are required to handle the authentication process,\ndepending on your requirements, a different type of token may be needed once\nauthenticated.\n\nFor example, your app likely needs access to other APIs as well. These APIs may\n even be implemented using different technologies, in which case having a\n stateless token, possibly a JWT encoding the user ID, might be a good fit.\n\nIn this API and its implementation no assumptions, and no (limiting) design\ndecisions are made in this regard. The token strategy of django-allauth is\npluggable, such that you can expose your own access token when the user\nauthenticates. As for as the API specification is concerned, the access token\nwill appear in the response of metadata (`meta.access_token`) of a successful\nauthentication request. How you can customize the token strategy can be found\nover at the documentation of the `allauth.headless` Django application.\n\n\n# Responses\n\nUnless documented otherwise, responses are objects with the following\nproperties:\n- The `status`, matching the HTTP status code.\n- Data, if any, is returned as part of the `data` key.\n- Metadata, if any, is returned as part of the `meta` key.\n- Errors, if any, are listed in the `errors` key.\n\n\n# Authentication Flows\n\nIn order to become authenticated, the user must complete a flow, potentially\nconsisting of several steps. For example:\n- A login, after which the user is authenticated.\n- A Login, followed by two-factor authentication, after which the user is\n  authenticated.\n- A signup, followed by mandatory email verification, after which the user is\n  authenticated.\n\nThe API signals to the client that (re)authentication is required by means of a\n`401` or `410` status code:\n- Not authenticated: status `401`.\n- Re-authentication required: status `401`, with `meta.is_authenticated = true`.\n- Invalid session: status `410`. This only occurs for clients of type `app`.\n\nAll authentication related responses have status `401` or `410`, and,\n`meta.is_authenticated` indicating whether authentication, or re-authentication\nis required.\n\nThe flows the client can perform to initiate or complete the authentication are\ncommunicates as part of authentication related responses. The authentication can\nbe initiated by means of these flows:\n- Login using a local account (`login`).\n- Signup for a local account (`signup`).\n- Login or signup using the third-party provider redirect flow (`provider_redirect`).\n- Login or signup by handing over a third-party provider retrieved elsewhere (`provider_token`).\n- Login using a special code (`login_by_code`).\n- Login using a passkey (`mfa_login_webauthn`).\n- Signup using a passkey (`mfa_signup_webauthn`).\n\nDepending on the state of the account, and the configuration of django-allauth, the flows above\ncan either lead to becoming directly authenticated, or, to followup flows:\n- Provider signup (`provider_signup`).\n- Email verification (`verify_email`).\n- Phone verification (`phone_email`).\n- Two-factor authentication required (TOTP, recovery codes, or WebAuthn) (`mfa_authenticate`).\n- Trust this browser (`mfa_trust`).\n\nWhile authenticated, re-authentication may be required to safeguard the account when sensitive actions\nare performed. The re-authentication flows are the following:\n- Re-authenticate using password (`reauthenticate`).\n- Re-authenticate using a 2FA authenticator (TOTP, recovery codes, or WebAuthn) (`mfa_reauthenticate`).\n\n\n# Security Considerations\n\n## Input Sanitization\n\nThe Django framework, by design, does *not* perform input sanitization. For\nexample, there is nothing preventing end users from signing up using `<script>`\nor `Robert'); DROP TABLE students` as a first name. Django relies on its\ntemplate language for proper escaping of such values and mitigate any XSS\nattacks.\n\nAs a result, any `allauth.headless` client **must** have proper XSS protection\nin place as well. Be prepared that, for example, the WebAuthn endpoints could\nreturn authenticator names as follows:\n\n    {\n      \"name\": \"<script>alert(1)</script>\",\n      \"credential\": {\n        \"type\": \"public-key\",\n        ...\n      }\n    }"
  },
  {
    "path": "allauth/headless/spec/doc/openapi.yaml",
    "content": "openapi: 3.0.3\ninfo:\n  version: \"1\"\n  title: \"django-allauth: Headless API\"\n  description:\n    $ref: \"./description.md\"\n  contact:\n    email: info@allauth.org\n  license:\n    name: MIT\n    url: https://opensource.org/license/mit\nexternalDocs:\n  description: The django-allauth project.\n  url: http://allauth.org\ntags:\n  - name: Configuration\n    description: |\n      Exposes information on the configuration of django-allauth.\n  - name: \"Authentication: Account\"\n    description: |\n      All functionality related towards authenticating regular\n      username/email-password based accounts.\n  - name: \"Account: Email\"\n    description: |\n      The API used for manipulating the email addresses attached to a given\n      account. This is intentionally modeled as one endpoint, representing the\n      collection of all the email addresses. Note that manipulating one email\n      address may affect another.  For example, marking one email address as\n      primary implies the previous primary email address is changed as\n      well. Also, if django-allauth is configured with `ACCOUNT_CHANGE_EMAIL =\n      True`, verifying the email address the user is changing to will cause the\n      previous email addres to be removed.\n  - name: \"Account: Phone\"\n    description: |\n      The API used for manipulating the phone number attached to a given\n      account.\n  - name: \"Account: Password\"\n    description: |\n      Endpoints that can be used to alter the password for a given account.\n  - name: \"Account: Providers\"\n    description: |\n      Management of third-party provider accounts that are connected to the\n      authenticated account.\n  - name: \"Authentication: 2FA\"\n    description: |\n      Endpoints related towards completing the Two-Factor Authentication stage\n      during the authentication cycle.\nx-tagGroups:\n  - name: Overall\n    tags:\n      - \"Configuration\"\n  - name: Authentication\n    tags:\n      - \"Authentication: Current Session\"\n      - \"Authentication: Account\"\n      - \"Authentication: Password Reset\"\n      - \"Authentication: Providers\"\n      - \"Authentication: 2FA\"\n      - \"Authentication: Login By Code\"\n      - \"Authentication: WebAuthn: Login\"\n      - \"Authentication: WebAuthn: Signup\"\n  - name: Account\n    tags:\n      - \"Account: Email\"\n      - \"Account: Password\"\n      - \"Account: Phone\"\n      - \"Account: Providers\"\n      - \"Account: 2FA\"\n      - \"Account: WebAuthn\"\n  - name: Sessions\n    tags:\n      - \"Sessions\"\n  - name: Tokens\n    tags:\n      - \"Tokens\"\npaths:\n  ######################################################################\n  # Base\n  ######################################################################\n  /_allauth/{client}/v1/config:\n    get:\n      summary: Get configuration\n      tags:\n        - Configuration\n      description: |\n        There are many configuration options that alter the functionality\n        and behavior of django-allauth, some of which can also impact the\n        frontend. Therefore, relevant configuration options are exposed via\n        this endpoint. The data returned is not user/authentication\n        dependent. Hence, it suffices to only fetch this data once at boot\n        time of your application.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/Configuration\"\n  ######################################################################\n  # Authentication: Account\n  ######################################################################\n  /_allauth/{client}/v1/auth/login:\n    post:\n      tags:\n        - \"Authentication: Account\"\n      summary: Login\n      description: |\n        Login using a username-password or email-password combination.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n      requestBody:\n        $ref: \"#/components/requestBodies/Login\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/AuthenticatedByPassword\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_email:\n                  $ref: \"#/components/examples/InvalidEmail\"\n                password_mismatch:\n                  $ref: \"#/components/examples/PasswordMismatch\"\n        \"401\":\n          description: |\n            Not authenticated.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/AuthenticationResponse\"\n              examples:\n                pending_email:\n                  $ref: \"#/components/examples/UnauthenticatedPendingEmailVerification\"\n                pending_2fa:\n                  $ref: \"#/components/examples/UnauthenticatedPending2FA\"\n        \"409\":\n          description: |\n            Conflict. For example, when logging in when a user is already logged in.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n  /_allauth/{client}/v1/auth/signup:\n    post:\n      tags:\n        - \"Authentication: Account\"\n      summary: Signup\n      description: |\n        Whether or not `username`, `email`, `phone` or combination of those are\n        required depends on the configuration of django-allauth. Additionally,\n        if a custom signup form is used there may be other custom properties\n        required.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n      requestBody:\n        $ref: \"#/components/requestBodies/Signup\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/AuthenticatedByPassword\"\n        \"400\":\n          description: |\n            An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_email:\n                  $ref: \"#/components/examples/InvalidEmail\"\n        \"401\":\n          description: |\n            Not authenticated.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/AuthenticationResponse\"\n              examples:\n                pending_email:\n                  $ref: \"#/components/examples/UnauthenticatedPendingEmailVerification\"\n        \"403\":\n          description: |\n            Forbidden. For example, when signup is closed.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ForbiddenResponse\"\n        \"409\":\n          description: |\n            Conflict. For example, when signing up while user is logged in.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n  /_allauth/{client}/v1/auth/email/verify:\n    get:\n      tags:\n        - \"Authentication: Account\"\n      summary: Get email verification information\n      description: |\n        Obtain email verification information, given the token that was sent to\n        the user by email.\n      parameters:\n        - $ref: \"#/components/parameters/EmailVerificationKey\"\n        - $ref: \"#/components/parameters/Client\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/EmailVerificationInfo\"\n        \"400\":\n          description: |\n            An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_email:\n                  $ref: \"#/components/examples/InvalidEmailVerificationKey\"\n        \"409\":\n          description: |\n            Conflict. The email verification (by code) flow is not pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n    post:\n      tags:\n        - \"Authentication: Account\"\n      summary: Verify an email\n      description: |\n        Complete the email verification process. Depending on the configuration,\n        email addresses are either verified by opening a link that is sent to\n        their email address, or, by inputting a code that is sent. On the API,\n        both cases are handled identically. Meaning, the required key is either\n        the one from the link, or, the code itself.\n\n        Note that a status code of 401 does not imply failure. It indicates that\n        the email verification was successful, yet, the user is still not signed\n        in. For example, in case `ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION` is set to\n        `False`, a 401 is returned when verifying as part of login/signup.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/VerifyEmail\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/Authenticated\"\n        \"400\":\n          description: |\n            An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_email:\n                  $ref: \"#/components/examples/InvalidEmailVerificationKey\"\n        \"401\":\n          $ref: \"#/components/responses/Unauthenticated\"\n        \"409\":\n          description: |\n            Conflict. The email verification (by code) flow is not pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n  /_allauth/{client}/v1/auth/email/verify/resend:\n    post:\n      tags:\n        - \"Authentication: Account\"\n      summary: Resend email verification code\n      description: |\n        Requests a new email verification code.\n        Requires `ACCOUNT_EMAIL_VERIFICATION_SUPPORTS_RESEND = True`.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/StatusOK\"\n        \"409\":\n          description: |\n            Conflict. The email verification (by code) flow is not pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n        \"429\":\n          $ref: \"#/components/responses/TooManyRequests\"\n  /_allauth/{client}/v1/auth/phone/verify:\n    post:\n      tags:\n        - \"Authentication: Account\"\n      summary: Verify a phone number\n      description: |\n        Complete the phone number verification process. Note that a status code\n        of 401 does not imply failure. It merely indicates that the phone number\n        verification was successful, yet, the user is still not signed in.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/VerifyPhone\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/Authenticated\"\n        \"400\":\n          description: |\n            An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n        \"401\":\n          $ref: \"#/components/responses/Unauthenticated\"\n        \"409\":\n          description: |\n            Conflict. The phone verification flow is not pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n  /_allauth/{client}/v1/auth/phone/verify/resend:\n    post:\n      tags:\n        - \"Authentication: Account\"\n      summary: Resend phone number verification code\n      description: |\n        Requests a new phone number verification code.\n        Requires `ACCOUNT_PHONE_VERIFICATION_SUPPORTS_RESEND = True`.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/StatusOK\"\n        \"409\":\n          description: |\n            Conflict. The phone verification flow is not pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n        \"429\":\n          $ref: \"#/components/responses/TooManyRequests\"\n  /_allauth/{client}/v1/auth/reauthenticate:\n    post:\n      tags:\n        - \"Authentication: Account\"\n      summary: Reauthenticate\n      description: |\n        In order to safeguard the account, some actions require the user to be\n        recently authenticated.  If you try to perform such an action without\n        having been recently authenticated, a `401` status is returned, listing\n        flows that can be performed to reauthenticate. One such flow is the flow\n        with ID `reauthenticate`, which allows for the user to input the\n        password. This is the endpoint related towards that flow.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/Reauthenticate\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/AuthenticatedByPassword\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_email:\n                  $ref: \"#/components/examples/IncorrectPassword\"\n  ######################################################################\n  # Authentication: Password\n  ######################################################################\n  /_allauth/{client}/v1/auth/password/request:\n    post:\n      summary: Request password\n      description: |\n        Initiates the password reset procedure. Depending on whether or not\n        `ACCOUNT_PASSWORD_RESET_BY_CODE_ENABLED` is `True`, the procedure is\n        either stateless or stateful.\n\n        In case codes are used, it is stateful, and a new\n        `password_reset_by_code` flow is started. In this case, on a successful\n        password reset request, you will receive a 401 indicating the pending\n        status of this flow.\n\n        In case password reset is configured to use (stateless) links, you will\n        receive a 200 on a successful password reset request.\n      tags:\n        - \"Authentication: Password Reset\"\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n      requestBody:\n        $ref: \"#/components/requestBodies/RequestPassword\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/StatusOK\"\n        \"400\":\n          description: |\n            An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_email:\n                  $ref: \"#/components/examples/InvalidEmail\"\n        \"401\":\n          $ref: \"#/components/responses/Authentication\"\n  /_allauth/{client}/v1/auth/password/reset:\n    get:\n      summary: Get password reset information\n      description: |\n        Used to obtain information on and validate a password reset key.  The\n        key passed is either the key encoded in the password reset URL that the\n        user has received per email, or, the password reset code in case of\n        `ACCOUNT_PASSWORD_RESET_BY_CODE_ENABLED`. Note that in case of a code,\n        the number of requests you can make is limited (by\n        `ACCOUNT_PASSWORD_RESET_BY_CODE_MAX_ATTEMPTS`).\n      tags:\n        - \"Authentication: Password Reset\"\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/PasswordResetKey\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/PasswordResetInfo\"\n        \"400\":\n          description: |\n            An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                password_reset_key_invalid:\n                  $ref: \"#/components/examples/InvalidPasswordResetKey\"\n        \"409\":\n          description: |\n            Conflict. There is no password reset (by code) flow pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n    post:\n      summary: Reset password\n      description: |\n        Perform the password reset, by handing over the password reset key and\n        the new password. After successfully completing the password reset, the\n        user is either logged in (in case `ACCOUNT_LOGIN_ON_PASSWORD_RESET` is\n        `True`), or, the user will need to proceed to the login page.  In case\n        of the former, a `200` status code is returned, in case of the latter a\n        401.\n      tags:\n        - \"Authentication: Password Reset\"\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n      requestBody:\n        $ref: \"#/components/requestBodies/ResetPassword\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/AuthenticatedByPassword\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_email:\n                  $ref: \"#/components/examples/InvalidEmail\"\n        \"401\":\n          $ref: \"#/components/responses/Authentication\"\n        \"409\":\n          description: |\n            Conflict. There is no password reset (by code) flow pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n  ######################################################################\n  # Authentication: Providers\n  ######################################################################\n  /_allauth/browser/v1/auth/provider/redirect:\n    post:\n      tags:\n        - \"Authentication: Providers\"\n      summary: Provider redirect\n      description: |\n        Initiates the third-party provider authentication redirect flow. As calling\n        this endpoint results in a user facing redirect (302), this call is only\n        available in a browser, and must be called in a synchronous (non-XHR)\n        manner.\n      requestBody:\n        $ref: \"#/components/requestBodies/ProviderRedirect\"\n      responses:\n        \"302\":\n          description: The provider authorization URL to which the client should be redirected.\n          headers:\n            location:\n              schema:\n                type: string\n              description: The redirect URL.\n  /_allauth/{client}/v1/auth/provider/token:\n    post:\n      tags:\n        - \"Authentication: Providers\"\n      summary: Provider token\n      description: |\n        Authenticates with a third-party provider using provider tokens received\n        by other means. For example, in case of a mobile app, the authentication\n        flow runs completely on the device itself, without any interaction with\n        the API. Then, when the (device) authentication completes and the mobile\n        app receives an access and/or ID token, it can hand over these tokens\n        via this endpoint to authenticate on the server.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/ProviderToken\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/Authenticated\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_token:\n                  $ref: \"#/components/examples/InvalidProviderToken\"\n        \"401\":\n          description: Not authenticated, more steps are required to be completed.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/AuthenticationResponse\"\n              examples:\n                unauthenticated_pending_2fa:\n                  $ref: \"#/components/examples/UnauthenticatedPending2FA\"\n                unauthenticated_pending_email_verification:\n                  $ref: \"#/components/examples/UnauthenticatedPendingEmailVerification\"\n        \"403\":\n          description: |\n            Forbidden. For example, when signup is closed.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ForbiddenResponse\"\n  /_allauth/{client}/v1/auth/provider/signup:\n    get:\n      tags:\n        - \"Authentication: Providers\"\n      summary: Provider signup information\n      description: |\n        If, while signing up using a third-party provider account, there is\n        insufficient information received from the provider to automatically\n        complete the signup process, an additional step is needed to complete\n        the missing data before the user is fully signed up and authenticated.\n        The information available so far, such as the pending provider account,\n        can be retrieved via this endpoint.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/ProviderSignup\"\n        \"409\":\n          description: |\n            Conflict. The provider signup flow is not pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n    post:\n      tags:\n        - \"Authentication: Providers\"\n      summary: Provider signup\n      description: |\n        If, while signing up using a third-party provider account, there is\n        insufficient information received from the provider to automatically\n        complete the signup process, an additional step is needed to complete\n        the missing data before the user is fully signed up and authenticated.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n      requestBody:\n        $ref: \"#/components/requestBodies/ProviderSignup\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/Authenticated\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_email:\n                  $ref: \"#/components/examples/InvalidEmail\"\n        \"401\":\n          description: Not authenticated, more steps are required to be completed.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/AuthenticationResponse\"\n              examples:\n                unauthenticated_pending_email_verification:\n                  $ref: \"#/components/examples/UnauthenticatedPendingEmailVerification\"\n        \"403\":\n          description: |\n            Forbidden. For example, when signup is closed.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ForbiddenResponse\"\n        \"409\":\n          description: |\n            Conflict. The provider signup flow is not pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n  ######################################################################\n  # Authentication: 2FA\n  ######################################################################\n  /_allauth/{client}/v1/auth/2fa/authenticate:\n    post:\n      tags:\n        - \"Authentication: 2FA\"\n      summary: Two-factor authentication\n      description: |\n        If, during authentication,  a response with status 401 is encountered where one of the pending\n        flows has ID `mfa_authenticate`, that indicates that the Two-Factor Authentication stage needs to\n        be completed.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/MFAAuthenticate\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/AuthenticatedByPasswordAnd2FA\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_code:\n                  $ref: \"#/components/examples/InvalidAuthenticatorCode\"\n        \"401\":\n          $ref: \"#/components/responses/Authentication\"\n  /_allauth/{client}/v1/auth/2fa/reauthenticate:\n    post:\n      tags:\n        - \"Authentication: 2FA\"\n      summary: Reauthenticate using 2FA\n      description: |\n        In order to safeguard the account, some actions require the user to be\n        recently authenticated.  If you try to perform such an action without\n        having been recently authenticated, a `401` status is returned, listing\n        flows that can be performed to reauthenticate. One such flow is the flow\n        with ID `mfa_reauthenticate`, which allows for the user to input an\n        authenticator code (e.g. TOTP or recovery code). This is the endpoint\n        related towards that flow.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: '#/components/requestBodies/MFAAuthenticate'\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/AuthenticatedByPasswordAnd2FA\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_code:\n                  $ref: \"#/components/examples/InvalidAuthenticatorCode\"\n  /_allauth/browser/v1/auth/2fa/trust:\n    post:\n      tags:\n        - \"Authentication: 2FA\"\n      summary: Trust this browser\n      description: |\n        If \"Trust this browser?\" is enabled (`MFA_TRUST_ENABLED`), the\n        `mfa_trust` flow activates after the user completes the MFA\n        authentication flow, offering to skip MFA for this particular\n        browser. This endpoint is used to complete the `mfa_trust` flow.\n      parameters:\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/MFATrust\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/AuthenticatedByPasswordAnd2FA\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n  ######################################################################\n  # Authentication: WebAuthn\n  ######################################################################\n  /_allauth/{client}/v1/auth/webauthn/authenticate:\n    get:\n      tags:\n        - \"Authentication: WebAuthn: Login\"\n      summary: Get WebAuthn credential request options for 2FA\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      description: |\n        Returns the WebAuthn credential request options, that can be\n        processed using `parseRequestOptionsFromJSON()` on the frontend.\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/WebAuthnRequestOptionsResponse\"\n    post:\n      tags:\n        - \"Authentication: WebAuthn: Login\"\n      summary: Perform 2FA using WebAuthn\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      description: |\n        Perform Two-Factor Authentication using a WebAuthn credential.\n      requestBody:\n        $ref: \"#/components/requestBodies/AuthenticateWebAuthn\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/Authenticated\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n  /_allauth/{client}/v1/auth/webauthn/reauthenticate:\n    get:\n      tags:\n        - \"Authentication: WebAuthn: Login\"\n      summary: Get WebAuthn credential request options for reauthentication\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      description: |\n        Returns the WebAuthn credential request options, that can be\n        processed using `parseRequestOptionsFromJSON()` on the frontend.\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/WebAuthnRequestOptionsResponse\"\n    post:\n      tags:\n        - \"Authentication: WebAuthn: Login\"\n      summary: Reauthenticate using WebAuthn\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      description: |\n        Reauthenticate the user using a WebAuthn credential.\n      requestBody:\n        $ref: \"#/components/requestBodies/ReauthenticateWebAuthn\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/Authenticated\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n  /_allauth/{client}/v1/auth/webauthn/login:\n    get:\n      tags:\n        - \"Authentication: WebAuthn: Login\"\n      summary: Get WebAuthn credential request options for login\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      description: |\n        Returns the WebAuthn credential request options, that can be\n        processed using `parseRequestOptionsFromJSON()` on the frontend.\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/WebAuthnRequestOptionsResponse\"\n    post:\n      tags:\n        - \"Authentication: WebAuthn: Login\"\n      summary: Login using WebAuthn\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      description: |\n        Login using a WebAuthn credential (Passkey). Both 200 and 401 can be\n        expected after a successful request.  The 401 can, for example, occur\n        when the credential passed was valid, but the email attached to the\n        account still requires verification.\n      requestBody:\n        $ref: \"#/components/requestBodies/LoginWebAuthn\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/Authenticated\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n        \"401\":\n          description: |\n            Not authenticated.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/AuthenticationResponse\"\n              examples:\n                pending_email:\n                  $ref: \"#/components/examples/UnauthenticatedPendingEmailVerification\"\n  /_allauth/{client}/v1/auth/webauthn/signup:\n    post:\n      tags:\n        - \"Authentication: WebAuthn: Signup\"\n      summary: Initiate the passkey signup flow\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      description: |\n        You initiate the passkey signup flow by inputting (`POST`) the required properties (e.g. email)\n        similar to the regular account signup, except that the `password` is to be left out.\n        The user will then be required to verify the email address, after which WebAuthn credential\n        creation options can be retrieved (`GET`) and used to actually complete (`PUT`) the flow.\n      requestBody:\n        $ref: \"#/components/requestBodies/PasskeySignup\"\n      responses:\n        \"400\":\n          description: |\n            An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_email:\n                  $ref: \"#/components/examples/InvalidEmail\"\n        \"401\":\n          description: |\n            Not authenticated, email verification pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/AuthenticationResponse\"\n              examples:\n                pending_email:\n                  $ref: \"#/components/examples/UnauthenticatedPendingEmailVerification\"\n        \"403\":\n          description: |\n            Forbidden. For example, when signup is closed.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ForbiddenResponse\"\n        \"409\":\n          description: |\n            Conflict. For example, when signing up while user is logged in.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n    get:\n      tags:\n        - \"Authentication: WebAuthn: Signup\"\n      summary: Get passkey credential request options\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      description: |\n        Returns the WebAuthn credential request options, that can be\n        processed using `parseRequestOptionsFromJSON()` on the frontend.\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/WebAuthnRequestOptionsResponse\"\n        \"409\":\n          description: |\n            Conflict. For example, when the passkey signup flow is not pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n    put:\n      tags:\n        - \"Authentication: WebAuthn: Signup\"\n      summary: Complete the passkey signup flow\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      description: |\n        Complete the passkey signup flow by handing over the WebAuthn credential.\n      requestBody:\n        $ref: \"#/components/requestBodies/AddWebAuthnAuthenticator\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/Authenticated\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n        \"401\":\n          description: |\n            Not authenticated.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/AuthenticationResponse\"\n              examples:\n                pending_email:\n                  $ref: \"#/components/examples/UnauthenticatedPendingEmailVerification\"\n        \"409\":\n          description: |\n            Conflict. For example, when the passkey signup flow is not pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n  ######################################################################\n  # Authentication: Login by Code\n  ######################################################################\n  /_allauth/{client}/v1/auth/code/request:\n    post:\n      tags:\n        - \"Authentication: Login By Code\"\n      summary: Request login code\n      description: |\n        Request a \"special\" login code that is sent to the user by email.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n      requestBody:\n        $ref: \"#/components/requestBodies/RequestLoginCode\"\n      responses:\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_email:\n                  $ref: \"#/components/examples/InvalidEmail\"\n        \"401\":\n          description: |\n            Not authenticated.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/AuthenticationResponse\"\n              examples:\n                pending_login_by_code:\n                  $ref: \"#/components/examples/UnauthenticatedPendingLoginByCode\"\n\n  /_allauth/{client}/v1/auth/code/confirm:\n    post:\n      tags:\n        - \"Authentication: Login By Code\"\n      summary: Confirm login code\n      description: |\n        Use this endpoint to pass along the received \"special\" login code.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n      requestBody:\n        $ref: \"#/components/requestBodies/ConfirmLoginCode\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/AuthenticatedByCode\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_code:\n                  $ref: \"#/components/examples/InvalidAuthenticatorCode\"\n        \"401\":\n          description: |\n            Not authenticated.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/AuthenticationResponse\"\n              examples:\n                unauthenticated_pending_2fa:\n                  $ref: \"#/components/examples/UnauthenticatedPending2FA\"\n        \"409\":\n          description: |\n            Conflict. The \"login by code\" flow is not pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n\n  /_allauth/{client}/v1/auth/code/resend:\n    post:\n      tags:\n        - \"Authentication: Login By Code\"\n      summary: Resend login code\n      description: |\n        Requests a new login code.\n        Requires `ACCOUNT_LOGIN_BY_CODE_SUPPORTS_RESEND = True`.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/StatusOK\"\n        \"409\":\n          description: |\n            Conflict. The login verification (by code) flow is not pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n        \"429\":\n          $ref: \"#/components/responses/TooManyRequests\"\n\n  ######################################################################\n  # Account: Providers\n  ######################################################################\n  /_allauth/{client}/v1/account/providers:\n    get:\n      tags:\n        - \"Account: Providers\"\n      summary: List the connected third-party provider accounts\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/ProviderAccounts\"\n    delete:\n      tags:\n        - \"Account: Providers\"\n      summary: |\n        Disconnect a third-party provider account\n      description: |\n        Disconnect a third-party provider account, returning the remaining\n        accounts that are still connected. The disconnect is not allowed if it\n        would leave the account unusable. For example, if no password was\n        set up yet.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/ProviderAccount\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/ProviderAccounts\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                no_password:\n                  $ref: \"#/components/examples/DisconnectNotAllowedNoPassword\"\n                no_email:\n                  $ref: \"#/components/examples/DisconnectNotAllowedNoVerifiedEmail\"\n  ######################################################################\n  # Account: Email\n  ######################################################################\n  /_allauth/{client}/v1/account/email:\n    get:\n      tags:\n        - \"Account: Email\"\n      summary: List email addresses\n      description: |\n        Retrieves the list of email addresses of the account.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/EmailAddresses\"\n        \"401\":\n          $ref: \"#/components/responses/Authentication\"\n    post:\n      tags:\n        - \"Account: Email\"\n      summary: |\n        Add/Change email address\n      description: |\n        The following functionality is available:\n\n          - Adding a new email address for an already signed in user (`ACCOUNT_CHANGE_EMAIL = False`).\n          - Change to a new email address for an already signed in user   (`ACCOUNT_CHANGE_EMAIL = True`).\n          - Change to a new email address during the email verification process at signup (`ACCOUNT_EMAIL_VERIFICATION_SUPPORTS_CHANGE = True`).\n\n        In all cases, an email verification mail will be sent containing a link or code that needs to be verified.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/Email\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/EmailAddresses\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_code:\n                  $ref: \"#/components/examples/InvalidEmail\"\n        \"401\":\n          $ref: \"#/components/responses/AuthenticationOrReauthentication\"\n        \"409\":\n          description: |\n            Conflict. For example, when no user is authenticated and no email verification flow is pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n    put:\n      tags:\n        - \"Account: Email\"\n      summary: Request email verification\n      description: |\n        Requests for (another) email verification email to be sent. Note that\n        sending emails is rate limited, so when you send too many requests the\n        email will not be sent.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/Email\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/StatusOK\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_code:\n                  $ref: \"#/components/examples/InvalidEmail\"\n        \"403\":\n          description: |\n            Too many email verification mails were already sent.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ForbiddenResponse\"\n    patch:\n      tags:\n        - \"Account: Email\"\n      summary: Change primary email address\n      description: |\n        Used to change primary email address to a different one. Note that only verified email addresses\n        can be marked as primary.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/MarkPrimaryEmail\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/EmailAddresses\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_code:\n                  $ref: \"#/components/examples/InvalidEmail\"\n    delete:\n      tags:\n        - \"Account: Email\"\n      summary: Remove an email address\n      description: |\n        Used to remove an email address.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/Email\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/EmailAddresses\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_code:\n                  $ref: \"#/components/examples/InvalidEmail\"\n  ######################################################################\n  # Account: Phone\n  ######################################################################\n  /_allauth/{client}/v1/account/phone:\n    get:\n      tags:\n        - \"Account: Phone\"\n      summary: Get the phone number\n      description: |\n        Retrieves the phone number of the account, if any. Note that while the\n        endpoint returns a list of phone numbers, at most one entry is returned.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/PhoneNumbers\"\n        \"401\":\n          $ref: \"#/components/responses/Authentication\"\n    post:\n      tags:\n        - \"Account: Phone\"\n      summary: |\n        Change the phone number\n      description: |\n        The following functionality is available:\n\n        - Initiate the phone number change process for signed in users.\n        - Change to a new phone number during the phone number verification\n          process at signup for unauthenticated users. Note that this requires:\n          `ACCOUNT_PHONE_VERIFICATION_SUPPORTS_CHANGE = True`.\n\n        In both cases, after posting a new phone number, proceed with the phone\n        verification endpoint to confirm the change of the phone number by\n        posting the verification code.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/Phone\"\n      responses:\n        \"202\":\n          description: Phone number change process initiated.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/PhoneNumberChangeResponse\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n        \"401\":\n          $ref: \"#/components/responses/AuthenticationOrReauthentication\"\n        \"409\":\n          description: |\n            Conflict. For example, when no user is authenticated and no phone verification flow is pending.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ConflictResponse\"\n  ######################################################################\n  # Account: 2FA\n  ######################################################################\n  /_allauth/{client}/v1/account/authenticators:\n    get:\n      tags:\n        - \"Account: 2FA\"\n      summary: List authenticators\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/Authenticators\"\n        \"401\":\n          $ref: \"#/components/responses/Authentication\"\n        \"410\":\n          $ref: \"#/components/responses/SessionGone\"\n  /_allauth/{client}/v1/account/authenticators/totp:\n    get:\n      tags:\n        - \"Account: 2FA\"\n      summary: TOTP authenticator status\n      description: |\n        Retrieve the information about the current TOTP authenticator, if any.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      responses:\n        \"404\":\n          $ref: \"#/components/responses/TOTPAuthenticatorNotFound\"\n        \"200\":\n          $ref: \"#/components/responses/TOTPAuthenticator\"\n        \"409\":\n          $ref: \"#/components/responses/AddAuthenticatorConflict\"\n    post:\n      tags:\n        - \"Account: 2FA\"\n      summary: Activate TOTP\n      description: |\n        The code should be provided from the consuming TOTP authenticator\n        application which was generated using the TOTP authenticator secret\n        retrieved from the TOTP authenticator status endpoint.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/SetupTOTP\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/TOTPAuthenticator\"\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_code:\n                  $ref: \"#/components/examples/InvalidAuthenticatorCode\"\n        \"401\":\n          $ref: \"#/components/responses/ReauthenticationRequired\"\n        \"409\":\n          $ref: \"#/components/responses/AddAuthenticatorConflict\"\n    delete:\n      tags:\n        - \"Account: 2FA\"\n      summary: Deactivate TOTP\n      description: |\n        Deactivates TOTP authentication. If the user authentication is not\n        sufficiently recent, a reauthentication flow (`401`) will is presented.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/StatusOK\"\n        \"401\":\n          $ref: \"#/components/responses/ReauthenticationRequired\"\n  /_allauth/{client}/v1/account/authenticators/recovery-codes:\n    get:\n      tags:\n        - \"Account: 2FA\"\n      summary: List recovery codes\n      description: |\n        List recovery codes.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/RecoveryCodes\"\n        \"401\":\n          $ref: \"#/components/responses/ReauthenticationRequired\"\n        \"404\":\n          $ref: \"#/components/responses/NotFound\"\n    post:\n      tags:\n        - \"Account: 2FA\"\n      summary: Regenerate recovery codes\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      responses:\n        \"400\":\n          description: An input error occurred.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n              examples:\n                invalid_code:\n                  $ref: \"#/components/examples/CannotGenerateRecoveryCodes\"\n        \"401\":\n          $ref: \"#/components/responses/ReauthenticationRequired\"\n  ######################################################################\n  # Account: WebAuthn\n  ######################################################################\n  /_allauth/{client}/v1/account/authenticators/webauthn:\n    get:\n      tags:\n        - \"Account: WebAuthn\"\n      summary: |\n        Get WebAuthn credential creation options\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n        - $ref: \"#/components/parameters/PasswordLess\"\n      description: |\n        Returns the WebAuthn credential creation options, that can be\n        processed using `parseCreationOptionsFromJSON()` on the frontend.\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/WebAuthnCreationOptionsResponse\"\n        \"401\":\n          $ref: \"#/components/responses/ReauthenticationRequired\"\n        \"409\":\n          $ref: \"#/components/responses/AddAuthenticatorConflict\"\n    put:\n      tags:\n        - \"Account: WebAuthn\"\n      summary: |\n        Rename a WebAuthn credential\n      description: |\n        You can alter the name of a WebAuthn credential by PUT'ting the ID and\n        name of the authenticator representing that credential. You can obtain\n        the credentials via the \"List authenticators\" endpoint.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/UpdateWebAuthn\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/WebAuthnAuthenticator\"\n        \"401\":\n          $ref: \"#/components/responses/ReauthenticationRequired\"\n    delete:\n      tags:\n        - \"Account: WebAuthn\"\n      summary: |\n        Delete a WebAuthn credential\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/DeleteWebAuthn\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/StatusOK\"\n        \"401\":\n          $ref: \"#/components/responses/ReauthenticationRequired\"\n    post:\n      tags:\n        - \"Account: WebAuthn\"\n      summary: |\n        Add a WebAuthn credential\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/AddWebAuthnAuthenticator\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/AddWebAuthnAuthenticator\"\n        \"401\":\n          $ref: \"#/components/responses/ReauthenticationRequired\"\n        \"409\":\n          $ref: \"#/components/responses/AddAuthenticatorConflict\"\n  ######################################################################\n  # Sessions\n  ######################################################################\n  /_allauth/{client}/v1/auth/session:\n    get:\n      tags:\n        - \"Authentication: Current Session\"\n      summary: |\n        Get authentication status\n      description: |\n        Retrieve information about the authentication status for the current\n        session.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/Authenticated\"\n        \"401\":\n          $ref: \"#/components/responses/Authentication\"\n        \"410\":\n          $ref: \"#/components/responses/SessionGone\"\n    delete:\n      tags:\n        - \"Authentication: Current Session\"\n      summary: Logout\n      description: |\n        Logs out the user from the current session.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      responses:\n        \"401\":\n          $ref: \"#/components/responses/Unauthenticated\"\n  ######################################################################\n  # Tokens\n  ######################################################################\n  /_allauth/app/v1/tokens/refresh:\n    post:\n      tags:\n        - \"Tokens\"\n      summary: |\n        Refresh the access token\n      description: |\n        Used to retrieve a new access token. Depending on `settings.HEADLESS_JWT_ROTATE_REFRESH_TOKEN`,\n        a new refresh token is returned as well.\n      requestBody:\n        $ref: \"#/components/requestBodies/RefreshToken\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/RefreshToken\"\n        \"400\":\n          description: The refresh token is invalid or expired.\n          content:\n            application/json:\n              schema:\n                $ref: \"#/components/schemas/ErrorResponse\"\n  ######################################################################\n  # Account: Password\n  ######################################################################\n  /_allauth/{client}/v1/account/password/change:\n    post:\n      tags:\n        - \"Account: Password\"\n      summary: Change password\n      description: |\n        In order to change the password of an account, the current and new\n        password must be provider.  However, accounts that were created by\n        signing up using a third-party provider do not have a password set. In\n        that case, the current password is not required.\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/ChangePassword\"\n      responses:\n        \"400\":\n          $ref: \"#/components/responses/Error\"\n        \"401\":\n          $ref: \"#/components/responses/Authentication\"\n  ######################################################################\n  # Authentication: Current Sessions\n  ######################################################################\n  /_allauth/{client}/v1/auth/sessions:\n    get:\n      tags:\n        - \"Sessions\"\n      summary: List sessions\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/Sessions\"\n    delete:\n      tags:\n        - \"Sessions\"\n      summary: End one or more sessions\n      parameters:\n        - $ref: \"#/components/parameters/Client\"\n        - $ref: \"#/components/parameters/SessionToken\"\n      requestBody:\n        $ref: \"#/components/requestBodies/EndSessions\"\n      responses:\n        \"200\":\n          $ref: \"#/components/responses/Sessions\"\n        \"401\":\n          $ref: \"#/components/responses/Authentication\"\ncomponents:\n  ######################################################################\n  # Components: Examples\n  ######################################################################\n  examples:\n    User:\n      value: &user-example\n        id: 123\n        display: Magic Wizard\n        has_usable_password: true\n        email: email@domain.org\n        username: wizard\n    AuthenticatedByPassword:\n      summary: |\n        Authenticated by password.\n      value:\n        status: 200\n        data:\n          user: *user-example\n          methods:\n            - method: password\n              at: 1711555057.065702\n              email: email@domain.org\n        meta:\n          is_authenticated: true\n          session_token: ufwcig0zen9skyd545jc0fkq813ghar2\n          access_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdW\n    AuthenticatedByCode:\n      summary: |\n        Authenticated by code.\n      value:\n        status: 200\n        data:\n          user: *user-example\n          methods:\n            - method: code\n              at: 1711555057.065702\n              email: email@domain.org\n        meta:\n          is_authenticated: true\n          session_token: ufwcig0zen9skyd545jc0fkq813ghar2\n          access_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdW\n    AuthenticatedByPasswordAnd2FA:\n      summary: |\n        Fully authenticated using by password and 2FA.\n      value:\n        status: 200\n        data:\n          user: *user-example\n          methods:\n            - method: password\n              at: 1711555057.065702\n              email: email@domain.org\n            - method: mfa\n              at: 1711555060.9375854\n              id: 66\n              type: totp\n        meta:\n          is_authenticated: true\n          session_token: ufwcig0zen9skyd545jc0fkq813ghar2\n          access_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdW\n\n    CannotGenerateRecoveryCodes:\n      summary: |\n        Unable to generate recovery codes.\n      value:\n        status: 400\n        errors:\n          - message: |\n              You cannot deactivate two-factor authentication.\n              code: cannot_generate_recovery_codes\n    DisconnectNotAllowedNoPassword:\n      summary: Account without a password.\n      value:\n        status: 400\n        errors:\n          - message: Your account has no password set up.\n            code: no_password\n            param: account\n    DisconnectNotAllowedNoVerifiedEmail:\n      summary: Account without a verified email.\n      value:\n        status: 400\n        errors:\n          - message: Your account has no verified email address.\n            code: no_verified_email\n            param: account\n    InvalidAuthenticatorCode:\n      summary: |\n        An error response indicating that the provided code is incorrect.\n      value:\n        status: 400\n        errors:\n          - message: Incorrect code.\n            code: incorrect_code\n            param: code\n    InvalidEmailVerificationKey:\n      summary: |\n        Email verification key invalid.\n      value:\n        status: 400\n        errors:\n          - message: Invalid or expired key.\n            code: invalid\n            param: key\n    InvalidEmail:\n      value:\n        status: 400\n        errors:\n          - message: Enter a valid email address.\n            code: invalid\n            param: email\n    IncorrectPassword:\n      value:\n        status: 400\n        errors:\n          - message: Incorrect password.\n            param: password\n            code: incorrect_password\n    InvalidPasswordResetKey:\n      summary: |\n        Password reset key invalid.\n      value:\n        status: 400\n        errors:\n          - message: The password reset token was invalid.\n            code: token_invalid\n            param: key\n    InvalidProviderToken:\n      summary: |\n        Provider token invalid.\n      value:\n        status: 400\n        errors:\n          - message: The token was invalid.\n            code: invalid\n            param: token\n    PasswordMismatch:\n      value:\n        status: 400\n        errors:\n          - message: The email address and/or password you specified are not correct.\n            code: email_password_mismatch\n            param: password\n    UnauthenticatedInitial:\n      summary: |\n        Unauthenticated: Initial\n      value:\n        status: 401\n        data:\n          flows:\n            - id: login\n            - id: signup\n            - id: provider_redirect\n              providers:\n                - facebook\n                - google\n                - telegram\n            - id: provider_token\n              providers:\n                - google\n        meta:\n          is_authenticated: false\n    UnauthenticatedPending2FA:\n      summary: |\n        Unauthenticated: pending 2FA\n      value:\n        status: 401\n        data:\n          flows:\n            - id: login\n            - id: signup\n            - id: provider_redirect\n              providers:\n                - facebook\n                - google\n                - telegram\n            - id: provider_token\n              providers:\n                - google\n            - id: mfa_authenticate\n              is_pending: true\n        meta:\n          is_authenticated: false\n    UnauthenticatedPendingLoginByCode:\n      summary: |\n        Unauthenticated: pending login by code\n      value:\n        status: 401\n        data:\n          flows:\n            - id: login\n            - id: signup\n            - id: provider_redirect\n              providers:\n                - facebook\n                - google\n                - telegram\n            - id: provider_token\n              providers:\n                - google\n            - id: mfa_authenticate\n            - id: login_by_code\n              is_pending: true\n        meta:\n          is_authenticated: false\n    UnauthenticatedPendingProviderSignup:\n      summary: |\n        Unauthenticated: pending provider signup\n      value:\n        status: 401\n        data:\n          flows:\n            - id: login\n            - id: signup\n            - id: provider_redirect\n              providers:\n                - facebook\n                - google\n                - telegram\n            - id: provider_token\n              providers:\n                - google\n            - id: provider_signup\n              provider:\n                id: google\n                name: Google\n                client_id: 123.apps.googleusercontent.com\n                flows:\n                  - provider_redirect\n                  - provider_token\n              is_pending: true\n        meta:\n          is_authenticated: false\n    UnauthenticatedPendingEmailVerification:\n      summary: |\n        Unauthenticated: pending email verification\n      value:\n        status: 401\n        data:\n          flows:\n            - id: login\n            - id: signup\n            - id: provider_redirect\n              providers:\n                - facebook\n                - google\n                - telegram\n            - id: provider_token\n              providers:\n                - google\n            - id: verify_email\n              is_pending: true\n        meta:\n          is_authenticated: false\n    ReauthenticationRequired:\n      summary: |\n        Reauthentication required\n      value:\n        status: 401\n        data:\n          user: *user-example\n          methods:\n            - method: password\n              at: 1711555057.065702\n              email: email@domain.org\n            - method: mfa\n              at: 1711555060.9375854\n              id: 66\n              type: totp\n          flows:\n            - id: reauthenticate\n            - id: mfa_reauthenticate\n        meta:\n          is_authenticated: true\n  ######################################################################\n  # Components: Request bodies\n  ######################################################################\n  requestBodies:\n    Login:\n      description: Login.\n      required: true\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/Login\"\n    LoginWebAuthn:\n      description: Login using WebAuthn.\n      required: true\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              credential:\n                $ref: \"#/components/schemas/WebAuthnCredential\"\n            required:\n              - credential\n    ReauthenticateWebAuthn:\n      description: Reauthenticate using WebAuthn.\n      required: true\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              credential:\n                $ref: \"#/components/schemas/WebAuthnCredential\"\n            required:\n              - credential\n    AuthenticateWebAuthn:\n      description: Authenticate using WebAuthn.\n      required: true\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              credential:\n                $ref: \"#/components/schemas/WebAuthnCredential\"\n            required:\n              - credential\n    MFAAuthenticate:\n      required: true\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/MFAAuthenticate\"\n    MFATrust:\n      required: true\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/MFATrust\"\n    ConfirmLoginCode:\n      required: true\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/ConfirmLoginCode\"\n    EndSessions:\n      required: true\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/EndSessions\"\n    PasskeySignup:\n      description: Signup using a passkey\n      required: true\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/PasskeySignup\"\n    ProviderAccount:\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              provider:\n                $ref: \"#/components/schemas/ProviderID\"\n              account:\n                $ref: \"#/components/schemas/ProviderAccountID\"\n            required:\n              - account\n              - provider\n    ProviderRedirect:\n      required: true\n      description: |\n        Initiate the provider redirect flow.\n      content:\n        application/x-www-form-urlencoded:\n          schema:\n            $ref: \"#/components/schemas/ProviderRedirect\"\n    ProviderSignup:\n      description: Provider signup.\n      required: true\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/ProviderSignup\"\n    ProviderToken:\n      required: true\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/ProviderToken\"\n    Reauthenticate:\n      description: Reauthenticate.\n      required: true\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/Reauthenticate\"\n    RefreshToken:\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              refresh_token:\n                $ref: \"#/components/schemas/RefreshToken\"\n            required:\n              - refresh_token\n    RequestPassword:\n      description: Request password.\n      required: true\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/RequestPassword\"\n    RequestLoginCode:\n      description: Request a login code.\n      required: true\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/RequestLoginCode\"\n    SetupTOTP:\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              code:\n                $ref: \"#/components/schemas/AuthenticatorCode\"\n            required:\n              - code\n    Signup:\n      description: Signup\n      required: true\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/Signup\"\n    ChangePassword:\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              current_password:\n                $ref: \"#/components/schemas/Password\"\n              new_password:\n                type: string\n                description: |\n                  The current password.\n                example: Aberto!\n            required:\n              - new_password\n    Email:\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              email:\n                $ref: '#/components/schemas/Email'\n            required:\n              - email\n    MarkPrimaryEmail:\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              email:\n                type: string\n                description: |\n                  An email address.\n                example: email@domain.org\n              primary:\n                type: boolean\n                enum:\n                  - true\n                description: |\n                  Primary flag.\n            required:\n              - email\n              - primary\n    Phone:\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              phone:\n                type: string\n                example: \"+314159265359\"\n            required:\n              - phone\n    ResetPassword:\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/ResetPassword\"\n    VerifyEmail:\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/VerifyEmail\"\n    VerifyPhone:\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/VerifyPhone\"\n    UpdateWebAuthn:\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              id:\n                $ref: \"#/components/schemas/AuthenticatorID\"\n              name:\n                type: string\n                example: \"Master key\"\n    AddWebAuthnAuthenticator:\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              name:\n                type: string\n                example: \"Master key\"\n              credential:\n                $ref: \"#/components/schemas/WebAuthnCredential\"\n            required:\n              - credential\n    DeleteWebAuthn:\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              authenticators:\n                description: |\n                  The IDs of the authenticator that are to be deleted.\n                type: array\n                items:\n                  $ref: \"#/components/schemas/AuthenticatorID\"\n            required:\n              - authenticators\n\n  ######################################################################\n  # Components: Schemas\n  ######################################################################\n  schemas:\n    Session:\n      type: object\n      properties:\n        user_agent:\n          type: string\n          example: Mozilla Firefox\n        ip:\n          type: string\n          example: 127.2.3.192\n        created_at:\n          $ref: \"#/components/schemas/Timestamp\"\n        is_current:\n          type: boolean\n        id:\n          type: integer\n          example: 123\n        last_seen_at:\n          $ref: \"#/components/schemas/Timestamp\"\n      required:\n        - user_agent\n        - ip\n        - created_at\n        - is_current\n        - id\n    AccountConfiguration:\n      type: object\n      description: |\n        Configuration of the Django `allauth.account` app.\n      properties:\n        login_methods:\n          type: array\n          items:\n            type: string\n            enum:\n              - email\n              - username\n        is_open_for_signup:\n          type: boolean\n        email_verification_by_code_enabled:\n          type: boolean\n        login_by_code_enabled:\n          type: boolean\n        password_reset_by_code_enabled:\n          type: boolean\n      required:\n        - authentication_method\n        - email_verification_by_code_enabled\n        - is_open_for_signup\n        - login_by_code_enabled\n    AuthenticationResponse:\n      type: object\n      description: |\n        An authentication related response.\n      properties:\n        status:\n          type: integer\n          enum:\n            - 401\n        data:\n          type: object\n          properties:\n            flows:\n              type: array\n              items:\n                $ref: \"#/components/schemas/Flow\"\n          required:\n            - flows\n        meta:\n          $ref: \"#/components/schemas/AuthenticationMeta\"\n      required:\n        - status\n        - data\n        - meta\n    ForbiddenResponse:\n      type: object\n      properties:\n        status:\n          type: integer\n          enum:\n            - 403\n      required:\n        - status\n    ConflictResponse:\n      type: object\n      properties:\n        status:\n          type: integer\n          enum:\n            - 409\n      required:\n        - status\n    EndSessions:\n      type: object\n      properties:\n        sessions:\n          description: |\n            The IDs of the sessions that are to be ended.\n          type: array\n          items:\n            type: integer\n            example: 123\n      required:\n        - sessions\n    PhoneNumber:\n      type: object\n      description: |\n        A phone number.\n      properties:\n        phone:\n          type: string\n          example: \"+314159265359\"\n        verified:\n          type: boolean\n      required:\n        - phone\n        - verified\n    PhoneNumbersResponse:\n      type: object\n      properties:\n        status:\n          $ref: \"#/components/schemas/StatusOK\"\n        data:\n          type: array\n          items:\n            $ref: \"#/components/schemas/PhoneNumber\"\n      required:\n        - status\n        - data\n    PhoneNumberChangeResponse:\n      type: object\n      properties:\n        status:\n          $ref: \"#/components/schemas/StatusAccepted\"\n        data:\n          type: array\n          items:\n            $ref: \"#/components/schemas/PhoneNumber\"\n      required:\n        - status\n        - data\n      example:\n        status: 202\n        data:\n          - phone: \"+314159265359\"\n            verified: false\n    ReauthenticationResponse:\n      type: object\n      description: |\n        A response indicating reauthentication is required.\n      properties:\n        status:\n          type: integer\n          enum:\n            - 401\n        data:\n          $ref: \"#/components/schemas/ReauthenticationRequired\"\n        meta:\n          $ref: \"#/components/schemas/AuthenticatedMeta\"\n      required:\n        - status\n        - data\n        - meta\n    SessionGoneResponse:\n      type: object\n      description: |\n        The session is expired or invalid.\n      properties:\n        status:\n          type: integer\n          enum:\n            - 410\n        data:\n          type: object\n        meta:\n          $ref: \"#/components/schemas/AuthenticationMeta\"\n      required:\n        - status\n        - data\n        - meta\n    BaseAuthenticationMeta:\n      type: object\n      properties:\n        session_token:\n          type: string\n          description: |\n            The session token (`app` clients only).\n          example: ufwcig0zen9skyd545jc0fkq813ghar2\n        access_token:\n          type: string\n          description: |\n            The access token (`app` clients only).\n          example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdW\n    AuthenticationMeta:\n      allOf:\n        - $ref: \"#/components/schemas/BaseAuthenticationMeta\"\n        - type: object\n          description: |\n            Metadata available in an authentication related response.\n          properties:\n            is_authenticated:\n              type: boolean\n          required:\n            - is_authenticated\n    AuthenticatedMeta:\n      allOf:\n        - $ref: \"#/components/schemas/BaseAuthenticationMeta\"\n        - type: object\n          description: |\n            Metadata available in an re-authentication related response.\n          properties:\n            is_authenticated:\n              type: boolean\n              enum:\n                - true\n          required:\n            - is_authenticated\n    Flow:\n      type: object\n      properties:\n        id:\n          type: string\n          enum:\n            - login\n            - login_by_code\n            - mfa_authenticate\n            - mfa_reauthenticate\n            - provider_redirect\n            - provider_signup\n            - provider_token\n            - reauthenticate\n            - signup\n            - verify_email\n            - verify_phone\n        provider:\n          $ref: \"#/components/schemas/Provider\"\n        is_pending:\n          type: boolean\n          enum:\n            - true\n        types:\n          type: array\n          description: Matches `settings.MFA_SUPPORTED_TYPES`.\n          items:\n            $ref: \"#/components/schemas/AuthenticatorType\"\n      required:\n        - id\n    Authenticated:\n      type: object\n      properties:\n        user:\n          $ref: \"#/components/schemas/User\"\n        methods:\n          type: array\n          description: |\n            A list of methods used to authenticate.\n          items:\n            $ref: \"#/components/schemas/AuthenticationMethod\"\n      required:\n        - user\n        - methods\n    ReauthenticationRequired:\n      properties:\n        flows:\n          type: array\n          items:\n            $ref: '#/components/schemas/Flow'\n        user:\n          $ref: '#/components/schemas/User'\n        methods:\n          type: array\n          description: |\n            A list of methods used to authenticate.\n          items:\n            $ref: '#/components/schemas/AuthenticationMethod'\n      required:\n        - flows\n        - user\n        - methods\n      type: object\n    AuthenticationMethod:\n      oneOf:\n        - type: object\n          title: |\n            Authenticated by username/email login\n          properties:\n            method:\n              type: string\n              enum:\n                - password\n            at:\n              $ref: \"#/components/schemas/Timestamp\"\n            email:\n              $ref: \"#/components/schemas/Email\"\n            username:\n              $ref: \"#/components/schemas/Username\"\n          required:\n            - method\n            - at\n        - type: object\n          title: |\n            Authenticated after password reset\n          properties:\n            method:\n              type: string\n              enum:\n                - password_reset\n            at:\n              $ref: \"#/components/schemas/Timestamp\"\n            email:\n              $ref: \"#/components/schemas/Email\"\n          required:\n            - at\n            - email\n            - method\n        - type: object\n          title: |\n            Authenticated by confirming a code sent by email.\n          properties:\n            method:\n              type: string\n              enum:\n                - code\n            at:\n              $ref: \"#/components/schemas/Timestamp\"\n            email:\n              $ref: \"#/components/schemas/Email\"\n          required:\n            - at\n            - email\n            - method\n        - type: object\n          title: |\n            Authenticated by confirming a code sent by phone.\n          properties:\n            method:\n              type: string\n              enum:\n                - code\n            at:\n              $ref: \"#/components/schemas/Timestamp\"\n            phone:\n              $ref: \"#/components/schemas/Phone\"\n          required:\n            - at\n            - method\n            - phone\n        - type: object\n          title: |\n            Reauthenticated by password\n          properties:\n            method:\n              type: string\n              enum:\n                - password\n            at:\n              $ref: \"#/components/schemas/Timestamp\"\n            reauthenticated:\n              type: boolean\n              enum:\n                - true\n          required:\n            - method\n            - reauthenticated\n            - at\n        - type: object\n          title: |\n            Authenticated by third-party provider\n          properties:\n            method:\n              type: string\n              enum:\n                - socialaccount\n            at:\n              $ref: \"#/components/schemas/Timestamp\"\n            provider:\n              $ref: \"#/components/schemas/ProviderID\"\n            uid:\n              $ref: \"#/components/schemas/ProviderAccountID\"\n          required:\n            - method\n            - reauthenticated\n            - at\n            - provider\n            - uid\n        - type: object\n          title: |\n            (Re)authenticated by 2FA\n          properties:\n            method:\n              type: string\n              enum:\n                - mfa\n            at:\n              $ref: \"#/components/schemas/Timestamp\"\n            type:\n              $ref: \"#/components/schemas/AuthenticatorType\"\n            reauthenticated:\n              type: boolean\n          required:\n            - method\n            - at\n            - type\n    AuthenticatedResponse:\n      type: object\n      properties:\n        status:\n          $ref: \"#/components/schemas/StatusOK\"\n        data:\n          $ref: \"#/components/schemas/Authenticated\"\n        meta:\n          $ref: \"#/components/schemas/AuthenticationMeta\"\n      required:\n        - status\n        - data\n        - meta\n    MFAAuthenticate:\n      type: object\n      properties:\n        code:\n          $ref: \"#/components/schemas/AuthenticatorCode\"\n      required:\n        - code\n    MFATrust:\n      type: object\n      properties:\n        trust:\n          type: boolean\n      required:\n        - trust\n    ConfirmLoginCode:\n      type: object\n      properties:\n        code:\n          $ref: \"#/components/schemas/Code\"\n      required:\n        - code\n    ClientID:\n      type: string\n      description: |\n        The client ID (in case of OAuth2 or OpenID Connect based providers)\n      example: 123.apps.googleusercontent.com\n    ProviderToken:\n      type: object\n      properties:\n        provider:\n          $ref: \"#/components/schemas/ProviderID\"\n        process:\n          $ref: \"#/components/schemas/Process\"\n        token:\n          description: |\n            The token.\n          type: object\n          properties:\n            client_id:\n              $ref: \"#/components/schemas/ClientID\"\n            id_token:\n              type: string\n              description: |\n                The ID token.\n              example: eyJhbGciOiJI\n            access_token:\n              type: string\n              description: |\n                The access token.\n              example: 36POk6yJV_adQs\n          required:\n            - client_id\n      required:\n        - provider\n        - process\n        - token\n    ProviderRedirect:\n      type: object\n      properties:\n        provider:\n          $ref: \"#/components/schemas/ProviderID\"\n        callback_url:\n          type: string\n          description: |\n            The URL to return to after the redirect flow is complete.\n\n            Note that this is not to be mistaken with the callback URL that you\n            configure over at the OAuth provider during the OAuth app/client\n            setup. The flow is as follows:\n\n              1. Your frontend redirects to the headless provider redirect\n                 endpoint in a synchronous (non-XHR) manner, informing allauth\n                 (by means of `callback_url`) where to redirect to after the\n                 provider handshake is completed.\n\n              2. Headless will redirect to the (OAuth) identity provider to\n                 initiate the handshake, passing along a different callback URL\n                 to the provider: one that points to an allauth backend URL.\n                 This is the URL that you need to have setup at your OAuth\n                 app/client configuration. Note that this must be a backend URL\n                 as providers can use POST requests to perform their callbacks,\n                 which is something a frontend would not be able to handle.\n\n              3. After the authorization at the provider is completed, the\n                 provider redirects to the *backend* allauth callback URL, which\n                 will then redirect back to the *frontend* callback URL.\n\n              4. Your frontend is now expected to fetch the current session to\n                 determine what the next course of action is. The user could be\n                 authenticated at this point, or another flow is pending\n                 (e.g. email verification, or, provider signup). In case of\n                 errors a `?error=` is passed to the frontend callback URL.\n          example: https://app.project.org/account/provider/callback\n        process:\n          $ref: \"#/components/schemas/Process\"\n      required:\n        - provider\n        - process\n        - callback_url\n    RequestPassword:\n      type: object\n      properties:\n        email:\n          $ref: \"#/components/schemas/Email\"\n      required:\n        - email\n    RequestLoginCode:\n      type: object\n      anyOf:\n        - title: Request login code (phone)\n          properties:\n            phone:\n              $ref: \"#/components/schemas/Phone\"\n          required:\n            - phone\n        - title: Request login code (email)\n          properties:\n            email:\n              $ref: \"#/components/schemas/Email\"\n          required:\n            - email\n    Reauthenticate:\n      type: object\n      properties:\n        password:\n          $ref: \"#/components/schemas/Password\"\n      required:\n        - password\n    ProviderSignup:\n      allOf:\n        - $ref: '#/components/schemas/BaseSignup'\n    PasskeySignup:\n      allOf:\n        - $ref: '#/components/schemas/BaseSignup'\n    BaseSignup:\n      type: object\n      properties:\n        email:\n          $ref: \"#/components/schemas/Email\"\n        phone:\n          $ref: \"#/components/schemas/Phone\"\n        username:\n          $ref: \"#/components/schemas/Username\"\n    Signup:\n      allOf:\n        - $ref: '#/components/schemas/BaseSignup'\n        - type: object\n          properties:\n            password:\n              $ref: \"#/components/schemas/Password\"\n          required:\n            - password\n    Username:\n      type: string\n      description: |\n        The username.\n      example: wizard\n    Email:\n      type: string\n      description: |\n        The email address.\n      example: email@domain.org\n    Phone:\n      type: string\n      description: |\n        The phone number.\n      example: \"+314159265359\"\n    AccessToken:\n      type: string\n      description: |\n        The access token.\n      example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdW\n    RefreshToken:\n      type: string\n      description: |\n        The refresh token.\n      example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.QV30\n    Login:\n      allOf:\n        - type: object\n          properties:\n            password:\n              $ref: \"#/components/schemas/Password\"\n          required:\n            - password\n        - anyOf:\n            - title: Login by username\n              properties:\n                username:\n                  $ref: \"#/components/schemas/Username\"\n              required:\n                - username\n            - title: Login by email\n              properties:\n                email:\n                  $ref: \"#/components/schemas/Email\"\n              required:\n                - email\n            - title: Login by phone\n              properties:\n                phone:\n                  $ref: \"#/components/schemas/Phone\"\n              required:\n                - phone\n    StatusOK:\n      type: integer\n      enum:\n        - 200\n    StatusAccepted:\n      type: integer\n      enum:\n        - 202\n    AuthenticatorID:\n      type: integer\n      description: |\n        Authenticator ID.\n      example: 123\n    SocialAccountConfiguration:\n      type: object\n      description: |\n        Configuration of the Django `allauth.socialaccount` app.\n      properties:\n        providers:\n          $ref: \"#/components/schemas/ProviderList\"\n      required:\n        - providers\n    MFAConfiguration:\n      type: object\n      description: |\n        Configuration of the Django `allauth.mfa` app.\n      properties:\n        supported_types:\n          type: array\n          description: |\n            Matches `settings.MFA_SUPPORTED_TYPES`.\n          items:\n            $ref: \"#/components/schemas/AuthenticatorType\"\n      required:\n        - supported_types\n    UserSessionsConfiguration:\n      type: object\n      description: |\n        Configuration of the Django `allauth.usersessions` app.\n      properties:\n        track_activity:\n          type: boolean\n          description: |\n            Matches `settings.USERSESSIONS_TRACK_ACTIVITY`.\n      required:\n        - track_activity\n    ConfigurationResponse:\n      type: object\n      properties:\n        data:\n          type: object\n          properties:\n            account:\n              $ref: \"#/components/schemas/AccountConfiguration\"\n            socialaccount:\n              $ref: \"#/components/schemas/SocialAccountConfiguration\"\n            mfa:\n              $ref: \"#/components/schemas/MFAConfiguration\"\n            usersessions:\n              $ref: \"#/components/schemas/UserSessionsConfiguration\"\n          required:\n            - account\n        status:\n          $ref: \"#/components/schemas/StatusOK\"\n      required:\n        - status\n        - data\n      example:\n        status: 200\n        data:\n          account:\n            authentication_method: email\n          socialaccount:\n            providers:\n              - id: \"google\"\n                name: \"Google\"\n                flows:\n                  - \"provider_redirect\"\n                  - \"provider_token\"\n                client_id: \"123.apps.googleusercontent.com\"\n                openid_configuration_url: https://accounts.google.com/.well-known/openid-configuration\n          mfa:\n            supported_types:\n              - \"recovery_codes\"\n              - \"totp\"\n          usersessions:\n            track_activity: false\n    ResetPassword:\n      type: object\n      properties:\n        key:\n          type: string\n          description: The password reset key\n          example: 2f-c4nqd4-e07d9bc694f9f28cd4fe92569d495333\n        password:\n          $ref: \"#/components/schemas/Password\"\n      required:\n        - key\n        - password\n    VerifyEmail:\n      type: object\n      properties:\n        key:\n          type: string\n          description: The email verification key\n          example: 2f-c4nqd4-e07d9bc694f9f28cd4fe92569d495333\n      required:\n        - key\n    VerifyPhone:\n      type: object\n      properties:\n        code:\n          type: string\n          description: The phone verification code\n          example: 4S3H82\n      required:\n        - code\n    OptionalTimestamp:\n      nullable: true\n      $ref: \"#/components/schemas/Timestamp\"\n    Timestamp:\n      type: number\n      description: |\n        An epoch based timestamp (trivial to parse using: `new Date(value)*1000`)\n      example: 1711555057.065702\n    AuthenticatorCode:\n      type: string\n      description: |\n        An authenticator code.\n      example: \"314159\"\n    Code:\n      type: string\n      description: |\n        An one-time code.\n      example: \"NQ3TM5\"\n    AuthenticatorType:\n      type: string\n      enum:\n        - recovery_codes\n        - totp\n        - webauthn\n      description: |\n        The type of authenticator.\n    Password:\n      type: string\n      description: |\n        The password.\n      example: Alohomora!\n    ErrorResponse:\n      type: object\n      properties:\n        status:\n          type: integer\n          enum:\n            - 400\n          example: 400\n        errors:\n          type: array\n          items:\n            type: object\n            properties:\n              code:\n                type: string\n                example: invalid\n                description: |\n                  An error code.\n              param:\n                type: string\n                example: email\n                description: |\n                  The name of the input parameter that was incorrect.\n              message:\n                type: string\n                example: Enter a valid email address.\n                description: |\n                  A human readable error message.\n            required:\n              - code\n              - message\n    Process:\n      type: string\n      description: |\n        The process to be executed when the user successfully\n        authenticates. When set to `login`, the user will be logged into the\n        account to which the provider account is connected, or if no such\n        account exists, a signup will occur. If set to `connect`, the provider\n        account will be connected to the list of provider accounts for the\n        currently authenticated user.\n      enum:\n        - login\n        - connect\n      example: login\n    ProviderID:\n      type: string\n      description: |\n        The provider ID.\n      example: google\n    ProviderAccountID:\n      type: string\n      description: |\n        The provider specific account ID.\n      example: goo12345\n    User:\n      type: object\n      properties:\n        id:\n          description: |\n            The user ID.\n          oneOf:\n            - type: integer\n              example: 123\n            - type: string\n              example: 89d3f9a0-51a5-49dd-8b97-7536641958e9\n        display:\n          type: string\n          description: |\n            The display name for the user.\n          example: Magic Wizard\n        has_usable_password:\n          type: boolean\n          description: |\n            Whether or not the account has a password set.\n          example: true\n        email:\n          $ref: \"#/components/schemas/Email\"\n        username:\n          $ref: \"#/components/schemas/Username\"\n    EmailAddress:\n      type: object\n      properties:\n        email:\n          $ref: \"#/components/schemas/Email\"\n        primary:\n          type: boolean\n          example: true\n        verified:\n          type: boolean\n          example: false\n      required:\n        - email\n        - primary\n        - verified\n    BaseAuthenticator:\n      type: object\n      properties:\n        last_used_at:\n          $ref: \"#/components/schemas/OptionalTimestamp\"\n        created_at:\n          $ref: \"#/components/schemas/Timestamp\"\n      required:\n        - created_at\n        - last_used_at\n    TOTPAuthenticator:\n      allOf:\n        - $ref: \"#/components/schemas/BaseAuthenticator\"\n        - type: object\n          properties:\n            type:\n              type: string\n              enum:\n                - totp\n          required:\n            - type\n    WebAuthnAuthenticator:\n      allOf:\n        - $ref: \"#/components/schemas/BaseAuthenticator\"\n        - type: object\n          properties:\n            type:\n              type: string\n              enum:\n                - webauthn\n            id:\n              $ref: \"#/components/schemas/AuthenticatorID\"\n            name:\n              type: string\n              example: \"Master key\"\n            is_passwordless:\n              type: boolean\n              description: |\n                Whether or not this authenticator represents a passkey. Absent if it is not specified.\n          required:\n            - type\n            - id\n            - name\n    RecoveryCodesAuthenticator:\n      allOf:\n        - $ref: \"#/components/schemas/BaseAuthenticator\"\n        - type: object\n          properties:\n            type:\n              type: string\n              description: |\n                The authenticator type.\n              enum:\n                - recovery_codes\n            total_code_count:\n              type: integer\n              description: |\n                The total number of recovery codes that initially were available.\n              example: 10\n            unused_code_count:\n              type: integer\n              description: |\n                The number of recovery codes that are unused.\n              example: 7\n          required:\n            - type\n            - total_code_count\n            - unused_code_count\n    SensitiveRecoveryCodesAuthenticator:\n      allOf:\n        - $ref: \"#/components/schemas/RecoveryCodesAuthenticator\"\n        - type: object\n          properties:\n            unused_codes:\n              type: array\n              description: |\n                The list of unused codes.\n              items:\n                $ref: \"#/components/schemas/AuthenticatorCode\"\n          required:\n            - unused_codes\n    AuthenticatorList:\n      type: array\n      items:\n        oneOf:\n          - $ref: \"#/components/schemas/TOTPAuthenticator\"\n          - $ref: \"#/components/schemas/RecoveryCodesAuthenticator\"\n          - $ref: \"#/components/schemas/WebAuthnAuthenticator\"\n    ProviderList:\n      type: array\n      items:\n        $ref: \"#/components/schemas/Provider\"\n    Provider:\n      type: object\n      properties:\n        id:\n          type: string\n          example: google\n          description: |\n            The provider ID.\n        name:\n          type: string\n          description: |\n            The name of the provider.\n          example: Google\n        client_id:\n          type: string\n          description: |\n            The client ID (in case of OAuth2 or OpenID Connect based providers)\n          example: 123.apps.googleusercontent.com\n        openid_configuration_url:\n          type: string\n          description: |\n            The OIDC discovery or well-known URL (in case of OAuth2 or OpenID Connect based providers)\n          example: https://accounts.google.com/.well-known/openid-configuration\n        flows:\n          type: array\n          description: |\n            The authentication flows the provider integration supports.\n          items:\n            type: string\n            enum:\n              - provider_redirect\n              - provider_token\n      required:\n        - id\n        - name\n        - flows\n    ProviderAccount:\n      type: object\n      properties:\n        uid:\n          $ref: \"#/components/schemas/ProviderAccountID\"\n        display:\n          type: string\n          description: |\n            A name derived from the third-party provider account data.\n          example: Wizzkid\n        provider:\n          $ref: \"#/components/schemas/Provider\"\n      required:\n        - uid\n        - provider\n        - display\n    EmailVerificationInfo:\n      type: object\n      properties:\n        status:\n          $ref: \"#/components/schemas/StatusOK\"\n        data:\n          type: object\n          properties:\n            email:\n              $ref: \"#/components/schemas/Email\"\n            user:\n              $ref: \"#/components/schemas/User\"\n          required:\n            - email\n            - user\n        meta:\n          type: object\n          properties:\n            is_authenticating:\n              type: boolean\n          required:\n            - is_authenticating\n      required:\n        - status\n        - data\n        - meta\n    WebAuthnCredentialRequestOptions:\n      type: object\n      properties:\n        request_options:\n          type: object\n          example: {\"status\": 200, \"data\": {\"request_options\": {\"publicKey\": {\"challenge\": \"aOecJJtLA2e-Dj2WU-zbRoJewbQqSUPxoA9EzsUL72o\", \"rpId\": \"localhost\", \"allowCredentials\": [], \"userVerification\": \"preferred\"}}}}\n      required:\n        - request_options\n    WebAuthnCredentialCreationOptions:\n      type: object\n      properties:\n        creation_options:\n          type: object\n          example: {\"status\": 200, \"data\": {\"request_options\": {\"publicKey\": {\"challenge\": \"aOecJJtLA2e-Dj2WU-zbRoJewbQqSUPxoA9EzsUL72o\", \"rpId\": \"localhost\", \"allowCredentials\": [], \"userVerification\": \"preferred\"}}}}\n      required:\n        - creation_options\n    WebAuthnCredential:\n      type: object\n      example: {\"credential\":{\"type\":\"public-key\",\"id\":\"-J4JNfPfnLyRSMK4R...\",\"rawId\":\"-J4JNfPfnLyRSMK4R...\",\"authenticatorAttachment\":\"cross-platform\",\"response\":{\"clientDataJSON\":\"eyJjaGFsbGVuZ2UiOi...\",\"authenticatorData\":\"SZYN5YgO...\",\"signature\":\"MEUCIE-7sqILygPqGbrRZ4j2nqeqUU...\",\"userHandle\":\"Mg...\"},\"clientExtensionResults\":{}}}\n  ######################################################################\n  # Components: Parameters\n  ######################################################################\n  parameters:\n    Client:\n      name: client\n      in: path\n      description: The type of client accessing the API.\n      required: true\n      schema:\n        type: string\n        enum:\n          - app\n          - browser\n    EmailVerificationKey:\n      in: header\n      name: X-Email-Verification-Key\n      schema:\n        type: string\n      required: true\n      description: The email verification key\n    PasswordResetKey:\n      in: header\n      name: X-Password-Reset-Key\n      schema:\n        type: string\n      required: true\n      description: The password reset key\n    SessionToken:\n      in: header\n      name: X-Session-Token\n      required: false\n      description: |\n        Session token. Only needed when `client` is equal to `app`.\n      schema:\n        type: string\n    PasswordLess:\n      in: query\n      name: passwordless\n      required: false\n      schema:\n        type: boolean\n      allowEmptyValue: true\n      description: |\n        When present (regardless of its value), enables passwordless sign-in via a WebAuthn credential (Passkey),\n        but may enforce additional multi-factor authentication (MFA) requirements. Omit the parameter to disable.\n  ######################################################################\n  # Components: Responses\n  ######################################################################\n  responses:\n    AddAuthenticatorConflict:\n      description: |\n        The account prohibits adding an authenticator, e.g. because of an unverified email address.\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/ConflictResponse\"\n    Authentication:\n      description: Not authenticated.\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/AuthenticationResponse\"\n          examples:\n            unauthenticated_initial:\n              $ref: \"#/components/examples/UnauthenticatedInitial\"\n            unauthenticated_pending_2fa:\n              $ref: \"#/components/examples/UnauthenticatedPending2FA\"\n            unauthenticated_pending_provider_signup:\n              $ref: \"#/components/examples/UnauthenticatedPendingProviderSignup\"\n            unauthenticated_pending_email_verification:\n              $ref: \"#/components/examples/UnauthenticatedPendingEmailVerification\"\n            reauthentication_required:\n              $ref: \"#/components/examples/ReauthenticationRequired\"\n\n    Authenticators:\n      description: |\n        List of authenticators.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                $ref: \"#/components/schemas/StatusOK\"\n              data:\n                $ref: \"#/components/schemas/AuthenticatorList\"\n            required:\n              - status\n              - data\n    AuthenticatedByPassword:\n      description: |\n        Authenticated by password.\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/AuthenticatedResponse\"\n          examples:\n            authenticated:\n              $ref: \"#/components/examples/AuthenticatedByPassword\"\n    AuthenticatedByCode:\n      description: |\n        Authenticated by code.\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/AuthenticatedResponse\"\n          examples:\n            authenticated:\n              $ref: \"#/components/examples/AuthenticatedByCode\"\n    AuthenticatedByPasswordAnd2FA:\n      description: |\n        Authenticated by password and 2FA.\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/AuthenticatedResponse\"\n          examples:\n            authenticated:\n              $ref: \"#/components/examples/AuthenticatedByPasswordAnd2FA\"\n    AuthenticationOrReauthentication:\n      description: |\n        The response indicates authentication or re-authentication is required.\n      content:\n        application/json:\n          schema:\n            oneOf:\n              - $ref: \"#/components/schemas/AuthenticationResponse\"\n              - $ref: \"#/components/schemas/ReauthenticationResponse\"\n    Configuration:\n      description: |\n        The django-allauth configuration.\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/ConfigurationResponse\"\n    EmailAddresses:\n      description: |\n        List of email addresses.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                $ref: \"#/components/schemas/StatusOK\"\n              data:\n                type: array\n                items:\n                  $ref: \"#/components/schemas/EmailAddress\"\n            required:\n              - status\n              - data\n    EmailVerificationInfo:\n      description: Email verification information.\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/EmailVerificationInfo\"\n    Error:\n      description: An input error occurred.\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/ErrorResponse\"\n    Forbidden:\n      description: |\n        A forbidden response.\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/ForbiddenResponse\"\n    NotFound:\n      description: |\n        Not found.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                type: integer\n                enum:\n                  - 404\n            required:\n              - status\n    PasswordResetInfo:\n      description: Information about the password reset key.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                $ref: \"#/components/schemas/StatusOK\"\n              data:\n                type: object\n                properties:\n                  user:\n                    $ref: \"#/components/schemas/User\"\n            required:\n              - status\n              - data\n    PhoneNumbers:\n      description: |\n        List of phone numbers.\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/PhoneNumbersResponse\"\n    ProviderAccounts:\n      description: |\n        List of third-party provider accounts.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                $ref: \"#/components/schemas/StatusOK\"\n              data:\n                type: array\n                items:\n                  $ref: \"#/components/schemas/ProviderAccount\"\n            required:\n              - status\n              - data\n    ProviderSignup:\n      description: |\n        Information relating to the pending provider signup.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                $ref: \"#/components/schemas/StatusOK\"\n              data:\n                type: object\n                properties:\n                  email:\n                    type: array\n                    items:\n                      $ref: \"#/components/schemas/EmailAddress\"\n                  account:\n                    $ref: \"#/components/schemas/ProviderAccount\"\n                  user:\n                    $ref: \"#/components/schemas/User\"\n                required:\n                  - email\n                  - account\n                  - user\n            required:\n              - status\n              - data\n    ReauthenticationRequired:\n      description: |\n        The response indicates reauthentication is required.\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/ReauthenticationResponse\"\n          examples:\n            reauthentication_required:\n              summary: |\n                Reauthentication required\n              value:\n                status: 401\n                data:\n                  user: *user-example\n                  methods:\n                    - method: password\n                      at: 1711555057.065702\n                      email: email@domain.org\n                    - method: mfa\n                      at: 1711555060.9375854\n                      id: 66\n                      type: totp\n                  flows:\n                    - id: reauthenticate\n                    - id: mfa_reauthenticate\n                meta:\n                  is_authenticated: true\n    RecoveryCodes:\n      description: |\n        Information on the recovery codes.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                $ref: \"#/components/schemas/StatusOK\"\n              data:\n                $ref: \"#/components/schemas/SensitiveRecoveryCodesAuthenticator\"\n            required:\n              - status\n              - data\n    RefreshToken:\n      description: A new access token (and optionally new refresh token).\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                $ref: \"#/components/schemas/StatusOK\"\n              data:\n                type: object\n                properties:\n                  access_token:\n                    $ref: \"#/components/schemas/AccessToken\"\n                  refresh_token:\n                    $ref: \"#/components/schemas/RefreshToken\"\n                required:\n                  - access_token\n            required:\n              - data\n              - status\n    Sessions:\n      description: |\n        List of sessions.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                $ref: \"#/components/schemas/StatusOK\"\n              data:\n                type: array\n                items:\n                  $ref: \"#/components/schemas/Session\"\n            required:\n              - status\n              - data\n    SessionGone:\n      description: |\n        The response indicates session is invalid or no longer exists.\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/SessionGoneResponse\"\n          examples:\n            unauth:\n              $ref: \"#/components/examples/UnauthenticatedInitial\"\n    StatusOK:\n      description: |\n        A success response.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                $ref: \"#/components/schemas/StatusOK\"\n            required:\n              - status\n    TooManyRequests:\n      description: |\n        Too many requests.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                type: integer\n                enum:\n                  - 429\n            required:\n              - status\n    TOTPAuthenticator:\n      description: |\n        Information on the TOTP authenticator.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                $ref: \"#/components/schemas/StatusOK\"\n              meta:\n                properties:\n                  recovery_codes_generated:\n                    description: Whether or not recovery codes where generated automatically.\n                    type: boolean\n                type: object\n              data:\n                $ref: \"#/components/schemas/TOTPAuthenticator\"\n            required:\n              - status\n              - data\n    TOTPAuthenticatorNotFound:\n      description: |\n        No TOTP authenticator has been set up.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                type: integer\n                enum:\n                  - 404\n              meta:\n                type: object\n                properties:\n                  secret:\n                    type: string\n                    description: |\n                      A TOTP secret that can be used to setup a new authenticator.\n                    example: J4ZKKXTK7NOVU7EPUVY23LCDV4T2QZYM\n                  totp_url:\n                    type: string\n                    description: |\n                      otpauth URI from which a QR code can be generated and scanned by OTP clients.\n                    example: otpauth://totp/Example:alice@fsf.org?secret=JBSWY3DPEHPK3PXP&issuer=Example\n                required:\n                  - secret\n                  - totp_url\n            required:\n              - status\n              - meta\n    Unauthenticated:\n      description: |\n        There is no authenticated session.\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/AuthenticationResponse\"\n          examples:\n            unauth:\n              $ref: \"#/components/examples/UnauthenticatedInitial\"\n    Authenticated:\n      description: The user is authenticated.\n      content:\n        application/json:\n          schema:\n            $ref: \"#/components/schemas/AuthenticatedResponse\"\n    WebAuthnRequestOptionsResponse:\n      description: WebAuthn credential request options.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                $ref: \"#/components/schemas/StatusOK\"\n              data:\n                $ref: \"#/components/schemas/WebAuthnCredentialRequestOptions\"\n            required:\n              - status\n              - data\n    WebAuthnCreationOptionsResponse:\n      description: WebAuthn credential creation options.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                $ref: \"#/components/schemas/StatusOK\"\n              data:\n                $ref: \"#/components/schemas/WebAuthnCredentialCreationOptions\"\n            required:\n              - status\n              - data\n    WebAuthnAuthenticator:\n      description: A WebAuthn authenticator.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                $ref: \"#/components/schemas/StatusOK\"\n              data:\n                $ref: \"#/components/schemas/WebAuthnAuthenticator\"\n            required:\n              - status\n              - data\n    AddWebAuthnAuthenticator:\n      description: A WebAuthn authenticator.\n      content:\n        application/json:\n          schema:\n            type: object\n            properties:\n              status:\n                $ref: \"#/components/schemas/StatusOK\"\n              data:\n                $ref: \"#/components/schemas/WebAuthnAuthenticator\"\n              meta:\n                type: object\n                properties:\n                  recovery_codes_generated:\n                    type: boolean\n                    description: |\n                      Whether or not recovery codes where generated automatically.\n            required:\n              - status\n              - data\n              - meta\n"
  },
  {
    "path": "allauth/headless/spec/internal/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/headless/spec/internal/openapikit.py",
    "content": "import dataclasses\nimport datetime\nfrom typing import Any, Union, get_args, get_origin\n\nfrom django import forms\n\nfrom allauth.account.fields import EmailField\n\n\nFIELD_MAPPING = {\n    forms.CharField: {\"type\": \"string\"},\n    forms.IntegerField: {\"type\": \"integer\"},\n    forms.FloatField: {\"type\": \"number\"},\n    forms.BooleanField: {\"type\": \"boolean\"},\n    forms.DateField: {\"type\": \"string\", \"format\": \"date\"},\n    forms.DateTimeField: {\"type\": \"string\", \"format\": \"date-time\"},\n    forms.EmailField: {\"type\": \"string\", \"format\": \"email\"},\n    EmailField: {\"type\": \"string\", \"format\": \"email\"},\n    forms.URLField: {\"type\": \"string\", \"format\": \"uri\"},\n    forms.DecimalField: {\n        \"type\": \"string\",\n        \"format\": \"decimal\",\n        \"pattern\": r\"^\\d+(\\.\\d+)?$\",\n    },\n}\n\n\ndef spec_for_field(field: forms.Field) -> dict[str, Any]:\n    field_spec: dict[str, Any] = FIELD_MAPPING.get(type(field), {\"type\": \"string\"})\n    field_spec = dict(field_spec)\n    if hasattr(field, \"max_length\") and field.max_length:\n        field_spec[\"maxLength\"] = field.max_length\n    if hasattr(field, \"min_length\") and field.min_length:\n        field_spec[\"minLength\"] = field.min_length\n    if hasattr(field, \"help_text\") and field.help_text:\n        field_spec[\"description\"] = field.help_text\n    return field_spec\n\n\ndef unwrap_optional_type(typ):\n    if get_origin(typ) is not Union:\n        return typ, True\n    args = get_args(typ)\n    if len(args) != 2 or type(None) not in args:\n        return typ, True\n    return args[0], False\n\n\ndef spec_for_dataclass(dc) -> tuple[dict, dict]:\n    example = {}\n    props = {}\n    required = []\n    for field_id, field in dc.__dataclass_fields__.items():\n        descriptor = {}\n        if description := field.metadata.get(\"description\"):\n            descriptor[\"description\"] = description\n        if exa := field.metadata.get(\"example\"):\n            descriptor[\"example\"] = exa\n            example[field_id] = exa\n        field_type, req = unwrap_optional_type(field.type)\n        if req:\n            required.append(field_id)\n        if field_type is str:\n            descriptor.update({\"type\": \"string\"})\n        elif field_type is int:\n            descriptor.update({\"type\": \"integer\"})\n        elif field_type is float:\n            descriptor.update({\"type\": \"number\", \"format\": \"float\"})\n        elif field_type is bool:\n            descriptor.update({\"type\": \"boolean\"})\n        elif field_type is datetime.datetime:\n            descriptor.update({\"type\": \"string\", \"format\": \"date-time\"})\n        elif field_type is datetime.date:\n            descriptor.update({\"type\": \"string\", \"format\": \"date\"})\n        elif field_type is list:\n            descriptor.update({\"type\": \"array\"})\n        elif field_type is dict:\n            descriptor.update({\"type\": \"object\"})\n        elif dataclasses.is_dataclass(field_type):\n            nested_schema, nested_exmple = spec_for_dataclass(field_type)\n            descriptor.update(nested_schema)\n            descriptor[\"example\"] = nested_exmple\n        else:\n            descriptor.update({\"type\": \"string\"})\n        props[field_id] = descriptor\n    schema = {\"type\": \"object\", \"properties\": props, \"required\": required}\n    return schema, example\n"
  },
  {
    "path": "allauth/headless/spec/internal/schema.py",
    "content": "from pathlib import Path\n\nfrom django.urls import reverse\nfrom django.urls.exceptions import Resolver404\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.internal.flows.signup import base_signup_form_class\nfrom allauth.core.internal.urlkit import script_aware_resolve\nfrom allauth.headless import app_settings\nfrom allauth.headless.adapter import get_adapter\nfrom allauth.headless.spec.internal.openapikit import spec_for_dataclass, spec_for_field\n\n\ndef get_schema() -> dict:\n    import yaml\n\n    path = Path(__file__).parent.parent / \"doc/openapi.yaml\"\n    with open(path, \"rb\") as f:\n        spec = yaml.safe_load(f)\n\n    path = Path(__file__).parent.parent / \"doc/description.md\"\n    with open(path, \"rb\") as f:\n        description = f.read().decode(\"utf8\")\n\n    spec[\"info\"][\"description\"] = description\n\n    specify_user(spec)\n    chroot(spec)\n    pin_client(spec)\n    drop_unused_client_parameter(spec)\n    used_tags = drop_unused_paths(spec)\n    drop_unused_tags(spec, used_tags)\n    drop_unused_tag_groups(spec, used_tags)\n    specify_signup_fields(spec)\n    specify_custom_signup_form(spec)\n    return spec\n\n\ndef chroot(spec: dict) -> None:\n    url = reverse(\"headless:openapi_yaml\")\n    root = url.rpartition(\"/\")[0]\n    paths = spec[\"paths\"].items()\n    spec[\"paths\"] = {}\n    for path, path_spec in paths:\n        new_path = path.replace(\"/_allauth\", root)\n        spec[\"paths\"][new_path] = path_spec\n\n\ndef pin_client(spec: dict) -> None:\n    if len(app_settings.CLIENTS) != 1:\n        return\n\n    processed_paths = {}\n    client_value = app_settings.CLIENTS[0]\n    http_methods = [\n        \"get\",\n        \"post\",\n        \"put\",\n        \"delete\",\n        \"options\",\n        \"head\",\n        \"patch\",\n        \"trace\",\n    ]\n\n    def remove_client_param(parameters: list) -> list | None:\n        filtered = [\n            p\n            for p in parameters\n            if not (\n                isinstance(p, dict)\n                and p.get(\"$ref\") == \"#/components/parameters/Client\"\n            )\n        ]\n        return filtered or None\n\n    for path_key, path_item in spec[\"paths\"].items():\n        current_path_item = dict(path_item)\n        processed_path_key = path_key.replace(\"{client}\", client_value)\n\n        if \"parameters\" in current_path_item:\n            new_params = remove_client_param(current_path_item[\"parameters\"])\n            if new_params:\n                current_path_item[\"parameters\"] = new_params\n            else:\n                current_path_item.pop(\"parameters\")\n\n        for method_name in http_methods:\n            if method_name in current_path_item:\n                operation_item = current_path_item[method_name]\n                if isinstance(operation_item, dict) and \"parameters\" in operation_item:\n                    new_params = remove_client_param(operation_item[\"parameters\"])\n                    if new_params:\n                        operation_item[\"parameters\"] = new_params\n                    else:\n                        operation_item.pop(\"parameters\")\n\n        processed_paths[processed_path_key] = current_path_item\n\n    spec[\"paths\"] = processed_paths\n\n\ndef drop_unused_client_parameter(spec: dict) -> None:\n    if len(app_settings.CLIENTS) != 1:\n        return\n\n    if components := spec.get(\"components\"):\n        if parameters := components.get(\"parameters\"):\n            parameters.pop(\"Client\", None)\n\n\ndef drop_unused_paths(spec: dict) -> set:\n    paths = spec[\"paths\"]\n    used_tags = set()\n    for path, path_spec in list(paths.items()):\n        found_path = False\n        for client in app_settings.CLIENTS:\n            try:\n                script_aware_resolve(path.replace(\"{client}\", client))\n                found_path = True\n                break\n            except Resolver404:\n                pass\n        if found_path:\n            for method, method_spec in path_spec.items():\n                used_tags.update(method_spec[\"tags\"])\n        else:\n            paths.pop(path)\n    return used_tags\n\n\ndef drop_unused_tags(spec: dict, used_tags: set) -> None:\n    tags = spec[\"tags\"]\n    spec[\"tags\"] = []\n    for tag in tags:\n        if tag[\"name\"] not in used_tags:\n            continue\n        spec[\"tags\"].append(tag)\n\n\ndef drop_unused_tag_groups(spec: dict, used_tags: set) -> None:\n    tag_groups = spec[\"x-tagGroups\"]\n    spec[\"x-tagGroups\"] = []\n    for tag_group in tag_groups:\n        if any([t in used_tags for t in tag_group[\"tags\"]]):\n            spec[\"x-tagGroups\"].append(tag_group)\n\n\ndef specify_signup_fields(spec: dict) -> None:\n    base_signup = spec[\"components\"][\"schemas\"][\"BaseSignup\"]\n    signup = spec[\"components\"][\"schemas\"][\"Signup\"]\n    properties = base_signup[\"properties\"]\n    required_fields = []\n    for field_name in (\"email\", \"phone\", \"username\"):\n        field = account_settings.SIGNUP_FIELDS.get(field_name)\n        if not field:\n            properties.pop(field_name)\n        elif field[\"required\"]:\n            required_fields.append(field_name)\n    base_signup[\"required\"] = required_fields\n    password_field = account_settings.SIGNUP_FIELDS.get(\"password1\")\n    if not password_field:\n        signup[\"allOf\"] = signup[\"allOf\"][:1]\n    elif not password_field[\"required\"]:\n        signup[\"allOf\"][1][\"required\"].remove(\"password\")\n\n\ndef specify_custom_signup_form(spec: dict) -> None:\n    form_class = base_signup_form_class()\n    base_signup = spec[\"components\"][\"schemas\"][\"BaseSignup\"]\n    for field_name, field in form_class.base_fields.items():\n        is_required = hasattr(field, \"required\") and field.required\n        field_spec = spec_for_field(field)\n        if is_required:\n            base_signup[\"required\"].append(field_name)\n        base_signup[\"properties\"][field_name] = field_spec\n\n\ndef specify_user(spec: dict) -> None:\n    dc = get_adapter().get_user_dataclass()\n    schema, example = spec_for_dataclass(dc)\n    spec[\"components\"][\"schemas\"][\"User\"] = schema\n    example_value = spec[\"components\"][\"examples\"][\"User\"][\"value\"]\n    example_value.clear()\n    example_value.update(example)\n"
  },
  {
    "path": "allauth/headless/spec/urls.py",
    "content": "from django.urls import path\n\nfrom allauth.headless import app_settings\nfrom allauth.headless.spec import views\n\n\nurlpatterns = [\n    path(\"openapi.yaml\", views.OpenAPIYAMLView.as_view(), name=\"openapi_yaml\"),\n    path(\"openapi.json\", views.OpenAPIJSONView.as_view(), name=\"openapi_json\"),\n]\n\nif app_settings.SERVE_SPECIFICATION and app_settings.SPECIFICATION_TEMPLATE_NAME:\n    urlpatterns.append(\n        path(\n            \"openapi.html\",\n            views.OpenAPIHTMLView.as_view(),\n            name=\"openapi_html\",\n        ),\n    )\n"
  },
  {
    "path": "allauth/headless/spec/views.py",
    "content": "import json\n\nfrom django.http import HttpResponse\nfrom django.utils.decorators import method_decorator\nfrom django.views.generic import TemplateView, View\n\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.headless import app_settings\nfrom allauth.headless.spec.internal.schema import get_schema\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass OpenAPIYAMLView(View):\n    def get(self, request) -> HttpResponse:\n        import yaml\n\n        spec = get_schema()\n        content = yaml.dump(spec, Dumper=yaml.Dumper)\n        return HttpResponse(\n            content,\n            content_type=\"application/vnd.oai.openapi\",\n            headers={\"Content-Disposition\": \"inline; filename=allauth-openapi.yaml\"},\n        )\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass OpenAPIJSONView(View):\n    def get(self, request) -> HttpResponse:\n        spec = get_schema()\n        content = json.dumps(spec)\n        return HttpResponse(\n            content,\n            content_type=\"application/vnd.oai.openapi+json\",\n            headers={\"Content-Disposition\": \"inline; filename=allauth-openapi.json\"},\n        )\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass OpenAPIHTMLView(TemplateView):\n    def get_template_names(self) -> list[str]:\n        return [app_settings.SPECIFICATION_TEMPLATE_NAME]\n"
  },
  {
    "path": "allauth/headless/templates/headless/spec/redoc_cdn.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta name=\"viewport\"\n              content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n        <title>allauth.headless OpenAPI Specification | django-allauth</title>\n    </head>\n    <body>\n        <redoc spec-url=\"{% url 'headless:openapi_json' %}\"></redoc>\n        <script crossorigin=\"anonymous\"\n                integrity=\"sha384-70P5pmIdaQdVbxvjhrcTDv1uKcKqalZ3OHi7S2J+uzDl0PW8dO6L+pHOpm9EEjGJ\"\n                src=\"//cdn.jsdelivr.net/npm/redoc@2.5.2/bundles/redoc.standalone.js\"></script>\n    </body>\n</html>\n"
  },
  {
    "path": "allauth/headless/templates/headless/spec/swagger_cdn.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <link type=\"text/css\"\n              rel=\"stylesheet\"\n              href=\"https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css\">\n        <title>allauth.headless OpenAPI Specification | django-allauth</title>\n    </head>\n    <body>\n        <div id=\"swagger-ui\"></div>\n        <script crossorigin=\"anonymous\"\n                integrity=\"sha384-9CJCDqW5gKboEGedI4f6FbRtGJUQDktyO4ALxunoU7Zh2AaMp93UH1iVtC0SzT9/\"\n                src=\"//cdn.jsdelivr.net/npm/swagger-ui-dist@5.30.0/swagger-ui-bundle.js\"></script>\n        <script>\n        const config = {\n            url: \"{% url 'headless:openapi_json' %}\",\n            dom_id: \"#swagger-ui\",\n            presets: [\n                SwaggerUIBundle.presets.apis,\n                SwaggerUIBundle.SwaggerUIStandalonePreset\n            ],\n            requestInterceptor: (req) => {\n                req.headers['X-CSRFToken'] = \"{{csrf_token}}\";\n                return req;\n            },\n        };\n        const ui = SwaggerUIBundle(config);\n        </script>\n    </body>\n</html>\n"
  },
  {
    "path": "allauth/headless/tokens/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/headless/tokens/base.py",
    "content": "import warnings\n\nfrom allauth.headless.tokens.strategies.base import AbstractTokenStrategy\n\n\n__all__ = [\"AbstractTokenStrategy\"]\n\nwarnings.warn(\n    \"allauth.headless.tokens.base.AbstractTokenStrategy is deprecated, use allauth.headless.tokens.strategies.base.AbstractTokenStrategy\"\n)\n"
  },
  {
    "path": "allauth/headless/tokens/inputs.py",
    "content": "from allauth.headless.internal.restkit import inputs\n\n\nclass RefreshTokenInput(inputs.Input):\n    refresh_token = inputs.CharField()\n"
  },
  {
    "path": "allauth/headless/tokens/response.py",
    "content": "from django.http import HttpRequest\n\nfrom allauth.headless.base.response import APIResponse\n\n\nclass RefreshTokenResponse(APIResponse):\n    def __init__(\n        self, request: HttpRequest, access_token: str, refresh_token: str | None\n    ):\n        data = {\"access_token\": access_token}\n        if refresh_token:\n            data[\"refresh_token\"] = refresh_token\n        super().__init__(request, data=data)\n"
  },
  {
    "path": "allauth/headless/tokens/sessions.py",
    "content": "import warnings\n\nfrom allauth.headless.tokens.strategies.sessions import SessionTokenStrategy\n\n\n__all__ = [\"SessionTokenStrategy\"]\n\nwarnings.warn(\n    \"allauth.headless.tokens.sessions.SessionTokenStrategy is deprecated, use allauth.headless.tokens.strategies.sessions.SessionTokenStrategy\"\n)\n"
  },
  {
    "path": "allauth/headless/tokens/strategies/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/headless/tokens/strategies/base.py",
    "content": "import abc\nfrom typing import Any\n\nfrom django.contrib.sessions.backends.base import SessionBase\nfrom django.http import HttpRequest\n\n\nclass AbstractTokenStrategy(abc.ABC):\n    def get_session_token(self, request: HttpRequest) -> str | None:\n        \"\"\"\n        Returns the session token, if any.\n        \"\"\"\n        token = request.headers.get(\"x-session-token\")\n        return token\n\n    def create_access_token_payload(\n        self, request: HttpRequest\n    ) -> dict[str, Any] | None:\n        \"\"\"\n        After authenticating, this method is called to create the access\n        token response payload, exposing the access token and possibly other\n        information such as a ``refresh_token`` and ``expires_in``.\n        \"\"\"\n        at = self.create_access_token(request)\n        if not at:\n            return None\n        return {\"access_token\": at}\n\n    def create_access_token(self, request: HttpRequest) -> str | None:\n        \"\"\"Create an access token.\n\n        While session tokens are required to handle the authentication process,\n        depending on your requirements, a different type of token may be needed\n        once authenticated.\n\n        For example, your app likely needs access to other APIs as well. These\n        APIs may even be implemented using different technologies, in which case\n        having a stateless token, possibly a JWT encoding the user ID, might be\n        a good fit.\n\n        We make no assumptions in this regard. If you need access tokens, you\n        will have to implement a token strategy that returns an access token\n        here.\n        \"\"\"\n        return None\n\n    @abc.abstractmethod\n    def create_session_token(self, request: HttpRequest) -> str:\n        \"\"\"\n        Create a session token for the `request.session`.\n        \"\"\"\n        ...\n\n    @abc.abstractmethod\n    def lookup_session(self, session_token: str) -> SessionBase | None:\n        \"\"\"\n        Looks up the Django session given the session token. Returns `None`\n        if the session does not / no longer exist.\n        \"\"\"\n        ...\n\n    def refresh_token(self, refresh_token: str) -> tuple[str, str] | None:\n        \"\"\"\n        Validates the given refresh token, and if valid, returns a new\n        access token and refresh token pair.\n        \"\"\"\n        return None\n"
  },
  {
    "path": "allauth/headless/tokens/strategies/jwt/__init__.py",
    "content": "from allauth.headless.tokens.strategies.jwt.strategy import JWTTokenStrategy\n\n\n__all__ = [\"JWTTokenStrategy\"]\n"
  },
  {
    "path": "allauth/headless/tokens/strategies/jwt/internal.py",
    "content": "import base64\nimport binascii\nimport hashlib\nimport secrets\nimport time\nimport uuid\nfrom dataclasses import dataclass\nfrom typing import Any\n\nfrom django.conf import settings\nfrom django.contrib.auth import get_user_model\nfrom django.contrib.sessions.backends.base import SessionBase\nfrom django.utils.functional import SimpleLazyObject\n\nimport jwt\nfrom cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\n\nfrom allauth.account.internal.userkit import str_to_user_id, user_id_to_str\nfrom allauth.core.internal import jwkkit\nfrom allauth.core.internal.sessionkit import get_session_user\nfrom allauth.headless import app_settings\nfrom allauth.headless.internal.sessionkit import lookup_session\n\n\n@dataclass\nclass JWTConfig:\n    signing_key: Any\n    verifying_key: Any\n    algorithm: str\n    jwk_dict: dict[str, Any] | None = None\n\n\ndef validate_access_token(token: str) -> tuple[Any, dict[str, Any]] | None:\n    payload = decode_token(token, \"access\")\n    if payload is None:\n        return None\n    if app_settings.JWT_STATEFUL_VALIDATION_ENABLED:\n        session = get_token_session(payload)\n        if session is None:\n            return None\n    sub = payload[\"sub\"]\n    pk = str_to_user_id(sub)\n    lazy_user = SimpleLazyObject(lambda: get_user_model().objects.get(pk=pk))\n    return lazy_user, payload\n\n\ndef get_session_key_cipher(initialization_vector: bytes) -> Cipher:\n    secret_key = settings.SECRET_KEY\n    key = hashlib.sha256(secret_key.encode()).digest()\n    algorithm = algorithms.AES(key)\n    mode = modes.CTR(initialization_vector)\n    cipher = Cipher(algorithm, mode)\n    return cipher\n\n\ndef session_key_to_sid(session_key: str) -> str:\n    \"\"\"\n    In case an access token leaks, we do not want the session encoded in\n    that token to be put to use as an X-Session-Token or session\n    cookie. Therefore, we encrypt the sesison key. Unauthenticated symmetric\n    encryption is fine, as the JWT is signed.\n    \"\"\"\n    initialization_vector = secrets.token_bytes(16)\n    cipher = get_session_key_cipher(initialization_vector)\n    encryptor = cipher.encryptor()\n    encrypted_message = encryptor.update(session_key.encode()) + encryptor.finalize()\n    sid = base64.b64encode(initialization_vector + encrypted_message).decode()\n    return sid\n\n\ndef session_key_from_sid(sid: str) -> str | None:\n    try:\n        encrypted_data = base64.b64decode(sid)\n    except binascii.Error:\n        return None\n    initialization_vector = encrypted_data[:16]\n    encrypted_message = encrypted_data[16:]\n    if len(encrypted_message) == 0:\n        return None\n    cipher = get_session_key_cipher(initialization_vector)\n    decryptor = cipher.decryptor()\n    message_decrypted = decryptor.update(encrypted_message) + decryptor.finalize()\n    try:\n        return message_decrypted.decode()\n    except UnicodeDecodeError:\n        return None\n\n\ndef validate_token_user(token: dict[str, Any], session: SessionBase):\n    user = get_session_user(session)\n    if user is None:\n        return None\n    sub = user_id_to_str(user)\n    if sub != token[\"sub\"]:\n        return None\n    return user\n\n\ndef validate_refresh_token(\n    token: str,\n) -> tuple[Any, SessionBase, dict[str, Any]] | None:\n    payload = decode_token(token, \"refresh\")\n    if payload is None:\n        return None\n    jti = payload[\"jti\"]\n    session = get_token_session(payload)\n    if session is None:\n        return None\n    refresh_token_jti_to_exp = get_refresh_token_state(session)\n    exp = refresh_token_jti_to_exp.get(jti)\n    now = time.time()\n    if exp is None or exp <= now:\n        return None\n    user = validate_token_user(payload, session)\n    return user, session, payload\n\n\ndef get_token_session(payload: dict[str, Any]) -> SessionBase | None:\n    sid = payload.get(\"sid\")\n    if not isinstance(sid, str):\n        return None\n    session_key = session_key_from_sid(sid)\n    if not session_key:\n        return None\n    session = lookup_session(session_key)\n    if session is None:\n        return None\n    return session\n\n\ndef _get_jwt_config() -> JWTConfig:\n    algorithm = app_settings.JWT_ALGORITHM\n    jwk_dict = None\n    if algorithm.startswith(\"HS\"):\n        key = app_settings.JWT_PRIVATE_KEY or settings.SECRET_KEY\n        signing_key = key\n        verifying_key = key\n    elif algorithm.startswith(\"RS\"):\n        jwk_dict, signing_key = jwkkit.load_jwk_from_pem(app_settings.JWT_PRIVATE_KEY)\n        verifying_key = signing_key.public_key()\n    else:\n        raise ValueError(f\"Unsupported JWT algorithm: {algorithm}\")\n    return JWTConfig(\n        signing_key=signing_key,\n        verifying_key=verifying_key,\n        algorithm=algorithm,\n        jwk_dict=jwk_dict,\n    )\n\n\ndef get_jwt_headers(config: JWTConfig) -> dict[str, Any]:\n    headers = {}\n    if config.jwk_dict:\n        kid = config.jwk_dict.get(\"kid\")\n        if kid:\n            headers[\"kid\"] = kid\n    return headers\n\n\ndef decode_token(token: str, use: str) -> dict[str, Any] | None:\n    config = _get_jwt_config()\n    try:\n        payload = jwt.decode(\n            token,\n            key=config.verifying_key,\n            algorithms=[config.algorithm],\n            options={\n                \"verify_signature\": True,\n                \"verify_iss\": False,\n                \"verify_aud\": False,\n                \"verify_exp\": True,\n            },\n        )\n    except jwt.PyJWTError:\n        return None\n    else:\n        if payload.get(\"token_use\") != use:\n            return None\n        for key in (\"jti\", \"sub\", \"sid\"):\n            value = payload.get(key)\n            if not isinstance(value, str):\n                return None\n        return payload\n\n\ndef create_token(\n    token_use: str,\n    *,\n    sub: str,\n    sid: str,\n    claims: dict[str, Any] | None = None,\n    expires_in: int,\n) -> tuple[str, dict[str, Any]]:\n    config = _get_jwt_config()\n    now = int(time.time())\n    payload = {}\n    if claims is not None:\n        payload.update(claims)\n    payload.update(\n        {\n            \"iat\": now,\n            \"exp\": now + expires_in,\n            \"sid\": sid,\n            \"jti\": str(uuid.uuid4()),\n            \"token_use\": token_use,\n            \"sub\": sub,\n        }\n    )\n    headers = get_jwt_headers(config)\n    return (\n        jwt.encode(\n            payload,\n            config.signing_key,\n            algorithm=config.algorithm,\n            headers=headers,\n        ),\n        payload,\n    )\n\n\ndef get_refresh_token_state(session: SessionBase) -> dict[str, int]:\n    return session.setdefault(\"headless_refresh_tokens\", {})\n\n\ndef create_refresh_token(user, session: SessionBase) -> str:\n    assert user.is_authenticated  # nosec\n    assert session.session_key  # nosec\n    sub = user_id_to_str(user)\n    sid = session_key_to_sid(session.session_key)\n    token, payload = create_token(\n        \"refresh\",\n        sub=sub,\n        sid=sid,\n        expires_in=app_settings.JWT_REFRESH_TOKEN_EXPIRES_IN,\n    )\n    refresh_token_jti_to_exp = get_refresh_token_state(session)\n    refresh_token_jti_to_exp[payload[\"jti\"]] = payload[\"exp\"]\n    return token\n\n\ndef create_access_token(user, session: SessionBase, claims: dict[str, Any]) -> str:\n    assert user.is_authenticated  # nosec\n    assert session.session_key  # nosec\n    sid = session_key_to_sid(session.session_key)\n    sub = user_id_to_str(user)\n    return create_token(\n        \"access\",\n        sub=sub,\n        sid=sid,\n        claims=claims,\n        expires_in=app_settings.JWT_ACCESS_TOKEN_EXPIRES_IN,\n    )[0]\n\n\ndef invalidate_refresh_token(session: SessionBase, token: dict[str, Any]) -> None:\n    refresh_token_jti_to_exp = get_refresh_token_state(session)\n    jti = token[\"jti\"]\n    refresh_token_jti_to_exp.pop(jti, None)\n"
  },
  {
    "path": "allauth/headless/tokens/strategies/jwt/strategy.py",
    "content": "from typing import Any\n\nfrom django.contrib.sessions.backends.base import SessionBase\nfrom django.http import HttpRequest\n\nfrom allauth.core.internal.httpkit import get_authorization_credential\nfrom allauth.headless import app_settings\nfrom allauth.headless.internal import sessionkit\nfrom allauth.headless.tokens.strategies.base import AbstractTokenStrategy\nfrom allauth.headless.tokens.strategies.jwt import internal\n\n\nclass JWTTokenStrategy(AbstractTokenStrategy):\n    def get_session_token(self, request: HttpRequest) -> str | None:\n        ret = super().get_session_token(request)\n        if ret:\n            return ret\n        payload = self._get_access_token(request)\n        if not payload:\n            return None\n        return internal.session_key_from_sid(payload[\"sid\"])\n\n    def _get_access_token(self, request: HttpRequest):\n        access_token = get_authorization_credential(\n            request, app_settings.JWT_AUTHORIZATION_HEADER_SCHEME\n        )\n        if access_token is None:\n            return None\n        user_payload = internal.validate_access_token(access_token)\n        if user_payload is None:\n            return None\n        return user_payload[1]\n\n    def create_session_token(self, request: HttpRequest) -> str:\n        if not request.session.session_key:\n            request.session.save()\n        key = request.session.session_key\n        # We did save\n        assert isinstance(key, str)  # nosec\n        return key\n\n    def create_access_token_payload(\n        self, request: HttpRequest\n    ) -> dict[str, Any] | None:\n        ret = super().create_access_token_payload(request)\n        if ret is not None:\n            ret[\"refresh_token\"] = internal.create_refresh_token(\n                request.user, request.session\n            )\n        return ret\n\n    def lookup_session(self, session_token: str) -> SessionBase | None:\n        return sessionkit.lookup_session(session_token)\n\n    def create_access_token(self, request: HttpRequest) -> str | None:\n        claims = self.get_claims(request.user)\n        return internal.create_access_token(request.user, request.session, claims)\n\n    def get_claims(self, user) -> dict[str, Any]:\n        \"\"\"\n        Returns additional claims to be included in the access token.  Note that\n        the following claims are reserved and will be automatically set by allauth regardless of what you return:\n         - ``iat``\n         - ``exp``\n         - ``sid``\n         - ``jti``\n         - ``token_use``\n         - ``sub``\n        \"\"\"\n        return {}\n\n    def refresh_token(self, refresh_token: str) -> tuple[str, str] | None:\n        user_session_payload = internal.validate_refresh_token(refresh_token)\n        if user_session_payload is None:\n            return None\n        user, session, payload = user_session_payload\n        access_token = internal.create_access_token(\n            user, session, self.get_claims(user)\n        )\n        if app_settings.JWT_ROTATE_REFRESH_TOKEN:\n            internal.invalidate_refresh_token(session, payload)\n            next_refresh_token = internal.create_refresh_token(user, session)\n        else:\n            next_refresh_token = refresh_token\n        session.save()\n        return access_token, next_refresh_token\n"
  },
  {
    "path": "allauth/headless/tokens/strategies/sessions.py",
    "content": "from django.contrib.sessions.backends.base import SessionBase\nfrom django.http import HttpRequest\n\nfrom allauth.headless.internal import sessionkit\nfrom allauth.headless.tokens.strategies.base import AbstractTokenStrategy\n\n\nclass SessionTokenStrategy(AbstractTokenStrategy):\n    def create_session_token(self, request: HttpRequest) -> str:\n        if not request.session.session_key:\n            request.session.save()\n        key = request.session.session_key\n        # We did save\n        assert isinstance(key, str)  # nosec\n        return key\n\n    def lookup_session(self, session_token: str) -> SessionBase | None:\n        session_key = session_token\n        if sessionkit.session_store().exists(session_key):\n            return sessionkit.session_store(session_key)\n        return None\n"
  },
  {
    "path": "allauth/headless/tokens/urls.py",
    "content": "from django.urls import path\n\nfrom allauth.headless.tokens import views\n\n\ndef build_urlpatterns(client):\n    return [\n        path(\n            \"tokens/refresh\",\n            views.RefreshTokenView.as_api_view(client=client),\n            name=\"refresh\",\n        ),\n    ]\n"
  },
  {
    "path": "allauth/headless/tokens/views.py",
    "content": "from django.http import HttpRequest\n\nfrom allauth.headless import app_settings\nfrom allauth.headless.base.views import APIView\nfrom allauth.headless.internal.restkit.response import ErrorResponse\nfrom allauth.headless.tokens.inputs import RefreshTokenInput\nfrom allauth.headless.tokens.response import RefreshTokenResponse\nfrom allauth.headless.tokens.strategies.base import AbstractTokenStrategy\n\n\nclass RefreshTokenView(APIView):\n    input_class = RefreshTokenInput\n\n    def post(self, request: HttpRequest):\n        refresh_token = self.input.cleaned_data[\"refresh_token\"]\n        strategy: AbstractTokenStrategy = app_settings.TOKEN_STRATEGY\n        at_rt = strategy.refresh_token(refresh_token)\n        if at_rt is None:\n            return ErrorResponse(request)\n\n        next_refresh_token: str | None\n        access_token, next_refresh_token = at_rt\n        if next_refresh_token == refresh_token:\n            next_refresh_token = None\n        return RefreshTokenResponse(request, access_token, next_refresh_token)\n"
  },
  {
    "path": "allauth/headless/urls.py",
    "content": "from django.urls import include, path\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.headless import app_settings\nfrom allauth.headless.account import urls as account_urls\nfrom allauth.headless.base import urls as base_urls\nfrom allauth.headless.constants import Client\nfrom allauth.headless.tokens import urls as tokens_urls\n\n\ndef build_urlpatterns(client):\n    patterns = []\n    patterns.extend(base_urls.build_urlpatterns(client))\n    patterns.append(\n        path(\n            \"\",\n            include(\n                (account_urls.build_urlpatterns(client), \"headless\"),\n                namespace=\"account\",\n            ),\n        )\n    )\n    if allauth_settings.SOCIALACCOUNT_ENABLED:\n        from allauth.headless.socialaccount import urls as socialaccount_urls\n\n        patterns.append(\n            path(\n                \"\",\n                include(\n                    (socialaccount_urls.build_urlpatterns(client), \"headless\"),\n                    namespace=\"socialaccount\",\n                ),\n            )\n        )\n\n    if allauth_settings.MFA_ENABLED:\n        from allauth.headless.mfa import urls as mfa_urls\n\n        patterns.append(\n            path(\n                \"\",\n                include(\n                    (mfa_urls.build_urlpatterns(client), \"headless\"),\n                    namespace=\"mfa\",\n                ),\n            )\n        )\n\n    if allauth_settings.USERSESSIONS_ENABLED:\n        from allauth.headless.usersessions import urls as usersessions_urls\n\n        patterns.append(\n            path(\n                \"\",\n                include(\n                    (usersessions_urls.build_urlpatterns(client), \"headless\"),\n                    namespace=\"usersessions\",\n                ),\n            )\n        )\n\n    if client == Client.APP:\n        patterns.append(\n            path(\n                \"\",\n                include(\n                    (tokens_urls.build_urlpatterns(client), \"headless\"),\n                    namespace=\"tokens\",\n                ),\n            )\n        )\n\n    return [path(\"v1/\", include(patterns))]\n\n\napp_name = \"headless\"\nurlpatterns = []\nif Client.BROWSER in app_settings.CLIENTS:\n    urlpatterns.append(\n        path(\n            \"browser/\",\n            include(\n                (build_urlpatterns(Client.BROWSER), \"headless\"),\n                namespace=\"browser\",\n            ),\n        )\n    )\nif Client.APP in app_settings.CLIENTS:\n    urlpatterns.append(\n        path(\n            \"app/\",\n            include((build_urlpatterns(Client.APP), \"headless\"), namespace=\"app\"),\n        )\n    )\n\nif app_settings.SERVE_SPECIFICATION:\n    urlpatterns.append(\n        path(\n            \"\",\n            include(\n                \"allauth.headless.spec.urls\",\n            ),\n        )\n    )\n"
  },
  {
    "path": "allauth/headless/usersessions/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/headless/usersessions/inputs.py",
    "content": "from allauth.headless.internal.restkit import inputs\nfrom allauth.usersessions.models import UserSession\n\n\nclass SelectSessionsInput(inputs.Input):\n    sessions = inputs.ModelMultipleChoiceField(queryset=UserSession.objects.none())\n\n    def __init__(self, *args, **kwargs):\n        self.user = kwargs.pop(\"user\")\n        super().__init__(*args, **kwargs)\n        self.fields[\"sessions\"].queryset = UserSession.objects.filter(user=self.user)\n"
  },
  {
    "path": "allauth/headless/usersessions/response.py",
    "content": "from allauth.headless.base.response import APIResponse\nfrom allauth.usersessions import app_settings\n\n\nclass SessionsResponse(APIResponse):\n    def __init__(self, request, sessions):\n        super().__init__(request, data=[self._session_data(s) for s in sessions])\n\n    def _session_data(self, session) -> dict:\n        data = {\n            \"user_agent\": session.user_agent,\n            \"ip\": session.ip,\n            \"created_at\": session.created_at.timestamp(),\n            \"is_current\": session.is_current(),\n            \"id\": session.pk,\n        }\n        if app_settings.TRACK_ACTIVITY:\n            data[\"last_seen_at\"] = session.last_seen_at.timestamp()\n        return data\n\n\ndef get_config_data(request) -> dict:\n    data = {\"usersessions\": {\"track_activity\": app_settings.TRACK_ACTIVITY}}\n    return data\n"
  },
  {
    "path": "allauth/headless/usersessions/urls.py",
    "content": "from django.urls import include, path\n\nfrom allauth.headless.usersessions import views\n\n\ndef build_urlpatterns(client):\n    return [\n        path(\n            \"auth/\",\n            include(\n                [\n                    path(\n                        \"sessions\",\n                        views.SessionsView.as_api_view(client=client),\n                        name=\"sessions\",\n                    ),\n                ]\n            ),\n        )\n    ]\n"
  },
  {
    "path": "allauth/headless/usersessions/views.py",
    "content": "from django.http import HttpResponse\n\nfrom allauth.headless.base.response import AuthenticationResponse\nfrom allauth.headless.base.views import AuthenticatedAPIView\nfrom allauth.headless.usersessions.inputs import SelectSessionsInput\nfrom allauth.headless.usersessions.response import SessionsResponse\nfrom allauth.usersessions.internal import flows\nfrom allauth.usersessions.models import UserSession\n\n\nclass SessionsView(AuthenticatedAPIView):\n    input_class = {\"DELETE\": SelectSessionsInput}\n\n    def delete(self, request, *args, **kwargs):\n        sessions = self.input.cleaned_data[\"sessions\"]\n        flows.sessions.end_sessions(request, sessions)\n        if self.request.user.is_authenticated:\n            return self._respond_session_list()\n        return AuthenticationResponse(request)\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        return self._respond_session_list()\n\n    def _respond_session_list(self):\n        sessions = UserSession.objects.purge_and_list(self.request.user)\n        return SessionsResponse(self.request, sessions)\n\n    def get_input_kwargs(self) -> dict:\n        return {\"user\": self.request.user}\n"
  },
  {
    "path": "allauth/idp/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/idp/oidc/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/idp/oidc/adapter.py",
    "content": "import hashlib\nimport uuid\nfrom collections.abc import Iterable\nfrom typing import Any, Literal\n\nfrom django.contrib.auth import get_user_model\nfrom django.core.management.utils import get_random_secret_key\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth.account.internal.userkit import (\n    str_to_user_id,\n    user_id_to_str,\n    user_username,\n)\nfrom allauth.account.models import EmailAddress\nfrom allauth.core.internal.adapter import BaseAdapter\nfrom allauth.core.internal.cryptokit import generate_user_code\nfrom allauth.idp.oidc import app_settings\nfrom allauth.utils import import_attribute\n\n\nclass DefaultOIDCAdapter(BaseAdapter):\n    \"\"\"The adapter class allows you to override various functionality of the\n    ``allauth.idp.oidc`` app.  To do so, point ``settings.IDP_OIDC_ADAPTER`` to\n    your own class that derives from ``DefaultOIDCAdapter`` and override the\n    behavior by altering the implementation of the methods according to your own\n    needs.\n    \"\"\"\n\n    scope_display = {\n        \"openid\": _(\"View your user ID\"),\n        \"email\": _(\"View your email address\"),\n        \"profile\": _(\"View your basic profile information\"),\n    }\n\n    def generate_client_id(self) -> str:\n        \"\"\"\n        The client ID to use for newly created clients.\n        \"\"\"\n        return uuid.uuid4().hex\n\n    def generate_client_secret(self) -> str:\n        \"\"\"\n        The client secret to use for newly created clients.\n        \"\"\"\n        return get_random_secret_key()\n\n    def generate_user_code(self) -> str:\n        return generate_user_code(**app_settings.USER_CODE_FORMAT)\n\n    def hash_token(self, token: str) -> str:\n        \"\"\"\n        We don't store tokens directly, only the hash of the token. This methods generates\n        that hash.\n        \"\"\"\n        return hashlib.sha256(token.encode(\"utf-8\")).hexdigest()\n\n    def get_issuer(self) -> str:\n        \"\"\"\n        Returns the URL of the issuer.\n        \"\"\"\n        return self.request.build_absolute_uri(\"/\").rstrip(\"/\")\n\n    def populate_id_token(\n        self, id_token: dict, client, scopes: Iterable[str], **kwargs\n    ) -> None:\n        \"\"\"\n        This method can be used to alter the ID token payload. It is already populated\n        with basic values. Depending on the client and requested scopes, you can\n        expose additional information here.\n        \"\"\"\n        pass\n\n    def populate_access_token(\n        self, access_token: dict, *, client, scopes: Iterable[str], user, **kwargs\n    ) -> None:\n        \"\"\"\n        This method can be used to alter the JWT access token payload. It is already\n        populated with basic values.\n        \"\"\"\n        pass\n\n    def get_claims(\n        self,\n        purpose: Literal[\"id_token\", \"userinfo\"],\n        user,\n        client,\n        scopes: Iterable[str],\n        email: str | None = None,\n        **kwargs,\n    ) -> dict[str, Any]:\n        \"\"\"\n        Return the claims to be included in the ID token or userinfo response.\n        \"\"\"\n        claims = {\"sub\": self.get_user_sub(client, user)}\n        if \"email\" in scopes:\n            if email:\n                try:\n                    address = EmailAddress.objects.get_for_user(user, email)\n                except EmailAddress.DoesNotExist:\n                    pass\n            else:\n                address = EmailAddress.objects.get_primary(user)\n            if address:\n                claims.update(\n                    {\n                        \"email\": address.email,\n                        \"email_verified\": address.verified,\n                    }\n                )\n        if \"profile\" in scopes:\n            full_name = user.get_full_name()\n            last_name = getattr(user, \"last_name\", None)\n            first_name = getattr(user, \"first_name\", None)\n            username = user_username(user)\n            profile_claims = {\n                \"name\": full_name,\n                \"given_name\": first_name,\n                \"family_name\": last_name,\n                \"preferred_username\": username,\n            }\n            for claim_key, claim_value in profile_claims.items():\n                if claim_value:\n                    claims[claim_key] = claim_value\n        return claims\n\n    def get_user_sub(self, client, user) -> str:\n        \"\"\"\n        Returns the \"sub\" (subject identifier) for the given user.\n        \"\"\"\n        return user_id_to_str(user)\n\n    def get_user_by_sub(self, client, sub: str):\n        \"\"\"\n        Looks up a user, given its subject identifier. Returns `None` if no\n        such user was found.\n        \"\"\"\n        try:\n            pk = str_to_user_id(sub)\n        except ValueError:\n            return None\n        user = get_user_model().objects.filter(pk=pk).first()\n        if not user or not user.is_active:\n            return None\n        return user\n\n\ndef get_adapter() -> DefaultOIDCAdapter:\n    return import_attribute(app_settings.ADAPTER)()\n"
  },
  {
    "path": "allauth/idp/oidc/admin.py",
    "content": "from django.contrib import admin, messages\nfrom django.utils.html import escape\nfrom django.utils.safestring import mark_safe\n\nfrom allauth.idp.oidc.adapter import get_adapter\nfrom allauth.idp.oidc.models import Client, Token\n\n\n@admin.register(Client)\nclass ClientAdmin(admin.ModelAdmin):\n    raw_id_fields = (\"owner\",)\n    list_display = (\n        \"name\",\n        \"id\",\n        \"type\",\n        \"owner\",\n        \"skip_consent\",\n        \"allow_uri_wildcards\",\n        \"created_at\",\n    )\n    readonly_fields = (\"secret\", \"created_at\")\n    list_filter = (\"type\", \"skip_consent\", \"allow_uri_wildcards\")\n\n    def save_model(self, request, obj, form, change):\n        if not change:\n            adapter = get_adapter()\n            secret = adapter.generate_client_secret()\n            obj.set_secret(secret)\n            self.message_user(\n                request,\n                mark_safe(\n                    f'The client secret is only shown once: <input readonly size=\"{len(secret)}\" type=\"text\" value=\"{escape(secret)}\">'\n                ),  # nosec\n                level=messages.WARNING,\n            )\n        return super().save_model(request, obj, form, change)\n\n\n@admin.register(Token)\nclass TokenAdmin(admin.ModelAdmin):\n    raw_id_fields = (\"client\", \"user\")\n    list_display = (\n        \"client\",\n        \"type\",\n        \"user\",\n        \"created_at\",\n        \"expires_at\",\n    )\n    list_filter = (\"type\",)\n"
  },
  {
    "path": "allauth/idp/oidc/app_settings.py",
    "content": "from allauth import app_settings as allauth_settings\nfrom allauth.core.internal.cryptokit import UserCodeFormat\n\n\nclass AppSettings:\n    def __init__(self, prefix: str) -> None:\n        self.prefix = prefix\n\n    def _setting(self, name: str, dflt):\n        from allauth.utils import get_setting\n\n        return get_setting(f\"{self.prefix}{name}\", dflt)\n\n    @property\n    def ADAPTER(self) -> str:\n        return self._setting(\n            \"ADAPTER\",\n            \"allauth.idp.oidc.adapter.DefaultOIDCAdapter\",\n        )\n\n    @property\n    def ID_TOKEN_EXPIRES_IN(self) -> int:\n        return 5 * 60\n\n    @property\n    def PRIVATE_KEY(self) -> str:\n        return self._setting(\"PRIVATE_KEY\", \"\")\n\n    @property\n    def ACCESS_TOKEN_EXPIRES_IN(self) -> int:\n        return self._setting(\"ACCESS_TOKEN_EXPIRES_IN\", 3600)\n\n    @property\n    def ACCESS_TOKEN_FORMAT(self) -> str:\n        return self._setting(\"ACCESS_TOKEN_FORMAT\", \"opaque\")\n\n    @property\n    def AUTHORIZATION_CODE_EXPIRES_IN(self) -> int:\n        return self._setting(\"AUTHORIZATION_CODE_EXPIRES_IN\", 60)\n\n    @property\n    def ROTATE_REFRESH_TOKEN(self) -> bool:\n        return self._setting(\"ROTATE_REFRESH_TOKEN\", True)\n\n    @property\n    def DEVICE_CODE_EXPIRES_IN(self) -> int:\n        return self._setting(\"DEVICE_CODE_EXPIRES_IN\", 300)\n\n    @property\n    def DEVICE_CODE_INTERVAL(self) -> int:\n        return self._setting(\"DEVICE_CODE_INTERVAL\", 5)\n\n    @property\n    def USER_CODE_FORMAT(self) -> UserCodeFormat:\n        return self._setting(\"USER_CODE_FORMAT\", allauth_settings.USER_CODE_FORMAT)\n\n    @property\n    def RATE_LIMITS(self) -> dict:\n        rls = self._setting(\"RATE_LIMITS\", {})\n        if rls is False:\n            return {}\n        ret = {\n            # OIDC device user code checks\n            \"device_user_code\": \"5/m/ip\"\n        }\n        ret.update(rls)\n        return ret\n\n    @property\n    def RP_INITIATED_LOGOUT_ASKS_FOR_OP_LOGOUT(self) -> bool:\n        \"\"\"\n        At https://openid.net/specs/openid-connect-rpinitiated-1_0.html\n\n        > 2. RP-Initiated Logout':\n        > At the Logout Endpoint, the OP SHOULD ask the End-User whether to\n        > log out of the OP as well.\n\n        This setting controls whether the OP always asks.\n        \"\"\"\n        return self._setting(\"RP_INITIATED_LOGOUT_ASKS_FOR_OP_LOGOUT\", True)\n\n    @property\n    def USERINFO_ENDPOINT(self) -> str | None:\n        \"\"\"\n        This setting can be used to point the ``userinfo_endpoint`` value as\n        returned in the \".well-known/openid-configuration\" to a custom URL.\n        Setting this disables the built-in userinfo endpoint.\n        \"\"\"\n        return self._setting(\"USERINFO_ENDPOINT\", None)\n\n\n_app_settings = AppSettings(\"IDP_OIDC_\")\n\n\ndef __getattr__(name):\n    # See https://peps.python.org/pep-0562/\n    return getattr(_app_settings, name)\n"
  },
  {
    "path": "allauth/idp/oidc/apps.py",
    "content": "from django.apps import AppConfig\n\nfrom allauth import app_settings\n\n\nclass OIDCConfig(AppConfig):\n    name = \"allauth.idp.oidc\"\n    label = \"allauth_idp_oidc\"\n    verbose_name = \"OpenID Connect IdP\"\n    default_auto_field = (\n        app_settings.DEFAULT_AUTO_FIELD or \"django.db.models.BigAutoField\"\n    )\n"
  },
  {
    "path": "allauth/idp/oidc/contrib/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/idp/oidc/contrib/ninja/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/idp/oidc/contrib/ninja/security.py",
    "content": "from django.http import HttpRequest\n\nfrom ninja.security.base import AuthBase\n\nfrom allauth.idp.oidc.internal.oauthlib.server import get_server\nfrom allauth.idp.oidc.internal.oauthlib.utils import extract_params\nfrom allauth.idp.oidc.internal.scope import is_scope_granted\n\n\nclass TokenAuth(AuthBase):\n    \"\"\"\n    Use the OIDC access token to authenticate and the scopes attached to the\n    token to authorize the request.\n    \"\"\"\n\n    openapi_type: str = \"apiKey\"\n    scope = None\n\n    def __init__(self, scope: str | list | dict):\n        \"\"\"The scope passed can either be:\n\n        - a single scope (``str``),\n        - a list of scopes, all of which should be granted.\n        - a list of scope lists. Your token should match at least all scopes of one of the scope lists.\n        - A dictionary, with the request method (e.g. ``GET``) as key, and one\n          of the scope values from the previous bullet. The scopes to match are\n          then dynamically selected based on the request.\n        \"\"\"\n        super().__init__()\n        self.scope = scope\n\n    def __call__(self, request: HttpRequest):\n        server = get_server()\n        orequest = extract_params(request)\n        valid, ctx = server.verify_request(*orequest, scopes=[])\n        if not valid:\n            return None\n        if not is_scope_granted(self.scope, ctx.access_token, request.method):\n            return None\n        if ctx.access_token and ctx.access_token.user:\n            request.user = ctx.access_token.user\n        return ctx.access_token\n"
  },
  {
    "path": "allauth/idp/oidc/contrib/rest_framework/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/idp/oidc/contrib/rest_framework/authentication.py",
    "content": "from rest_framework.authentication import BaseAuthentication\n\nfrom allauth.idp.oidc.internal.oauthlib.server import get_server\nfrom allauth.idp.oidc.internal.oauthlib.utils import extract_params\n\n\nclass TokenAuthentication(BaseAuthentication):\n    \"\"\"\n    Use the OIDC access token to authenticate the request.\n    \"\"\"\n\n    def authenticate(self, request):\n        server = get_server()\n        orequest = extract_params(request)\n        valid, ctx = server.verify_request(*orequest, scopes=[])\n        if not valid:\n            return None\n        return ctx.user, ctx.access_token\n"
  },
  {
    "path": "allauth/idp/oidc/contrib/rest_framework/permissions.py",
    "content": "from rest_framework.permissions import BasePermission\n\nfrom allauth.idp.oidc.internal.scope import is_scope_granted\nfrom allauth.idp.oidc.models import Token\n\n\nclass TokenPermission(BasePermission):\n    scope = None\n\n    def has_permission(self, request, view) -> bool:\n        access_token = request.auth\n        if (\n            not isinstance(access_token, Token)\n            or access_token.type != Token.Type.ACCESS_TOKEN\n        ):\n            return False\n        return is_scope_granted(self.scope, access_token, request.method)\n\n    @classmethod\n    def has_scope(cls, scope: str | list | dict):\n        \"\"\"\n        Constructs and returns specific permission **class** (not instance)\n        that checks that the request is authenticated by means of a token (see:\n        ``TokenAuthentication``), and, that this token has the specified\n        ``scope`` granted.\n\n        The scope passed can either be:\n\n        - a single scope (``str``),\n        - a list of scopes, all of which should be granted.\n        - a list of scope lists. Your token should match at least all scopes of one of the scope lists.\n        - A dictionary, with the request method (e.g. ``GET``) as key, and one\n          of the scope values from the previous bullet. The scopes to match are\n          then dynamically selected based on the request.\n\n        \"\"\"\n\n        class TokenHasScopePermission(cls):  # type: ignore[valid-type,misc]\n            def __init__(self, *args, **kwargs):\n                super().__init__(*args, **kwargs)\n                self.scope = scope\n\n        return TokenHasScopePermission\n"
  },
  {
    "path": "allauth/idp/oidc/forms.py",
    "content": "from typing import Any\n\nfrom django import forms\nfrom django.forms import widgets\nfrom django.utils.translation import gettext as _\n\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.models import EmailAddress\nfrom allauth.core import context\nfrom allauth.core.internal import ratelimit\nfrom allauth.idp.oidc import app_settings\nfrom allauth.idp.oidc.adapter import get_adapter\nfrom allauth.idp.oidc.internal.clientkit import clean_post_logout_redirect_uri\nfrom allauth.idp.oidc.internal.oauthlib import device_codes\nfrom allauth.idp.oidc.internal.tokens import decode_jwt_token\nfrom allauth.idp.oidc.models import Client\n\n\nclass AuthorizationForm(forms.Form):\n    request = forms.CharField(widget=widgets.HiddenInput)\n\n    def __init__(self, *args, **kwargs) -> None:\n        user = kwargs.pop(\"user\")\n        requested_scopes = kwargs.pop(\"requested_scopes\")\n        super().__init__(*args, **kwargs)\n        adapter = get_adapter()\n        choices = [(rs, adapter.scope_display.get(rs, rs)) for rs in requested_scopes]\n        choices = sorted(choices, key=lambda ch: ch[1])\n        self.fields[\"scopes\"] = forms.MultipleChoiceField(\n            choices=choices,\n            label=_(\"Grant permissions\"),\n            widget=forms.CheckboxSelectMultiple,\n            initial=requested_scopes,\n            required=True,\n        )\n        emails = list(\n            EmailAddress.objects.filter(user=user, verified=True)\n            .order_by(\"-primary\", \"email\")\n            .values_list(\"email\", flat=True)\n        )\n        if \"email\" in requested_scopes and len(emails) > 1:\n            self.fields[\"email\"] = forms.ChoiceField(\n                label=_(\"Email\"),\n                choices=[(email, email) for email in emails],\n                required=False,\n            )\n\n\nclass ConfirmCodeForm(forms.Form):\n    code = forms.CharField(\n        label=_(\"Code\"),\n        required=True,\n        widget=forms.TextInput(\n            attrs={\"placeholder\": _(\"Code\"), \"autocomplete\": \"one-time-code\"},\n        ),\n    )\n\n    def __init__(self, *args, **kwargs) -> None:\n        self.code = kwargs.pop(\"code\", None)\n        super().__init__(*args, **kwargs)\n\n    def clean_code(self) -> str:\n        code = self.cleaned_data[\"code\"]\n        if not ratelimit.consume(\n            context.request,\n            action=\"device_user_code\",\n            config=app_settings.RATE_LIMITS,\n            limit_get=True,\n        ):\n            raise get_account_adapter().validation_error(\"rate_limited\")\n\n        self.device_code, self.client = device_codes.validate_user_code(code)\n        return code\n\n\nclass DeviceAuthorizationForm(forms.Form):\n    action = forms.CharField(required=False)\n\n\nclass RPInitiatedLogoutForm(forms.Form):\n    \"\"\"\n    We don't throw validation errors in case of wrong inputs:\n\n    > If any of the validation procedures defined in this specification fail,\n    > any operations requiring the information that failed to correctly validate\n    > MUST be aborted and the information that failed to validate MUST NOT be\n    > used.\n\n    \"\"\"\n\n    action = forms.CharField(required=False, widget=forms.HiddenInput)\n\n    # RECOMMENDED. ID Token previously issued by the OP to the RP passed to the\n    # Logout Endpoint as a hint about the End-User's current authenticated\n    # session with the Client. This is used as an indication of the identity of\n    # the End-User that the RP is requesting be logged out by the OP.\n    id_token_hint = forms.CharField(required=False, widget=forms.HiddenInput)\n\n    # OPTIONAL. Hint to the Authorization Server about the End-User that is\n    # logging out. The value and meaning of this parameter is left up to the\n    # OP's discretion. For instance, the value might contain an email address,\n    # phone number, username, or session identifier pertaining to the RP's\n    # session with the OP for the End-User.\n    logout_hint = forms.CharField(required=False, widget=forms.HiddenInput)\n\n    # OPTIONAL. OAuth 2.0 Client Identifier valid at the Authorization\n    # Server. When both client_id and id_token_hint are present, the OP MUST\n    # verify that the Client Identifier matches the one used when issuing the ID\n    # Token. The most common use case for this parameter is to specify the\n    # Client Identifier when post_logout_redirect_uri is used but id_token_hint\n    # is not. Another use is for symmetrically encrypted ID Tokens used as\n    # id_token_hint values that require the Client Identifier to be specified by\n    # other means, so that the ID Tokens can be decrypted by the OP.\n    client_id = forms.CharField(required=False, widget=forms.HiddenInput)\n\n    # OPTIONAL. URI to which the RP is requesting that the End-User's User Agent\n    # be redirected after a logout has been performed.\n    post_logout_redirect_uri = forms.URLField(required=False, widget=forms.HiddenInput)\n\n    # OPTIONAL. Opaque value used by the RP to maintain state between the logout\n    # request and the callback to the endpoint specified by the\n    # post_logout_redirect_uri parameter. If included in the logout request, the\n    # OP passes this value back to the RP using the state parameter when\n    # redirecting the User Agent back to the RP.\n    state = forms.CharField(required=False, widget=forms.HiddenInput)\n\n    # End-User's preferred languages and scripts for the user interface,\n    # represented as a space-separated list of BCP47 [RFC5646] language tag\n    # values, ordered by preference. For instance, the value \"fr-CA fr en\"\n    # represents a preference for French as spoken in Canada, then French\n    # (without a region designation), followed by English (without a region\n    # designation). An error SHOULD NOT result if some or all of the requested\n    # locales are not supported by the OpenID Provider.\n    ui_locales = forms.CharField(required=False, widget=forms.HiddenInput)\n\n    def clean_id_token_hint(self):\n        value = self.cleaned_data[\"id_token_hint\"]\n        if not value:\n            return None\n        payload = decode_jwt_token(value, verify_exp=False, verify_iss=True)\n        return payload\n\n    def clean(self) -> dict[str, Any] | None:\n        cleaned_data = super().clean()\n        if not cleaned_data:\n            return cleaned_data\n        post_logout_redirect_uri = cleaned_data.get(\"post_logout_redirect_uri\")\n\n        client: Client | None = None\n        client_id = cleaned_data.get(\"client_id\")\n        id_token_hint = cleaned_data.get(\"id_token_hint\")\n        aud: str | None = None\n        if id_token_hint:\n            aud = id_token_hint.get(\"aud\")\n            if aud and client_id and aud != client_id:\n                # aud doesn't match client_id, don't trust any of these.\n                id_token_hint = cleaned_data[\"id_token_hint\"] = None\n                client_id = cleaned_data[\"client_id\"] = None\n                aud = None\n            elif aud and not client_id:\n                client_id = aud\n\n        if client_id:\n            client = Client.objects.filter(id=client_id).first()\n            if not client:\n                # Wipe invalid inputs.\n                client_id = cleaned_data[\"client_id\"] = None\n                if aud:\n                    id_token_hint = cleaned_data[\"id_token_hint\"] = None\n\n        cleaned_data[\"post_logout_redirect_uri\"] = clean_post_logout_redirect_uri(\n            post_logout_redirect_uri, client\n        )\n        cleaned_data[\"client\"] = client\n        return cleaned_data\n"
  },
  {
    "path": "allauth/idp/oidc/internal/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/idp/oidc/internal/clientkit.py",
    "content": "import re\nfrom re import Pattern\nfrom urllib.parse import ParseResult, parse_qsl, urlparse\n\nfrom django.core.exceptions import ValidationError\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth.idp.oidc.models import Client\n\n\ndef is_loopback(parsed_uri: ParseResult) -> bool:\n    return parsed_uri.scheme == \"http\" and parsed_uri.hostname in (\n        \"127.0.0.1\",\n        \"::1\",\n    )\n\n\ndef _validate_uri_wildcard_format(uri: str, allow_uri_wildcards: bool) -> None:\n    if not allow_uri_wildcards:\n        if \"*\" in uri:\n            raise ValidationError(\n                _(\"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\")\n            )\n    elif uri.count(\"*\") > 1:\n        raise ValidationError(\n            _(\n                \"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is allowed.\"\n            ).format(uri)\n        )\n    else:\n        try:\n            parsed = urlparse(uri)\n        except ValueError as e:\n            # it's possible for this to happen with wildcards in ports\n            raise ValidationError(_(f\"Invalid URI: {e}\"))\n\n        if \"*\" in parsed.scheme or \"*\" in parsed.path or \"*\" in parsed.query:\n            raise ValidationError(\n                _(\"Wildcards are only allowed in the hostname portion of the URI.\")\n            )\n\n\ndef _wildcard_to_regex(wildcard: str) -> Pattern:\n    pattern = re.escape(wildcard).replace(r\"\\*\", r\"[^.]+\")\n    return re.compile(f\"^{pattern}$\")\n\n\ndef _is_scheme_hostname_allowed(\n    parsed_uri: ParseResult, parsed_allowed_uri: ParseResult, allow_uri_wildcards: bool\n) -> bool:\n    if parsed_allowed_uri.scheme != parsed_uri.scheme:\n        return False\n\n    if (\n        allow_uri_wildcards\n        and parsed_allowed_uri.hostname\n        and \"*\" in parsed_allowed_uri.hostname\n    ):\n        allowed_hostname_pattern = _wildcard_to_regex(parsed_allowed_uri.hostname)\n\n        if not allowed_hostname_pattern.match(parsed_uri.hostname):\n            return False\n    else:\n        if parsed_allowed_uri.hostname != parsed_uri.hostname:\n            return False\n\n    return True\n\n\ndef is_parsed_redirect_uri_allowed(\n    parsed_uri: ParseResult, allowed_uri: str, allow_uri_wildcards: bool\n) -> bool:\n    parsed_allowed_uri = urlparse(allowed_uri)\n\n    if not _is_scheme_hostname_allowed(\n        parsed_uri, parsed_allowed_uri, allow_uri_wildcards\n    ):\n        return False\n\n    if parsed_allowed_uri.path != parsed_uri.path:\n        return False\n\n    if not is_loopback(parsed_allowed_uri):\n        if parsed_allowed_uri.port != parsed_uri.port:\n            return False\n\n    if not set(parse_qsl(parsed_allowed_uri.query)).issubset(\n        set(parse_qsl(parsed_uri.query))\n    ):\n        return False\n\n    return True\n\n\ndef is_redirect_uri_allowed(\n    uri: str, allowed_uris: list[str], allow_uri_wildcards: bool\n) -> bool:\n    parsed_uri = urlparse(uri)\n    return any(\n        is_parsed_redirect_uri_allowed(parsed_uri, allowed_uri, allow_uri_wildcards)\n        for allowed_uri in allowed_uris\n    )\n\n\ndef is_origin_allowed(\n    origin: str, allowed_origins: list[str], allow_uri_wildcards: bool\n) -> bool:\n    parsed_origin = urlparse(origin)\n\n    for allowed_origin in allowed_origins:\n        parsed_allowed_origin = urlparse(allowed_origin)\n        if (\n            not _is_scheme_hostname_allowed(\n                parsed_origin, parsed_allowed_origin, allow_uri_wildcards\n            )\n            or parsed_origin.username != parsed_allowed_origin.username\n            or parsed_origin.password != parsed_allowed_origin.password\n            or parsed_origin.port != parsed_allowed_origin.port\n        ):\n            continue\n        else:\n            return True\n\n    return False\n\n\ndef get_used_schemes(client: Client) -> set[str]:\n    schemes = set()\n    for uri in client.get_redirect_uris():\n        parsed = urlparse(uri)\n        if parsed.scheme:\n            schemes.add(parsed.scheme)\n    return schemes\n\n\ndef clean_post_logout_redirect_uri(\n    post_logout_redirect_uri: str | None, client: Client | None\n) -> str | None:\n    \"\"\"\n    This URI SHOULD use the https scheme and MAY contain port, path, and\n    query parameter components; however, it MAY use the http scheme, provided\n    that the Client Type is confidential, as defined in Section 2.1 of OAuth 2.0\n    [RFC6749], and provided the OP allows the use of http RP URIs. The URI MAY\n    use an alternate scheme, such as one that is intended to identify a callback\n    into a native application. The value MUST have been previously registered\n    with the OP, either using the post_logout_redirect_uris Registration\n    parameter or via another mechanism. An id_token_hint is also RECOMMENDED\n    when this parameter is included.\n    \"\"\"\n    allowed_schemes = {\"https\"}\n    if client:\n        allowed_schemes.update(get_used_schemes(client))\n        if client.type == Client.Type.CONFIDENTIAL:\n            allowed_schemes.add(\"http\")\n    parsed = urlparse(post_logout_redirect_uri)\n    if not parsed.scheme or parsed.scheme not in allowed_schemes:\n        return None\n    return post_logout_redirect_uri\n"
  },
  {
    "path": "allauth/idp/oidc/internal/flows.py",
    "content": "from django.http import HttpRequest\n\nfrom allauth.account.internal.flows.logout import logout\nfrom allauth.idp.oidc.models import Client, Token\n\n\ndef rp_initiated_logout(\n    request: HttpRequest,\n    *,\n    from_op: bool,\n    post_logout_redirect_uri: str | None = None,\n    client: Client | None = None,\n):\n    if not request.user.is_authenticated:\n        return\n    if client:\n        Token.objects.filter(\n            user=request.user,\n            client=client,\n            type__in=[Token.Type.ACCESS_TOKEN, Token.Type.REFRESH_TOKEN],\n        ).delete()\n    if from_op:\n        has_redirect_uri = bool(post_logout_redirect_uri)\n        logout(request, show_message=not has_redirect_uri)\n"
  },
  {
    "path": "allauth/idp/oidc/internal/oauthlib/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/idp/oidc/internal/oauthlib/authorization_codes.py",
    "content": "from django.core.cache import cache\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.idp.oidc import app_settings\nfrom allauth.idp.oidc.adapter import get_adapter\nfrom allauth.idp.oidc.models import Client\n\n\ndef cache_key(client_id: str, code: str) -> str:\n    return f\"allauth.idp.oidc.authorization_code[{client_id}:{code}]\"\n\n\ndef create(client: Client, code: dict, request) -> None:\n    adapter = get_adapter()\n    authorization_code = {\n        \"code\": code,\n        \"client_id\": client.id,\n        \"redirect_uri\": request.redirect_uri,\n        \"sub\": adapter.get_user_sub(client, request.user),\n        \"scopes\": request.scopes,\n        \"claims\": request.claims,\n    }\n    if email := getattr(request, \"email\", None):\n        # Don't trouble ourselves with keeping track a specific email in case\n        # the primary was chosen.\n        if EmailAddress.objects.get_primary_email(request.user) != email.lower():\n            authorization_code[\"email\"] = email\n    code_challenge = getattr(request, \"code_challenge\", None)\n    if code_challenge:\n        authorization_code[\"pkce\"] = {\n            \"code_challenge\": code_challenge,\n            \"code_challenge_method\": request.code_challenge_method,\n        }\n    cache.set(\n        cache_key(client.id, code[\"code\"]),\n        authorization_code,\n        timeout=app_settings.AUTHORIZATION_CODE_EXPIRES_IN,\n    )\n\n\ndef lookup(client_id: str, code: str) -> dict | None:\n    return cache.get(cache_key(client_id, code))\n\n\ndef invalidate(client_id: str, code: str) -> None:\n    cache.delete(cache_key(client_id, code))\n\n\ndef validate(client_id: str, code: str, request) -> bool:\n    authorization_code = lookup(client_id, code)\n    if not authorization_code:\n        return False\n    user = get_adapter().get_user_by_sub(request.client, authorization_code[\"sub\"])\n    if not user:\n        return False\n    request.scopes = authorization_code[\"scopes\"]\n    request.user = user\n    pkce = authorization_code.get(\"pkce\")\n    if pkce:\n        request.code_challenge = pkce[\"code_challenge\"]\n        request.code_challenge_method = pkce[\"code_challenge_method\"]\n    request.claims = authorization_code[\"claims\"]\n    request.email = authorization_code.get(\"email\")\n    return True\n"
  },
  {
    "path": "allauth/idp/oidc/internal/oauthlib/device_codes.py",
    "content": "import time\n\nfrom django.contrib.auth import get_user_model\nfrom django.contrib.auth.models import AbstractBaseUser\nfrom django.core.cache import cache\nfrom django.http import HttpRequest\n\nfrom oauthlib.oauth2.rfc6749.errors import (\n    InvalidClientError,\n    InvalidGrantError,\n    InvalidRequestError,\n    UnsupportedGrantTypeError,\n)\nfrom oauthlib.oauth2.rfc8628.errors import (\n    AccessDenied,\n    AuthorizationPendingError,\n    SlowDownError,\n)\n\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.internal.userkit import str_to_user_id, user_id_to_str\nfrom allauth.core.internal.cryptokit import compare_user_code\nfrom allauth.idp.oidc.models import Client\n\n\ndef cache_user_code_key(user_code: str):\n    return f\"allauth.idp.oidc.user_code[{user_code.lower()}]\"\n\n\ndef cache_device_code_key(device_code: str):\n    return f\"allauth.idp.oidc.device_code[{device_code}]\"\n\n\ndef create(client_id: str, scope: list[str] | None, data: dict):\n    cache.set(\n        cache_user_code_key(data[\"user_code\"]),\n        data[\"device_code\"],\n        timeout=data[\"expires_in\"],\n    )\n    cache.set(\n        cache_device_code_key(data[\"device_code\"]),\n        {\n            \"expires_at\": time.time() + data[\"expires_in\"],\n            \"granted\": None,\n            \"last_poll_at\": 0,\n            \"client_id\": client_id,\n            \"scope\": scope,\n            \"device\": data,\n        },\n        timeout=data[\"expires_in\"],\n    )\n\n\ndef lookup_client(client_id: str) -> Client | None:\n    client = Client.objects.filter(id=client_id).first()\n    if not client:\n        return None\n    if client.type != Client.Type.PUBLIC:\n        return None\n    return client\n\n\ndef validate_user_code(code: str) -> tuple[str, Client]:\n    data: dict | None = None\n    device_code = cache.get(cache_user_code_key(code))\n    if device_code:\n        data = cache.get(cache_device_code_key(device_code))\n    if (\n        not data\n        or data[\"granted\"] is not None\n        or not compare_user_code(actual=code, expected=data[\"device\"][\"user_code\"])\n    ):\n        raise get_account_adapter().validation_error(\"incorrect_code\")\n    client = lookup_client(data[\"client_id\"])\n    if not client:\n        raise get_account_adapter().validation_error(\"incorrect_code\")\n    return device_code, client\n\n\ndef confirm_or_deny_device_code(user, device_code: str, confirm: bool) -> bool:\n    data = cache.get(cache_device_code_key(device_code))\n    if data is None or data[\"granted\"] is not None:\n        return False\n    data[\"granted\"] = confirm\n    data[\"user\"] = user_id_to_str(user)\n    return update_device_state(device_code, data)\n\n\ndef update_device_state(device_code: str, data: dict) -> bool:\n    timeout = int(data[\"expires_at\"] - time.time())\n    if timeout < 0:\n        return False\n    cache.set(cache_device_code_key(device_code), data, timeout=timeout)\n    return True\n\n\ndef poll_device_code(\n    request: HttpRequest,\n) -> tuple[AbstractBaseUser, dict]:\n    client_id = request.POST.get(\"client_id\")\n    device_code = request.POST.get(\"device_code\")\n    if not client_id or not device_code:\n        raise InvalidRequestError\n    client = lookup_client(client_id)\n    if not client:\n        raise InvalidClientError\n    if client.GrantType.DEVICE_CODE not in client.get_grant_types():\n        raise UnsupportedGrantTypeError\n    cache_key = cache_device_code_key(device_code)\n    data = cache.get(cache_key)\n    if data is None or data[\"client_id\"] != client_id:\n        raise InvalidGrantError\n    now = time.time()\n    if data[\"last_poll_at\"] + data[\"device\"][\"interval\"] > now:\n        raise SlowDownError\n    data[\"last_poll_at\"] = now\n    update_device_state(device_code, data)\n    granted = data.get(\"granted\")\n    if granted is None:\n        raise AuthorizationPendingError\n    elif granted is False:\n        raise AccessDenied\n    assert granted is True  # nosec\n    cache.delete(cache_key)\n\n    user = get_user_model().objects.filter(pk=str_to_user_id(data[\"user\"])).first()\n    if user is None or not user.is_active:\n        raise AccessDenied\n    return user, data\n"
  },
  {
    "path": "allauth/idp/oidc/internal/oauthlib/request_validator.py",
    "content": "import uuid\nfrom datetime import timedelta\n\nfrom django.utils import timezone\n\nimport jwt\nfrom oauthlib.openid import RequestValidator\n\nfrom allauth.core import context\nfrom allauth.core.internal import jwkkit\nfrom allauth.idp.oidc import app_settings\nfrom allauth.idp.oidc.adapter import get_adapter\nfrom allauth.idp.oidc.internal.clientkit import (\n    is_origin_allowed,\n    is_redirect_uri_allowed,\n)\nfrom allauth.idp.oidc.internal.oauthlib import authorization_codes\nfrom allauth.idp.oidc.internal.tokens import decode_jwt_token\nfrom allauth.idp.oidc.models import Client, Token\n\n\nclass OAuthLibRequestValidator(RequestValidator):\n\n    def validate_client_id(self, client_id: str, request):\n        client = self._lookup_client(request, client_id)\n        if not client:\n            return False\n        self._use_client(request, client)\n        return True\n\n    def validate_redirect_uri(self, client_id, redirect_uri, request, *args, **kwargs):\n        return is_redirect_uri_allowed(\n            redirect_uri,\n            request.client.get_redirect_uris(),\n            request.client.allow_uri_wildcards,\n        )\n\n    def validate_response_type(\n        self, client_id, response_type, client, request, *args, **kwargs\n    ):\n        return response_type in request.client.get_response_types()\n\n    def validate_scopes(self, client_id, scopes, client, request, *args, **kwargs):\n        return set(scopes).issubset(request.client.get_scopes())\n\n    def get_default_scopes(self, client_id, request, *args, **kwargs):\n        return request.client.get_default_scopes()\n\n    def save_authorization_code(self, client_id, code, request, *args, **kwargs):\n        # WORKAROUND: docstring says:\n        # > To support OIDC, you MUST associate the code with:\n        # > - nonce, if present (``code[\"nonce\"]``)\n        # Yet, nonce is not there, it is in request.nonce.\n        nonce = getattr(request, \"nonce\", None)\n        if nonce:\n            code = dict(**code, nonce=nonce)\n        # (end WORKAROUND)\n        authorization_codes.create(request.client, code, request)\n\n    def authenticate_client_id(self, client_id, request, *args, **kwargs) -> bool:\n        \"\"\"Ensure client_id belong to a non-confidential client.\"\"\"\n        client = self._lookup_client(request, client_id)\n        if not client or client.type != Client.Type.PUBLIC:\n            return False\n        self._use_client(request, client)\n        return True\n\n    def authenticate_client(self, request, *args, **kwargs) -> bool:\n        client_id = getattr(request, \"client_id\", None)\n        client_secret = getattr(request, \"client_secret\", None)\n        if not isinstance(client_id, str):\n            return False\n        if not client_secret and request.grant_type == Client.GrantType.DEVICE_CODE:\n            return self.authenticate_client_id(client_id, request)\n        if not client_secret or not isinstance(client_secret, str):\n            return False\n        client = self._lookup_client(request, client_id)\n        if not client:\n            return False\n        if not client.check_secret(client_secret):\n            return False\n        self._use_client(request, client)\n        return True\n\n    def validate_grant_type(\n        self, client_id, grant_type, client, request, *args, **kwargs\n    ):\n        return grant_type in client.get_grant_types()\n\n    def validate_code(self, client_id, code, client, request, *args, **kwargs):\n        return authorization_codes.validate(client_id, code, request)\n\n    def confirm_redirect_uri(\n        self, client_id, code, redirect_uri, client, request, *args, **kwargs\n    ) -> bool:\n        authorization_code = self._lookup_authorization_code(request, client_id, code)\n        if not authorization_code:\n            return False\n        return redirect_uri == authorization_code[\"redirect_uri\"]\n\n    def save_bearer_token(self, token: dict, request, *args, **kwargs):\n        \"\"\"\n        https://datatracker.ietf.org/doc/html/rfc6749#section-6\n        > The authorization server MAY issue a new refresh token, in which case\n        > the client MUST discard the old refresh token and replace it with the\n        > new refresh token.  The authorization server MAY revoke the old\n        > refresh token after issuing a new refresh token to the client.  If a\n        > new refresh token is issued, the refresh token scope MUST be\n        > identical to that of the refresh token included by the client in the\n        > request.\n\n        https://datatracker.ietf.org/doc/html/rfc6749#section-1.5\n        > Refresh tokens are issued to the client by the authorization server and\n        > are used to obtain a new access token when the current access token becomes\n        > invalid or expires, or to obtain additional access tokens with identical or\n        > narrower scope\n        \"\"\"\n        adapter = get_adapter()\n        refresh_token = token.get(\"refresh_token\")\n        email = getattr(request, \"email\", None)\n        tokens = []\n        if refresh_token:\n            refresh_token_hash = adapter.hash_token(refresh_token)\n            rt = getattr(request, \"refresh_token_instance\", None)\n            if rt and not email and \"email\" in request.scopes:\n                email = rt.get_scope_email()\n            if (\n                rt\n                and not app_settings.ROTATE_REFRESH_TOKEN\n                and refresh_token_hash == rt.hash\n            ):\n                # We reuse our token.\n                pass\n            else:\n                if rt:\n                    # If we have an existing refresh token, drop it, because of:\n                    assert (\n                        app_settings.ROTATE_REFRESH_TOKEN\n                        or refresh_token_hash != rt.hash\n                    )  # nosec[assert_used]\n                    rt.delete()\n                tokens.append(\n                    Token(\n                        client=request.client,\n                        user=request.user,\n                        type=Token.Type.REFRESH_TOKEN,\n                        hash=refresh_token_hash,\n                    )\n                )\n        tokens.append(\n            Token(\n                client=request.client,\n                user=request.user,\n                type=Token.Type.ACCESS_TOKEN,\n                hash=adapter.hash_token(token[\"access_token\"]),\n                expires_at=timezone.now() + timedelta(seconds=token[\"expires_in\"]),\n            )\n        )\n        for t in tokens:\n            t.set_scopes(request.scopes)\n            if email:\n                t.set_scope_email(email)\n        Token.objects.bulk_create(tokens)\n\n    def invalidate_authorization_code(self, client_id, code, request, *args, **kwargs):\n        authorization_codes.invalidate(client_id, code)\n\n    def validate_user_match(self, id_token_hint, scopes, claims, request) -> bool:\n        if not context.request.user:\n            return False\n        sub = None\n        if id_token_hint:\n            payload = decode_jwt_token(\n                id_token_hint,\n                client_id=request.client.id,\n                verify_exp=True,\n                verify_iss=True,\n            )\n            if payload is None:\n                return False\n            sub = payload.get(\"sub\")\n            session_sub = get_adapter().get_user_sub(\n                request.client, context.request.user\n            )\n            if sub != session_sub:\n                return False\n        if claims:\n            sub = claims.get(\"sub\")\n            session_sub = get_adapter().get_user_sub(\n                request.client, context.request.user\n            )\n            if sub != session_sub:\n                return False\n        return True\n\n    def get_authorization_code_scopes(\n        self, client_id, code, redirect_uri, request\n    ) -> list[str]:\n        authorization_code = self._lookup_authorization_code(request, client_id, code)\n        if not authorization_code:\n            return []\n        return authorization_code[\"scopes\"]\n\n    def get_authorization_code_nonce(self, client_id, code, redirect_uri, request):\n        authorization_code = self._lookup_authorization_code(request, client_id, code)\n        return authorization_code[\"code\"].get(\"nonce\")\n\n    def get_code_challenge(self, code, request):\n        ret = None\n        authorization_code = self._lookup_authorization_code(\n            request, request.client_id, code\n        )\n        if pkce := authorization_code.get(\"pkce\"):\n            ret = pkce[\"code_challenge\"]\n        return ret\n\n    def get_code_challenge_method(self, code, request):\n        ret = None\n        authorization_code = self._lookup_authorization_code(\n            request, request.client_id, code\n        )\n        if pkce := authorization_code.get(\"pkce\"):\n            ret = pkce[\"code_challenge_method\"]\n        return ret\n\n    def is_pkce_required(self, client_id, request) -> bool:\n        client = self._lookup_client(request, client_id)\n        return bool(client and client.type == Client.Type.PUBLIC)\n\n    def finalize_id_token(self, id_token: dict, token: dict, token_handler, request):\n        \"\"\"\n        https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims\n        \"\"\"\n        adapter = get_adapter()\n        id_token[\"iss\"] = adapter.get_issuer()\n        id_token[\"exp\"] = id_token[\"iat\"] + app_settings.ID_TOKEN_EXPIRES_IN\n        id_token[\"jti\"] = uuid.uuid4().hex\n        email = getattr(request, \"email\", None)\n        id_token.update(\n            adapter.get_claims(\n                \"id_token\", request.user, request.client, request.scopes, email=email\n            )\n        )\n        adapter.populate_id_token(id_token, request.client, request.scopes)\n        jwk_dict, private_key = jwkkit.load_jwk_from_pem(app_settings.PRIVATE_KEY)\n        return jwt.encode(\n            id_token, private_key, algorithm=\"RS256\", headers={\"kid\": jwk_dict[\"kid\"]}\n        )\n\n    def validate_bearer_token(self, token, scopes, request) -> bool:\n        if not token:\n            return False\n        if context.request.GET.get(\"access_token\") == token:\n            # Supporting tokens in query params is considered bad practice, yet,\n            # oauthlib supports this. E.g., if access tokens are sent via URI\n            # query parameters, such tokens may leak to log files and the HTTP\n            # 'referer'.\n            return False\n        instance = Token.objects.lookup(Token.Type.ACCESS_TOKEN, token)\n        if not instance:\n            return False\n        if instance.user and not instance.user.is_active:\n            return False\n        granted_scopes = instance.get_scopes()\n        if not set(scopes).issubset(set(granted_scopes)):\n            return False\n        request.user = instance.user\n        self._use_client(request, instance.client)\n        request.scopes = granted_scopes\n        request.access_token = instance\n        return True\n\n    def revoke_token(self, token, token_type_hint, request, *args, **kwargs):\n        if token_type_hint == \"access_token\":  # nosec\n            types = [Token.Type.ACCESS_TOKEN]\n        elif token_type_hint == \"refresh_token\":  # nosec\n            types = [Token.Type.REFRESH_TOKEN]\n        else:\n            types = [Token.Type.ACCESS_TOKEN, Token.Type.REFRESH_TOKEN]\n        Token.objects.by_value(token).filter(type__in=types).delete()\n\n    def get_userinfo_claims(self, request):\n        email = request.access_token.get_scope_email()\n        return get_adapter().get_claims(\n            \"userinfo\", request.user, request.client, request.scopes, email=email\n        )\n\n    def get_default_redirect_uri(self, client_id, request, *args, **kwargs):\n        # https://openid.net/specs/openid-financial-api-part-1-1_0.html#section-5.2.2\n        # 9. shall require the redirect_uri in the authorization request;\n        # So, don't support a default.\n        return None\n\n    def validate_user(self, username, password, client, request, *args, **kwargs):\n        \"\"\"\n        Note that this bypasses MFA, which is why the password grant is not\n        recommended and hence disabled. This could work:\n\n            try:\n                user = get_account_adapter().authenticate(\n                    context.request, username=username, password=password\n                )\n            except ValidationError:\n                return False\n            else:\n                if not user:\n                    return False\n                request.user = user\n                return True\n        \"\"\"\n        return False\n\n    def validate_refresh_token(self, refresh_token, client, request, *args, **kwargs):\n        token = Token.objects.filter(client=client).lookup(\n            Token.Type.REFRESH_TOKEN, refresh_token\n        )\n        if not token:\n            return False\n        if not token.user or not token.user.is_active:\n            return False\n        request.user = token.user\n        request.refresh_token_instance = token\n        return True\n\n    def get_original_scopes(self, refresh_token, request, *args, **kwargs):\n        return request.refresh_token_instance.get_scopes()\n\n    def client_authentication_required(self, request, *args, **kwargs) -> bool:\n        if request.client_id and request.client_secret:\n            return True\n\n        client = self._lookup_client(request, request.client_id)\n        if client and client.type == Client.Type.PUBLIC:\n            return False\n        return super().client_authentication_required(request, *args, **kwargs)\n\n    def _lookup_client(self, request, client_id) -> Client | None:\n        \"\"\"\n        In various places, oauthlib documents:\n\n            Note, while not strictly necessary it can often be very convenient\n            to set request.client to the client object associated with the\n            given client_id.\n\n        It's unclear though that if this is not explicitly stated, and, we still\n        were to set request.client, whether that could have adverse side\n        effects. So, don't assign request.client here.\n        \"\"\"\n        cache = request._client_cache = getattr(request, \"_client_cache\", {})\n        if client_id in cache:\n            client = cache[client_id]\n        else:\n            client = Client.objects.filter(id=client_id).first()\n            cache[client_id] = client\n        return client\n\n    def _use_client(self, request, client: Client) -> None:\n        request.client = client\n        request.client.client_id = client.id\n\n    def _lookup_authorization_code(\n        self, request, client_id: str, code: str\n    ) -> dict | None:\n        cache = request._code_cache = getattr(request, \"_code_cache\", {})\n        key = (client_id, code)\n        if key in cache:\n            authorization_code = cache[key]\n        else:\n            authorization_code = authorization_codes.lookup(client_id, code)\n            cache[key] = authorization_code\n        return authorization_code\n\n    def is_origin_allowed(self, client_id, origin, request, *args, **kwargs) -> bool:\n        client = self._lookup_client(request, client_id)\n        return bool(\n            client\n            and is_origin_allowed(\n                origin, client.get_cors_origins(), client.allow_uri_wildcards\n            )\n        )\n\n    def rotate_refresh_token(self, request):\n        return app_settings.ROTATE_REFRESH_TOKEN\n\n    def validate_silent_login(self, request) -> bool:\n        if context.request.user.is_authenticated:\n            request.user = context.request.user\n            return True\n        return False\n\n    def validate_silent_authorization(self, request) -> bool:\n        granted_scopes = set()\n        tokens = Token.objects.valid().filter(\n            user=context.request.user,\n            type__in=[Token.Type.REFRESH_TOKEN, Token.Type.ACCESS_TOKEN],\n        )\n        for token in tokens.iterator():\n            granted_scopes.update(token.get_scopes())\n        return set(request.scopes).issubset(granted_scopes)\n\n    def validate_jwt_bearer_token(self, token, scopes, request):\n        if scopes:\n            # We don't have scope for the ID token\n            return False\n        payload = decode_jwt_token(token, verify_iss=True, verify_exp=True)\n        if payload is None:\n            return False\n        return self.validate_client_id(payload[\"aud\"], request)\n"
  },
  {
    "path": "allauth/idp/oidc/internal/oauthlib/server.py",
    "content": "import secrets\nimport time\nimport uuid\n\nfrom django.urls import reverse\n\nimport jwt\nfrom oauthlib.oauth2.rfc8628.endpoints import DeviceApplicationServer\nfrom oauthlib.openid import Server\n\nfrom allauth.core import context\nfrom allauth.core.internal import jwkkit\nfrom allauth.idp.oidc import app_settings\nfrom allauth.idp.oidc.adapter import get_adapter\nfrom allauth.idp.oidc.internal.oauthlib.request_validator import (\n    OAuthLibRequestValidator,\n)\n\n\ndef generate_opaque_token(request):\n    # 160 bit token is recommended, oauthlib uses less.\n    # oauch.io -- at oautlib's default, we get:\n    #    Out of 11 valid authorization responses, the\n    #    average calculated entropy for the access tokens was 144,3 (±7,1) bits\n    return secrets.token_urlsafe(64)\n\n\ndef generate_jwt_access_token(request) -> str:\n    adapter = get_adapter()\n    iat = int(time.time())\n    access_token = {\n        \"client_id\": request.client.id,\n        \"iss\": adapter.get_issuer(),\n        \"iat\": iat,\n        \"exp\": iat + app_settings.ACCESS_TOKEN_EXPIRES_IN,\n        \"jti\": uuid.uuid4().hex,\n        \"token_use\": \"access\",  # nosec\n    }\n    # Client credentials has no user.\n    if request.user is not None:\n        access_token[\"sub\"] = adapter.get_user_sub(request.client, request.user)\n    if request.scopes:\n        access_token[\"scope\"] = \" \".join(request.scopes)\n    adapter.populate_access_token(\n        access_token, user=request.user, client=request.client, scopes=request.scopes\n    )\n    jwk_dict, private_key = jwkkit.load_jwk_from_pem(app_settings.PRIVATE_KEY)\n    return jwt.encode(\n        access_token, private_key, algorithm=\"RS256\", headers={\"kid\": jwk_dict[\"kid\"]}\n    )\n\n\ndef generate_access_token(request) -> str:\n    fmt = app_settings.ACCESS_TOKEN_FORMAT\n    if fmt == \"opaque\":\n        return generate_opaque_token(request)\n    elif fmt == \"jwt\":\n        return generate_jwt_access_token(request)\n    else:\n        raise ValueError(fmt)\n\n\ndef generate_refresh_token(request) -> str:\n    return generate_opaque_token(request)\n\n\nclass OAuthLibServer(Server):\n    def __init__(self, **kwargs):\n        super().__init__(\n            token_generator=generate_access_token,\n            refresh_token_generator=generate_refresh_token,\n            request_validator=OAuthLibRequestValidator(),\n            token_expires_in=app_settings.ACCESS_TOKEN_EXPIRES_IN,\n            **kwargs,\n        )\n\n\nclass DeviceOAuthLibServer(DeviceApplicationServer):\n    def __init__(self):\n        verification_uri = context.request.build_absolute_uri(\n            reverse(\"idp:oidc:device_authorization\")\n        )\n        super().__init__(\n            request_validator=OAuthLibRequestValidator(),\n            verification_uri=verification_uri,\n            verification_uri_complete=f\"{verification_uri}?code={{user_code}}\",\n            interval=app_settings.DEVICE_CODE_INTERVAL,\n            user_code_generator=lambda: get_adapter().generate_user_code(),\n        )\n        self._expires_in = app_settings.DEVICE_CODE_EXPIRES_IN\n\n\ndef get_server(**kwargs):\n    return OAuthLibServer(**kwargs)\n\n\ndef get_device_server():\n    return DeviceOAuthLibServer()\n"
  },
  {
    "path": "allauth/idp/oidc/internal/oauthlib/utils.py",
    "content": "from urllib.parse import urlparse, urlunparse\n\nfrom django.forms import Form\nfrom django.http import HttpRequest, HttpResponse, JsonResponse\nfrom django.shortcuts import render\n\nfrom oauthlib.common import quote, urlencode, urlencoded\nfrom oauthlib.oauth2.rfc6749.errors import OAuth2Error\n\nfrom allauth.account import app_settings as account_settings\n\n\ndef get_uri(request: HttpRequest) -> str:\n    \"\"\"\n    Django considers \"safe\" some characters that aren't so for oauthlib.\n    We have to search for them and properly escape.\n    \"\"\"\n    parsed = list(urlparse(request.get_full_path()))\n    query = parsed[4]\n    encoded_query = quote(query, safe=\"\".join(urlencoded))\n    parsed[4] = encoded_query\n    return urlunparse(parsed)\n\n\ndef extract_params(request: HttpRequest) -> tuple[str, str, str, dict[str, str]]:\n    uri = get_uri(request)\n    body: str = urlencode(request.POST.items())\n    headers = extract_headers(request)\n    if request.method is None:\n        raise ValueError(request.method)\n    return uri, request.method, body, headers\n\n\ndef extract_headers(request) -> dict[str, str]:\n    \"\"\"\n    You need to define extract_params and make sure it does not include file\n    like objects waiting for input. In Django this is request.META['wsgi.input']\n    and request.META['wsgi.errors']\n    \"\"\"\n    headers = request.META.copy()\n    headers.pop(\"wsgi.input\", None)\n    headers.pop(\"wsgi.errors\", None)\n    if \"HTTP_AUTHORIZATION\" in headers:\n        headers[\"Authorization\"] = headers[\"HTTP_AUTHORIZATION\"]\n    if \"HTTP_ORIGIN\" in headers:\n        headers[\"Origin\"] = headers[\"HTTP_ORIGIN\"]\n    if \"CONTENT_TYPE\" in headers:\n        headers[\"Content-Type\"] = headers[\"CONTENT_TYPE\"]\n    return headers\n\n\ndef convert_response(headers, body, status):\n    if isinstance(body, dict):\n        response = JsonResponse(body, status=status)\n    else:\n        response = HttpResponse(content=body, status=status)\n    for k, v in headers.items():\n        response[k] = v\n    return response\n\n\ndef respond_html_error(\n    request: HttpRequest,\n    *,\n    error: OAuth2Error | None = None,\n    form: Form | None = None,\n) -> HttpResponse:\n    context = {\"error\": error, \"error_form\": form}\n    return render(\n        request,\n        f\"idp/oidc/error.{account_settings.TEMPLATE_EXTENSION}\",\n        context,\n    )\n\n\ndef respond_json_error(request: HttpRequest, error: OAuth2Error) -> HttpResponse:\n    response = HttpResponse(\n        error.json, status=error.status_code, content_type=\"application/json\"\n    )\n    for k, v in error.headers.items():\n        response[k] = v\n    return response\n"
  },
  {
    "path": "allauth/idp/oidc/internal/scope.py",
    "content": "from allauth.idp.oidc.models import Token\n\n\ndef _is_scope_granted(\n    scope: str | list[str] | list[list[str]],\n    granted_scope: list[str],\n) -> bool:\n    if isinstance(scope, str):\n        return scope in granted_scope\n    if not isinstance(scope, list):\n        raise ValueError\n    if len(scope) == 0:\n        return True\n    list_of_list_of_scopes: list[list[str]]\n    if isinstance(scope[0], str):\n        list_of_list_of_scopes = [scope]  # type: ignore\n    else:\n        list_of_list_of_scopes = scope  # type: ignore\n    for list_of_scopes in list_of_list_of_scopes:\n        if all(s in granted_scope for s in list_of_scopes):\n            return True\n    return False\n\n\ndef is_scope_granted(\n    scope: (\n        None\n        | str\n        | list[str]\n        | list[list[str]]\n        | dict[str, str | list[str] | list[list[str]]]\n    ),\n    token: Token,\n    method: str | None = None,\n) -> bool:\n    if scope is None:\n        return True\n    if isinstance(scope, dict):\n        if not method:\n            return False\n        scope = scope.get(method)\n    granted_scope = token.get_scopes() if token else []\n    assert scope is not None  # nosec\n    return _is_scope_granted(scope, granted_scope)\n"
  },
  {
    "path": "allauth/idp/oidc/internal/tokens.py",
    "content": "import jwt\n\nfrom allauth.core.internal import jwkkit\nfrom allauth.idp.oidc import app_settings\nfrom allauth.idp.oidc.adapter import get_adapter\n\n\ndef decode_jwt_token(\n    value: str, *, client_id: str | None = None, verify_exp: bool, verify_iss: bool\n) -> dict | None:\n    if not value:\n        return None\n    try:\n        jwk_dict, private_key = jwkkit.load_jwk_from_pem(app_settings.PRIVATE_KEY)\n        issuer: str | None = None\n        audience: str | None = None\n        if client_id:\n            audience = client_id\n        if verify_iss:\n            issuer = get_adapter().get_issuer()\n        return jwt.decode(\n            value,\n            key=private_key.public_key(),\n            algorithms=[\"RS256\"],\n            options={\n                \"verify_signature\": True,\n                \"verify_iss\": verify_iss,\n                \"verify_aud\": client_id is not None,\n                \"verify_exp\": verify_exp,\n            },\n            audience=audience,\n            issuer=issuer,\n        )\n    except jwt.PyJWTError:\n        return None\n"
  },
  {
    "path": "allauth/idp/oidc/migrations/0001_initial.py",
    "content": "import django.db.models.deletion\nimport django.utils.timezone\nfrom django.conf import settings\nfrom django.db import migrations, models\n\nimport allauth.idp.oidc.models\n\n\nclass Migration(migrations.Migration):\n\n    initial = True\n\n    dependencies = [\n        migrations.swappable_dependency(settings.AUTH_USER_MODEL),\n    ]\n\n    operations = [\n        migrations.CreateModel(\n            name=\"Client\",\n            fields=[\n                (\n                    \"id\",\n                    models.CharField(\n                        default=allauth.idp.oidc.models.default_client_id,\n                        max_length=100,\n                        primary_key=True,\n                        serialize=False,\n                        verbose_name=\"Client ID\",\n                    ),\n                ),\n                (\"name\", models.CharField(max_length=100)),\n                (\n                    \"secret\",\n                    models.CharField(\n                        default=allauth.idp.oidc.models.default_client_secret,\n                        max_length=200,\n                    ),\n                ),\n                (\n                    \"scopes\",\n                    models.TextField(\n                        default=\"openid\",\n                        help_text=\"The scope(s) the client is allowed to request. Provide one value per line, e.g.: openid(ENTER)profile(ENTER)email(ENTER)\",\n                    ),\n                ),\n                (\n                    \"type\",\n                    models.CharField(\n                        choices=[\n                            (\"confidential\", \"Confidential\"),\n                            (\"public\", \"Public\"),\n                        ],\n                        default=\"confidential\",\n                        max_length=20,\n                    ),\n                ),\n                (\n                    \"grant_types\",\n                    models.TextField(\n                        default=\"authorization_code\",\n                        help_text=\"A list of allowed grant types. Provide one value per line, e.g.: authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\",\n                    ),\n                ),\n                (\n                    \"redirect_uris\",\n                    models.TextField(\n                        blank=True,\n                        default=\"\",\n                        help_text=\"A list of allowed redirect (callback) URLs, one per line.\",\n                    ),\n                ),\n                (\n                    \"cors_origins\",\n                    models.TextField(\n                        blank=True,\n                        default=\"\",\n                        help_text=\"A list of allowed origins for cross-origin requests, one per line.\",\n                        verbose_name=\"CORS allowed origins\",\n                    ),\n                ),\n                (\n                    \"response_types\",\n                    models.TextField(\n                        default=\"code\",\n                        help_text=\"A list of allowed response types. Provide one value per line, e.g.: code(ENTER)id_token token(ENTER)\",\n                    ),\n                ),\n                (\n                    \"skip_consent\",\n                    models.BooleanField(\n                        default=False,\n                        help_text=\"Flag to allow skip the consent screen for this client\",\n                    ),\n                ),\n                (\"created_at\", models.DateTimeField(default=django.utils.timezone.now)),\n                (\"data\", models.JSONField(blank=True, default=None, null=True)),\n                (\n                    \"owner\",\n                    models.ForeignKey(\n                        blank=True,\n                        null=True,\n                        on_delete=django.db.models.deletion.CASCADE,\n                        to=settings.AUTH_USER_MODEL,\n                    ),\n                ),\n            ],\n            options={\n                \"verbose_name\": \"client\",\n                \"verbose_name_plural\": \"clients\",\n            },\n        ),\n        migrations.CreateModel(\n            name=\"Token\",\n            fields=[\n                (\n                    \"id\",\n                    models.BigAutoField(\n                        auto_created=True,\n                        primary_key=True,\n                        serialize=False,\n                        verbose_name=\"ID\",\n                    ),\n                ),\n                (\n                    \"type\",\n                    models.CharField(\n                        choices=[\n                            (\"ia\", \"Initial access token\"),\n                            (\"at\", \"Access token\"),\n                            (\"rt\", \"Refresh token\"),\n                            (\"ac\", \"Authorization code\"),\n                        ],\n                        max_length=2,\n                    ),\n                ),\n                (\"hash\", models.CharField(max_length=255)),\n                (\"data\", models.JSONField(blank=True, default=None, null=True)),\n                (\"created_at\", models.DateTimeField(default=django.utils.timezone.now)),\n                (\n                    \"expires_at\",\n                    models.DateTimeField(blank=True, db_index=True, null=True),\n                ),\n                (\"scopes\", models.TextField(default=\"\")),\n                (\n                    \"client\",\n                    models.ForeignKey(\n                        blank=True,\n                        null=True,\n                        on_delete=django.db.models.deletion.CASCADE,\n                        to=\"allauth_idp_oidc.client\",\n                    ),\n                ),\n                (\n                    \"user\",\n                    models.ForeignKey(\n                        blank=True,\n                        null=True,\n                        on_delete=django.db.models.deletion.CASCADE,\n                        to=settings.AUTH_USER_MODEL,\n                    ),\n                ),\n            ],\n            options={\n                \"unique_together\": {(\"type\", \"hash\")},\n            },\n        ),\n    ]\n"
  },
  {
    "path": "allauth/idp/oidc/migrations/0002_client_default_scopes.py",
    "content": "from django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n\n    dependencies = [\n        (\"allauth_idp_oidc\", \"0001_initial\"),\n    ]\n\n    operations = [\n        migrations.AddField(\n            model_name=\"client\",\n            name=\"default_scopes\",\n            field=models.TextField(\n                blank=True,\n                default=\"\",\n                help_text=\"In case the client does not specify any scope, these default scopes are used. Provide one value per line, e.g.: openid(ENTER)profile(ENTER)email(ENTER)\",\n            ),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/idp/oidc/migrations/0003_client_allow_uri_wildcards.py",
    "content": "from django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n\n    dependencies = [\n        (\"allauth_idp_oidc\", \"0002_client_default_scopes\"),\n    ]\n\n    operations = [\n        migrations.AddField(\n            model_name=\"client\",\n            name=\"allow_uri_wildcards\",\n            field=models.BooleanField(\n                default=False,\n                help_text=\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs can contain a single asterisk to match subdomains.\",\n                verbose_name=\"Allow URI wildcards\",\n            ),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/idp/oidc/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/idp/oidc/models.py",
    "content": "from django.conf import settings\nfrom django.contrib.auth.hashers import check_password, make_password\nfrom django.db import models\nfrom django.db.models import Q\nfrom django.utils import timezone\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth.idp.oidc.adapter import get_adapter\n\n\ndef default_client_id() -> str:\n    adapter = get_adapter()\n    client_id = adapter.generate_client_id()\n    return client_id\n\n\ndef default_client_secret() -> str:\n    adapter = get_adapter()\n    client_secret = adapter.generate_client_secret()\n    return make_password(client_secret)\n\n\ndef _values_from_text(text) -> list[str]:\n    return list(filter(None, [s.strip() for s in text.split(\"\\n\")]))\n\n\ndef _values_to_text(values) -> str:\n    if isinstance(values, str):\n        raise ValueError(values)\n    return \"\\n\".join(values)\n\n\nclass Client(models.Model):\n    class GrantType(models.TextChoices):\n        AUTHORIZATION_CODE = \"authorization_code\", _(\"Authorization code\")\n        DEVICE_CODE = \"urn:ietf:params:oauth:grant-type:device_code\", _(\"Device code\")\n        CLIENT_CREDENTIALS = \"client_credentials\", _(\"Client credentials\")\n        REFRESH_TOKEN = \"refresh_token\", _(\"Refresh token\")\n\n    class Type(models.TextChoices):\n        CONFIDENTIAL = \"confidential\", _(\"Confidential\")\n        PUBLIC = \"public\", _(\"Public\")\n\n    id = models.CharField(\n        primary_key=True,\n        max_length=100,\n        default=default_client_id,\n        verbose_name=\"Client ID\",\n    )\n    name = models.CharField(\n        max_length=100,\n    )\n    secret = models.CharField(max_length=200, default=default_client_secret)\n    scopes = models.TextField(\n        help_text=_(\n            \"The scope(s) the client is allowed to request. Provide one value per line, e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\n        ),\n        default=\"openid\",\n    )\n    default_scopes = models.TextField(\n        help_text=_(\n            \"In case the client does not specify any scope, these default scopes are used. Provide one value per line, e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\n        ),\n        default=\"\",\n        blank=True,\n    )\n    type = models.CharField(\n        max_length=20, default=Type.CONFIDENTIAL, choices=Type.choices\n    )\n    grant_types = models.TextField(\n        default=GrantType.AUTHORIZATION_CODE,\n        help_text=_(\n            \"A list of allowed grant types. Provide one value per line, e.g.: authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n        ),\n    )\n    redirect_uris = models.TextField(\n        help_text=\"A list of allowed redirect (callback) URLs, one per line.\",\n        blank=True,\n        default=\"\",\n    )\n    cors_origins = models.TextField(\n        blank=True,\n        help_text=_(\n            \"A list of allowed origins for cross-origin requests, one per line.\"\n        ),\n        default=\"\",\n        verbose_name=\"CORS allowed origins\",\n    )\n    allow_uri_wildcards = models.BooleanField(\n        default=False,\n        help_text=_(\n            \"Allow wildcards (*) in redirect URIs and CORS origins. \"\n            \"When enabled, URIs can contain a single asterisk to match subdomains.\"\n        ),\n        verbose_name=\"Allow URI wildcards\",\n    )\n    response_types = models.TextField(\n        default=\"code\",\n        help_text=_(\n            \"A list of allowed response types. Provide one value per line, e.g.: code(ENTER)id_token token(ENTER)\"\n        ),\n    )\n    owner = models.ForeignKey(\n        settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.CASCADE\n    )\n    skip_consent = models.BooleanField(\n        default=False, help_text=\"Flag to allow skip the consent screen for this client\"\n    )\n    created_at = models.DateTimeField(default=timezone.now)\n    data = models.JSONField(blank=True, null=True, default=None)\n\n    class Meta:\n        verbose_name = _(\"client\")\n        verbose_name_plural = _(\"clients\")\n\n    def get_redirect_uris(self) -> list[str]:\n        return _values_from_text(self.redirect_uris)\n\n    def set_redirect_uris(self, uris: list[str]) -> None:\n        self.redirect_uris = _values_to_text(uris)\n\n    def get_cors_origins(self) -> list[str]:\n        return _values_from_text(self.cors_origins)\n\n    def set_cors_origins(self, uris: list[str]) -> None:\n        self.cors_origins = _values_to_text(uris)\n\n    def get_scopes(self) -> list[str]:\n        return _values_from_text(self.scopes)\n\n    def set_scopes(self, scopes: list[str]) -> None:\n        self.scopes = _values_to_text(scopes)\n\n    def get_default_scopes(self) -> list[str]:\n        return _values_from_text(self.default_scopes)\n\n    def set_default_scopes(self, scopes: list[str]) -> None:\n        self.default_scopes = _values_to_text(scopes)\n\n    def get_response_types(self) -> list[str]:\n        return _values_from_text(self.response_types)\n\n    def set_response_types(self, response_types: list[str]) -> None:\n        self.response_types = _values_to_text(response_types)\n\n    def get_grant_types(self) -> list[str]:\n        return _values_from_text(self.grant_types)\n\n    def set_grant_types(self, grant_types: list[str]) -> None:\n        self.grant_types = _values_to_text(grant_types)\n\n    def set_secret(self, secret) -> None:\n        self.secret = make_password(secret)\n\n    def check_secret(self, secret: str) -> bool:\n        return check_password(secret, self.secret)\n\n    def clean_redirect_uris(self) -> list[str]:\n        from allauth.idp.oidc.internal.clientkit import _validate_uri_wildcard_format\n\n        uris = self.get_redirect_uris()\n        for uri in uris:\n            _validate_uri_wildcard_format(uri, self.allow_uri_wildcards)\n        return uris\n\n    def clean_cors_origins(self) -> list[str]:\n        from allauth.idp.oidc.internal.clientkit import _validate_uri_wildcard_format\n\n        origins = self.get_cors_origins()\n        for origin in origins:\n            _validate_uri_wildcard_format(origin, self.allow_uri_wildcards)\n        return origins\n\n    def clean(self) -> None:\n        # the django admin doesn't call full_clean, so we need to call them here\n        self.clean_redirect_uris()\n        self.clean_cors_origins()\n\n    def __str__(self) -> str:\n        return self.id\n\n\nclass TokenQuerySet(models.query.QuerySet):\n    def valid(self):\n        return self.filter(\n            Q(expires_at__isnull=True) | Q(expires_at__gt=timezone.now())\n        )\n\n    def by_value(self, value: str):\n        return self.filter(hash=get_adapter().hash_token(value))\n\n    def lookup(self, type, value):\n        return self.valid().by_value(value).filter(type=type).first()\n\n\nclass Token(models.Model):\n    objects = TokenQuerySet.as_manager()\n\n    class Type(models.TextChoices):\n        INITIAL_ACCESS_TOKEN = \"ia\", \"Initial access token\"\n        ACCESS_TOKEN = \"at\", \"Access token\"\n        REFRESH_TOKEN = \"rt\", \"Refresh token\"\n        AUTHORIZATION_CODE = \"ac\", \"Authorization code\"\n\n    type = models.CharField(max_length=2, choices=Type.choices)\n    hash = models.CharField(max_length=255)\n    client = models.ForeignKey(Client, on_delete=models.CASCADE, blank=True, null=True)\n    user = models.ForeignKey(\n        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True\n    )\n    data = models.JSONField(blank=True, null=True, default=None)\n    created_at = models.DateTimeField(default=timezone.now)\n    expires_at = models.DateTimeField(blank=True, null=True, db_index=True)\n    scopes = models.TextField(default=\"\")\n\n    class Meta:\n        unique_together = ((\"type\", \"hash\"),)\n\n    def __str__(self) -> str:\n        if self.user_id:\n            return f\"{self.get_type_display()} for user #{self.user_id}\"\n        return self.get_type_display()\n\n    def get_scopes(self) -> list[str]:\n        return _values_from_text(self.scopes)\n\n    def set_scopes(self, scopes: list[str]) -> None:\n        self.scopes = _values_to_text(scopes)\n\n    def set_scope_email(self, email: str) -> None:\n        \"\"\"\n        In case a specific email was chosen to be exposed to the client,\n        store that using this method.\n        \"\"\"\n        if self.data is None:\n            self.data = {}\n        self.data[\"email\"] = email\n\n    def get_scope_email(self) -> str | None:\n        \"\"\"\n        Returns the email that was selected when the email scope was\n        granted.  Note that this may e outdated, as the user can change email\n        addresses at any time.\n        \"\"\"\n        if not isinstance(self.data, dict):\n            return None\n        return self.data.get(\"email\")\n"
  },
  {
    "path": "allauth/idp/oidc/urls.py",
    "content": "from django.urls import include, path\n\nfrom allauth.idp.oidc import app_settings, views\n\n\napp_name = \"oidc\"\n\n\n_api_urlpatterns = [\n    path(\n        \"token\",\n        views.token,\n        name=\"token\",\n    ),\n    path(\n        \"revoke\",\n        views.revoke,\n        name=\"revoke\",\n    ),\n    path(\n        \"device/code\",\n        views.device_code,\n        name=\"device_code\",\n    ),\n]\n\nif not app_settings.USERINFO_ENDPOINT:\n    _api_urlpatterns.append(\n        path(\n            \"userinfo\",\n            views.user_info,\n            name=\"userinfo\",\n        )\n    )\n\n\nurlpatterns = [\n    path(\n        \".well-known/\",\n        include(\n            [\n                path(\n                    \"openid-configuration\",\n                    views.configuration,\n                    name=\"configuration\",\n                ),\n                path(\n                    \"jwks.json\",\n                    views.jwks,\n                    name=\"jwks\",\n                ),\n            ]\n        ),\n    ),\n    path(\n        \"identity/\",\n        include(\n            [\n                path(\n                    \"o/\",\n                    include(\n                        [\n                            path(\n                                \"authorize\",\n                                views.authorization,\n                                name=\"authorization\",\n                            ),\n                            path(\n                                \"device\",\n                                views.device_authorization,\n                                name=\"device_authorization\",\n                            ),\n                            path(\n                                \"logout\",\n                                views.logout,\n                                name=\"logout\",\n                            ),\n                            path(\"api/\", include(_api_urlpatterns)),\n                        ]\n                    ),\n                )\n            ]\n        ),\n    ),\n]\n"
  },
  {
    "path": "allauth/idp/oidc/views.py",
    "content": "from http import HTTPStatus\n\nfrom django.contrib.auth import REDIRECT_FIELD_NAME\nfrom django.contrib.auth.decorators import login_required\nfrom django.contrib.auth.models import AbstractBaseUser\nfrom django.contrib.sites.shortcuts import get_current_site\nfrom django.core.exceptions import PermissionDenied\nfrom django.core.signing import BadSignature, Signer\nfrom django.http import (\n    HttpRequest,\n    HttpResponse,\n    HttpResponseForbidden,\n    HttpResponseRedirect,\n    JsonResponse,\n)\nfrom django.middleware.csrf import CsrfViewMiddleware\nfrom django.shortcuts import render\nfrom django.urls import reverse\nfrom django.utils.decorators import method_decorator\nfrom django.utils.http import urlencode\nfrom django.views import View\nfrom django.views.decorators.clickjacking import xframe_options_deny\nfrom django.views.decorators.csrf import csrf_exempt\nfrom django.views.generic.edit import FormView\n\nfrom oauthlib.oauth2.rfc6749 import errors\nfrom oauthlib.oauth2.rfc6749.errors import InvalidScopeError, OAuth2Error\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.core.internal import jwkkit\nfrom allauth.core.internal.httpkit import add_query_params, del_query_params\nfrom allauth.idp.oidc import app_settings\nfrom allauth.idp.oidc.adapter import get_adapter\nfrom allauth.idp.oidc.forms import (\n    AuthorizationForm,\n    ConfirmCodeForm,\n    DeviceAuthorizationForm,\n    RPInitiatedLogoutForm,\n)\nfrom allauth.idp.oidc.internal import flows\nfrom allauth.idp.oidc.internal.oauthlib import device_codes\nfrom allauth.idp.oidc.internal.oauthlib.server import get_device_server, get_server\nfrom allauth.idp.oidc.internal.oauthlib.utils import (\n    convert_response,\n    extract_params,\n    respond_html_error,\n    respond_json_error,\n)\nfrom allauth.idp.oidc.models import Client\nfrom allauth.utils import build_absolute_uri\n\n\ndef _enforce_csrf(request) -> HttpResponseForbidden | None:\n    \"\"\"\n    Scenario: view is CSRF exempt, but, if this is not a client initial POST\n    request, we do want a properly CSRF protected view.\n    \"\"\"\n    reason = CsrfViewMiddleware(\n        get_response=lambda req: HttpResponseForbidden()\n    ).process_view(request, lambda *args, **kwargs: HttpResponse(), (), {})\n    if reason:\n        return HttpResponseForbidden(f\"CSRF Failed: {reason}\")\n    return None\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass ConfigurationView(View):\n    def get(self, request) -> JsonResponse:\n        userinfo_endpoint = app_settings.USERINFO_ENDPOINT\n        if not userinfo_endpoint:\n            userinfo_endpoint = build_absolute_uri(\n                request, reverse(\"idp:oidc:userinfo\")\n            )\n        data = {\n            \"authorization_endpoint\": build_absolute_uri(\n                request, reverse(\"idp:oidc:authorization\")\n            ),\n            \"device_authorization_endpoint\": build_absolute_uri(\n                request, reverse(\"idp:oidc:device_code\")\n            ),\n            \"revocation_endpoint\": build_absolute_uri(\n                request, reverse(\"idp:oidc:revoke\")\n            ),\n            \"token_endpoint\": build_absolute_uri(request, reverse(\"idp:oidc:token\")),\n            \"userinfo_endpoint\": userinfo_endpoint,\n            \"end_session_endpoint\": build_absolute_uri(\n                request, reverse(\"idp:oidc:logout\")\n            ),\n            \"jwks_uri\": build_absolute_uri(request, reverse(\"idp:oidc:jwks\")),\n            \"issuer\": get_adapter().get_issuer(),\n            \"response_types_supported\": self._get_response_types_supported(),\n            \"subject_types_supported\": [\"public\"],\n            \"id_token_signing_alg_values_supported\": [\"RS256\"],\n        }\n        response = JsonResponse(data)\n        response[\"Access-Control-Allow-Origin\"] = \"*\"\n        return response\n\n    def _get_response_types_supported(self) -> list[str]:\n        response_types = set()\n        for client in Client.objects.only(\"response_types\").iterator():\n            response_types.update(client.get_response_types())\n        return list(sorted(response_types))\n\n\nconfiguration = ConfigurationView.as_view()\n\n\n@method_decorator(xframe_options_deny, name=\"dispatch\")\n@method_decorator(csrf_exempt, name=\"dispatch\")\n@method_decorator(login_not_required, name=\"dispatch\")\nclass AuthorizationView(FormView):\n    form_class = AuthorizationForm\n    template_name = f\"idp/oidc/authorization_form.{account_settings.TEMPLATE_EXTENSION}\"\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        response = self._login_required(request)\n        if response:\n            return response\n        orequest = extract_params(self.request)\n        try:\n            server = get_server()\n            self._scopes, self._request_info = server.validate_authorization_request(\n                *orequest\n            )\n            if \"none\" in self._request_info.get(\"prompt\", ()):\n                oresponse = server.create_authorization_response(\n                    *orequest, scopes=self._scopes\n                )\n                return convert_response(*oresponse)\n\n        # Errors that should be shown to the user on the provider website\n        except errors.FatalClientError as e:\n            return respond_html_error(request, error=e)\n        except errors.OAuth2Error as e:\n            return HttpResponseRedirect(e.in_uri(e.redirect_uri))\n        if self._request_info[\"request\"].client.skip_consent:\n            return self._skip_consent()\n        return super().get(request, *args, **kwargs)\n\n    def post(self, request, *args, **kwargs) -> HttpResponse:\n        signed_request_info = request.POST.get(\"request\")\n        if not signed_request_info:\n            return HttpResponseRedirect(\n                f\"{reverse('idp:oidc:authorization')}?{request.POST.urlencode()}\"\n            )\n        response = self._login_required(request)\n        if response:\n            return response\n\n        csrf_resp = _enforce_csrf(request)\n        if csrf_resp:\n            return csrf_resp\n\n        try:\n            signer = Signer()\n            self._scopes, self._request_info = signer.unsign_object(signed_request_info)\n        except BadSignature:\n            raise PermissionDenied\n        if request.POST.get(\"action\") != \"grant\":\n            return self._respond_with_access_denied()\n        return super().post(request, *args, **kwargs)\n\n    def _login_required(self, request) -> HttpResponse | None:\n        prompts = []\n        prompt = request.GET.get(\"prompt\")\n        if prompt:\n            prompts = prompt.split()\n        if \"login\" in prompts:\n            return self._handle_login_prompt(request, prompts)\n        if \"none\" in prompts:\n            return None\n        if request.user.is_authenticated:\n            return None\n        return login_required()(None)(request)  # type:ignore[misc,type-var]\n\n    def _handle_login_prompt(\n        self, request: HttpRequest, prompts: list[str]\n    ) -> HttpResponse:\n        prompts.remove(\"login\")\n        next_url = request.get_full_path()\n        if prompts:\n            next_url = add_query_params(next_url, {\"prompt\": \" \".join(prompts)})\n        else:\n            next_url = del_query_params(next_url, \"prompt\")\n        params = {}\n        params[REDIRECT_FIELD_NAME] = next_url\n        path = reverse(\n            \"account_reauthenticate\"\n            if request.user.is_authenticated\n            else \"account_login\"\n        )\n        return HttpResponseRedirect(add_query_params(path, params))\n\n    def _skip_consent(self):\n        scopes = self._request_info[\"request\"].scopes\n        form_kwargs = self.get_form_kwargs()\n        form_kwargs[\"data\"] = {\n            \"scopes\": scopes,\n            \"request\": \"not-relevant-for-skip-consent\",\n        }\n        form = self.form_class(**form_kwargs)\n        if not form.is_valid():\n            # Shouldn't occur.\n            raise PermissionDenied()\n        return self.form_valid(form)\n\n    def _respond_with_access_denied(self):\n        redirect_uri = self._request_info.get(\"redirect_uri\")\n        state = self._request_info.get(\"state\")\n        params = {\"error\": \"access_denied\"}\n        if state:\n            params[\"state\"] = state\n        return HttpResponseRedirect(add_query_params(redirect_uri, params))\n\n    def get_form_kwargs(self) -> dict:\n        ret = super().get_form_kwargs()\n        ret.update({\"requested_scopes\": self._scopes, \"user\": self.request.user})\n        return ret\n\n    def get_initial(self) -> dict:\n        signer = Signer()\n        ret = {}\n        request_info = self._request_info\n        request_info.pop(\"request\", None)\n        prompt = request_info.get(\"prompt\")\n        if isinstance(prompt, set):\n            request_info[\"prompt\"] = list(prompt)\n        ret[\"request\"] = signer.sign_object((self._scopes, request_info))\n        return ret\n\n    def form_valid(self, form) -> HttpResponse:\n        orequest = extract_params(self.request)\n        scopes = form.cleaned_data[\"scopes\"]\n        credentials = {\"user\": self.request.user}\n        credentials.update(self._request_info)\n        try:\n            email = form.cleaned_data.get(\"email\")\n            if email:\n                credentials[\"email\"] = email\n            oresponse = get_server().create_authorization_response(\n                *orequest, scopes=scopes, credentials=credentials\n            )\n            return convert_response(*oresponse)\n\n        except errors.FatalClientError as e:\n            return respond_html_error(self.request, error=e)\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        ret.update(\n            {\n                \"client\": Client.objects.get(id=self._request_info[\"client_id\"]),\n                \"site\": get_current_site(self.request),\n            }\n        )\n        return ret\n\n\nauthorization = AuthorizationView.as_view()\n\n\n@method_decorator(csrf_exempt, name=\"dispatch\")\n@method_decorator(login_not_required, name=\"dispatch\")\nclass DeviceCodeView(View):\n    def post(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:\n        orequest = extract_params(request)\n        try:\n            headers, data, status = (\n                get_device_server().create_device_authorization_response(*orequest)\n            )\n            if status == HTTPStatus.OK:\n                client_id = request.POST[\"client_id\"]\n                scope: list[str] | None = None\n                if \"scope\" in request.POST:\n                    scope = request.POST[\"scope\"].split()\n                    client = Client.objects.get(id=client_id)\n                    if not set(scope).issubset(set(client.get_scopes())):\n                        raise InvalidScopeError()\n                device_codes.create(client_id, scope, data)\n        except OAuth2Error as e:\n            return HttpResponse(\n                e.json, content_type=\"application/json\", status=e.status_code\n            )\n        return convert_response(headers, data, status)\n\n\ndevice_code = DeviceCodeView.as_view()\n\n\n@method_decorator(csrf_exempt, name=\"dispatch\")\n@method_decorator(login_required, name=\"dispatch\")\nclass DeviceAuthorizationView(View):\n    def dispatch(self, request, *args, **kwargs) -> HttpResponse:\n        if \"code\" in request.GET:\n            form = ConfirmCodeForm(request.GET)\n            if form.is_valid():\n                return self._dispatch_authorization(\n                    request,\n                    form.cleaned_data[\"code\"],\n                    form.device_code,\n                    form.client,\n                )\n        else:\n            form = ConfirmCodeForm()\n        context = {\n            \"form\": form,\n            \"autorization_url\": reverse(\"idp:oidc:device_authorization\"),\n        }\n        return render(\n            request,\n            f\"idp/oidc/device_authorization_code_form.{account_settings.TEMPLATE_EXTENSION}\",\n            context,\n        )\n\n    def _dispatch_authorization(\n        self, request, user_code: str, device_code: str, client: Client\n    ):\n        context = {\"user_code\": user_code, \"client\": client}\n        if request.method == \"POST\":\n            form = DeviceAuthorizationForm(request.POST)\n            if form.is_valid():\n                confirm = form.cleaned_data[\"action\"] == \"confirm\"\n                device_codes.confirm_or_deny_device_code(\n                    request.user, device_code, confirm=confirm\n                )\n                if confirm:\n                    template_name = f\"idp/oidc/device_authorization_confirmed.{account_settings.TEMPLATE_EXTENSION}\"\n                else:\n                    template_name = f\"idp/oidc/device_authorization_denied.{account_settings.TEMPLATE_EXTENSION}\"\n                return render(request, template_name, context)\n        else:\n            form = DeviceAuthorizationForm()\n        context[\"autorization_url\"] = (\n            reverse(\"idp:oidc:device_authorization\")\n            + \"?\"\n            + urlencode({\"code\": user_code})\n        )\n\n        return render(\n            request,\n            f\"idp/oidc/device_authorization_confirm_form.{account_settings.TEMPLATE_EXTENSION}\",\n            context,\n        )\n\n\ndevice_authorization = DeviceAuthorizationView.as_view()\n\n\n@method_decorator(csrf_exempt, name=\"dispatch\")\n@method_decorator(login_not_required, name=\"dispatch\")\nclass TokenView(View):\n\n    def post(self, request) -> HttpResponse:\n        if request.POST.get(\"grant_type\") == Client.GrantType.DEVICE_CODE:\n            return self._post_device_token(request)\n        return self._create_token_response(request)\n\n    def _create_token_response(\n        self,\n        request,\n        *,\n        user: AbstractBaseUser | None = None,\n        data: dict | None = None,\n    ):\n        orequest = extract_params(request)\n        oresponse = get_server(\n            pre_token=[lambda orequest: self._pre_token(orequest, user, data)]\n        ).create_token_response(*orequest)\n        return convert_response(*oresponse)\n\n    def _pre_token(self, orequest, user: AbstractBaseUser | None, data: dict | None):\n        if orequest.grant_type == Client.GrantType.DEVICE_CODE:\n            assert user is not None  # nosec\n            assert data is not None  # nosec\n            if scope := data.get(\"scope\"):\n                orequest.scope = scope\n            orequest.user = user\n\n    def _post_device_token(self, request):\n        try:\n            user, data = device_codes.poll_device_code(request)\n        except OAuth2Error as e:\n            return HttpResponse(\n                e.json, content_type=\"application/json\", status=e.status_code\n            )\n        else:\n            return self._create_token_response(request, user=user, data=data)\n\n\ntoken = TokenView.as_view()\n\n\n@method_decorator(csrf_exempt, name=\"dispatch\")\n@method_decorator(login_not_required, name=\"dispatch\")\nclass UserInfoView(View):\n    \"\"\"\n    The UserInfo Endpoint MUST support the use of the HTTP GET and HTTP POST methods\n    \"\"\"\n\n    def get(self, request: HttpRequest) -> HttpResponse:\n        return self._respond(request)\n\n    def post(self, request: HttpRequest) -> HttpResponse:\n        return self._respond(request)\n\n    def _respond(self, request: HttpRequest) -> HttpResponse:\n        orequest = extract_params(request)\n        try:\n            oresponse = get_server().create_userinfo_response(*orequest)\n            return convert_response(*oresponse)\n        except OAuth2Error as e:\n            return respond_json_error(request, e)\n\n\nuser_info = UserInfoView.as_view()\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass JwksView(View):\n    def get(self, request, *args, **kwargs) -> JsonResponse:\n        keys = []\n        for pem in [app_settings.PRIVATE_KEY]:\n            jwk, _ = jwkkit.load_jwk_from_pem(pem)\n            keys.append(jwk)\n        response = JsonResponse({\"keys\": keys})\n        response[\"Access-Control-Allow-Origin\"] = \"*\"\n        return response\n\n\njwks = JwksView.as_view()\n\n\n@method_decorator(csrf_exempt, name=\"dispatch\")\n@method_decorator(login_not_required, name=\"dispatch\")\nclass RevokeView(View):\n    def post(self, request, *args, **kwargs) -> HttpResponse:\n        orequest = extract_params(request)\n        oresponse = get_server().create_revocation_response(*orequest)\n        return convert_response(*oresponse)\n\n\nrevoke = RevokeView.as_view()\n\n\n@method_decorator(csrf_exempt, name=\"dispatch\")\n@method_decorator(login_not_required, name=\"dispatch\")\nclass LogoutView(FormView):\n    \"\"\"\n    https://openid.net/specs/openid-connect-rpinitiated-1_0.html\n    \"\"\"\n\n    form_class = RPInitiatedLogoutForm\n    template_name = f\"idp/oidc/logout.{account_settings.TEMPLATE_EXTENSION}\"\n\n    def get(self, request) -> HttpResponse:\n        form = self.form_class(request.GET)\n        if not form.is_valid():\n            return self.form_invalid(form)\n        if not self._must_ask(form):\n            return self._handle(form, True)\n        return self.render_to_response(self.get_context_data(form=form))\n\n    def form_invalid(self, form) -> HttpResponse:\n        return respond_html_error(self.request, form=form)\n\n    def form_valid(self, form) -> HttpResponse:\n        ask = self._must_ask(form)\n        action = form.cleaned_data[\"action\"]\n        if ask:\n            # If we're supposed to ask, we need to ensure this POST request does\n            # NOT come from the RP, but from the actual user visitting the logout\n            # page.\n            csrf_token = self.request.POST.get(\"csrfmiddlewaretoken\", \"\")\n            if not csrf_token or not action:\n                return self.render_to_response(self.get_context_data(form=form))\n            csrf_resp = _enforce_csrf(self.request)\n            if csrf_resp:\n                return csrf_resp\n            op_logout = action != \"stay\"\n        else:\n            op_logout = True\n        return self._handle(form, op_logout)\n\n    def _handle(\n        self, form: RPInitiatedLogoutForm, op_logout: bool\n    ) -> HttpResponseRedirect:\n        cleaned_data = form.cleaned_data\n        flows.rp_initiated_logout(\n            self.request,\n            from_op=op_logout,\n            client=cleaned_data[\"client\"],\n            post_logout_redirect_uri=cleaned_data[\"post_logout_redirect_uri\"],\n        )\n        redirect_uri = cleaned_data[\"post_logout_redirect_uri\"]\n        if redirect_uri:\n            state = cleaned_data[\"state\"]\n            if state:\n                redirect_uri = add_query_params(redirect_uri, {\"state\": state})\n        else:\n            redirect_uri = get_account_adapter().get_logout_redirect_url(self.request)\n        return HttpResponseRedirect(redirect_uri)\n\n    def _must_ask(self, form: RPInitiatedLogoutForm) -> bool:\n        \"\"\"\n        At the Logout Endpoint, the OP SHOULD ask the End-User whether to\n        log out of the OP as well. Furthermore, the OP MUST ask the End-User\n        this question if an id_token_hint was not provided or if the supplied ID\n        Token does not belong to the current OP session with the RP and/or\n        currently logged in End-User. If the End-User says \"yes\", then the OP\n        MUST log out the End-User.\n        \"\"\"\n        if self.request.user.is_anonymous:\n            return False\n        if app_settings.RP_INITIATED_LOGOUT_ASKS_FOR_OP_LOGOUT:\n            return True\n        id_token_hint = form.cleaned_data[\"id_token_hint\"]\n        sub = None\n        if id_token_hint:\n            sub = id_token_hint.get(\"sub\")\n        client = form.cleaned_data.get(\"client\")\n        if not id_token_hint or not client or not sub:\n            return True\n        user_hint = get_adapter().get_user_by_sub(client, sub)\n        if not user_hint or (user_hint.pk != self.request.user.pk):\n            return True\n        return False\n\n\nlogout = LogoutView.as_view()\n"
  },
  {
    "path": "allauth/idp/urls.py",
    "content": "from django.urls import include, path\n\n\napp_name = \"idp\"\nurlpatterns = [\n    path(\"\", include(\"allauth.idp.oidc.urls\")),\n]\n"
  },
  {
    "path": "allauth/locale/ar/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: 0.1\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-11-28 05:00+0000\\n\"\n\"Last-Translator: Mohammed “Medait” AIT ALI <medait.31@gmail.com>\\n\"\n\"Language-Team: Arabic <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/ar/>\\n\"\n\"Language: ar\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 \"\n\"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\\n\"\n\"X-Generator: Weblate 5.15-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"هذا الحساب غير نشط حاليا.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"لا يمكنك إزالة عنوان بريدك الإلكتروني الرئيسي.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"عنوان البريد الإلكتروني هذا مربوط بالفعل مع هذا الحساب.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"عنوان البريد الإلكتروني و / أو كلمة المرور غير صحيحة.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"رقم الهاتف و / أو كلمة المرور غير صحيحة.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"هنالك مستخدم مسجل سابقا يستخدم عنوان البريد الإلكتروني نفسه.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"الرجاء كتابة كلمة المرور الحالية.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"كود خاطئ.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"كلمة مرور خاطئة.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"مفتاح خاطئ او منتهي.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"فشل تسجيل الدخول.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"كود إعادة تعيين كلمة المرور غير صالح.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"لا يمكنك إضافة أكثر من %d بريد إلكتروني.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"تم تسجيل مستخدم بالفعل برقم الهاتف هذا.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"تجاوزت الحد المسموح لمحاولة تسجيل الدخول. حاول في وقت لاحق.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"لم يتم ربط عنوان البريد الإلكتروني مع أي حساب مستخدم.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"لم يتم ربط رقم الهاتف مع أي حساب مستخدم.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"يجب توثيق عنوان بريدك الإلكتروني الرئيسي.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"اسم المستخدم غير مسموح به. الرجاء اختيار اسم آخر‪.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"اسم المستخدم و / أو كلمة المرور غير صحيحة.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"الرجاء اختيار واحد فقط.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"يجب أن تكون القيمة الجديدة مختلفة عن القيمة الحالية.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"كن صبوراً، فأنت ترسل عدداً كبيراً جداً من الطلبات.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"استخدم كلمة مرورك\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"استخدم تطبيق المصادقة او الكود\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"استخدم مفتاح الأمان\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"تحديد {email} على أنه تم التحقق منه\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"فشل تحديد {email} على أنه تم التحقق منه.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"تحديد البريد الإلكتروني المختار بأنه تم التحقق منه\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"الحسابات\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"البريد الالكتروني\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"عنوان البريد الالكتروني\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"الرجاء إدخال رقم هاتف بما في ذلك رقم البلاد (على سبيل المثال ‪+1‬ للولايات \"\n\"المتحدة).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"هاتف\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"يجب عليك كتابة كلمة المرور نفسها في كل مرة‪.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"كلمة المرور\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"تذكرني\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"اسم المستخدم\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"تسجيل الدخول\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"اسم المستخدم أو البريد الإلكتروني أو الهاتف\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"اسم المستخدم أو البريد الإلكتروني\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"اسم المستخدم أو الهاتف\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"البريد الالكتروني أو الهاتف\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"هل نسيت كلمة المرور؟\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"البريد الإلكتروني ‪(مجددا)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"تأكيد البريد الإلكتروني\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"البريد الالكتروني (اختياري)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"اسم المستخدم (اختياري)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"يجب عليك كتابة البريد الإلكتروني نفسه في كل مرة‪.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"كلمة المرور (مجددا)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"كلمة المرور الحالية\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"كلمة المرور الجديدة\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"كلمة المرور الجديدة (مجددا)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"شفرة\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"مستخدم\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"عنوان بريد إلكتروني\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"موثق\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"رئيسي\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"عناوين البريد الالكتروني\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"تمّ إنشاؤه\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"تم ارساله\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"مفتاح\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"تأكيد البريد الإلكتروني\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"تأكيدات البريد الإلكتروني\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"مقطوعة الرأس\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"عرض معرف المستخدم الخاص بك\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"عرض عنوان بريدك الإلكتروني\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"عرض معلومات ملفك الشخصي الأساسية\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"منح الأذونات\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"لا يُسمح باستخدام أحرف البدل (*) ما لم يتم تمكين 'السماح بأحرف البدل في \"\n\"عناوين URI'.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"عنوان URI '{}' يحتوي على أكثر من حرف بدل (*). يُسمح بحرف بدل واحد فقط لكل \"\n\"عنوان URI.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"لا يُسمح بأحرف البدل (*) إلا في جزء اسم المضيف من عنوان URI.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"رمز التفويض\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"رمز الجهاز\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"بيانات اعتماد العميل\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"رمز التحديث\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"سري\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"عام\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"النطاق (النطاقات) التي يُسمح للعميل بطلبها. قم بتوفير قيمة واحدة لكل سطر، \"\n\"مثال: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"في حال لم يحدد العميل أي نطاق، يتم استخدام هذه النطاقات الافتراضية. قم \"\n\"بتوفير قيمة واحدة لكل سطر، مثال: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"قائمة أنواع المنح المسموح بها. قم بتوفير قيمة واحدة لكل سطر، مثال: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"قائمة المصادر المسموح بها للطلبات عبر المصادر، واحد لكل سطر.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"السماح بأحرف البدل (*) في عناوين URI لإعادة التوجيه ومصادر CORS. عند \"\n\"التمكين، يمكن أن تحتوي عناوين URI على علامة نجمة واحدة لمطابقة النطاقات \"\n\"الفرعية.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"قائمة أنواع الاستجابات المسموح بها. قم بتوفير قيمة واحدة لكل سطر، مثال: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"عميل\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"عملاء\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"لا يمكنك إضافة عنوان بريد إلكتروني إلى حساب محمي بواسطة المصادقة الثنائية.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"لا يمكنك إلغاء تنشيط المصادقة الثنائية.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"لا يمكنك إنشاء رموز الاسترداد دون تمكين المصادقة الثنائية.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"لا يمكنك تفعيل المصادقة الثنائية إلا بعد التحقق من عنوان بريدك الإلكتروني.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"مفتاح رئيسي\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"المفتاح الاحتياطي\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"مفتاح رقم {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"وزارة الخارجية\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"رموز الاسترداد\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"أداة مصادقة TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"مصادقة الويب\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"كود المصدق\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"بدون كلمة مرور\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"يسمح لك تفعيل الدخول من غير كلمة مرور باستعمال هذا المفتاح فقط، ولكنه يفرض \"\n\"شروط دخول أخرى مثل الدخول بالمعرّفات الحيوية (مثل البصمة) أو رقم التعريف \"\n\"الشخصي.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"يوجد حساب بالفعل مربوط مع هذا البريد الإلكتروني. يرجى الدخول إلى ذاك الحساب \"\n\"أولا، ثم ربط حسابك في %s.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"كود غير صالح.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"حسابك ليست له كلمة مرور مضبوطة.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"حسابك ليس لديه عنوان بريد إلكتروني موثقف.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"لا يمكنك حذف هذا الحساب لطرف ثالث وفصله عن حسابك.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"حساب الطرف الثالث متصل مسبقا مع حساب مختلف.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"حسابات التواصل الاجتماعي\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"مزود\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"معرف المزود\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"اسم\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"معرف العميل\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"معرف آبل، أو مفتاح المستهلك\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"مفتاح سري\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"مفتاح واجهة برمجية سري أو مفتاح مستهلك\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"مفتاح\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"تطبيق اجتماعي\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"تطبيقات اجتماعية\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"معرف المستخدم\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"أخر دخول\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"تاريخ الانضمام\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"بيانات إضافية\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"حساب تواصل اجتماعي\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"حسابات تواصل اجتماعي\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"كود\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) أو مفتاح وصول (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"كود سري\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) أو رمز تحديث (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"ينتهي في\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"كود تطبيق اجتماعي\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"أكواد التطبيقات الاجتماعية\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"معلومات ملف شخصي غير صالحة\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"تسجيل الدخول\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"يلغي\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"تم تلقي رد غير صالح عند الحصول على كود الطلب من \\\"%s\\\". الرد كان: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"تم تلقي رد غير صالح عند الحصول على كود الوصول من \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"لا يوجد كود طلب محفوظ لـ \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"لا يوجد كود وصول محفوظ لـ \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"لا وصول للموارد الخاصة في \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"تم تلقي رد غير صالح عند الحصول على كود الطلب من \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"الحساب غير نشط\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"هذا الحساب غير نشط.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"لقد أرسلنا رمزًا إلى %(recipient)s. الرمز ينتهي قريبًا، لذا يرجى إدخاله قريبًا.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"تأكيد\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"طلب كود جديد\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"تأكيد الوصول\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"يرجى إعادة المصادقة لحماية حسابك.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"خيارات بديلة\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"تأكيد البريد الإلكتروني\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"الرجاء إدخال الكود المبعوث إلى بريدك الالكتروني\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"استخدم بريد إلكتروني آخر\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"تسجيل الدخول\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"أدخل رمز تسجيل الدخول\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"إعادة تعيين كلمة المرور\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"الرجاء إدخال الكود لإعادة تعيين كلمة المرور\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"التأكيد من رقم الهاتف\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"الرجاء إدخال الكود للتأكيد من رقم الهاتف\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"استخدم رقم هاتف آخر\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"عناوين البريد الإلكتروني\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"عناوين البريد الإلكتروني التالية مربوطة مع حسابك:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"موثق\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"غير موثق\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"أساسي\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"اجعله أساسيا\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"إعادة ارسال رسالة التأكيد\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"احذف\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"أضف عنوان بريد إلكتروني\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"أضف بريدا إلكترونيا\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"هل تريد حقا حذف عنوان البريد الإلكتروني المحدد؟\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"تلقيت هذه الرسالة لأنك أو أحد آخر حاول تسجيل حساب\\n\"\n\"باستخدام البريد الإلكتروني:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"لكن حسابا مربوطا بهذا البريد موجود بالفعل. \\n\"\n\"في حال نسيت هذا، يمكنك استخدام رابط\\n\"\n\"إعادة ضبط كلمة المرور لاستعادة حسابك:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"الحساب موجود بالفعل\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"مرحبا من موقع %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"شكرا لاستخدامك %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"أنت تتلقى هذا البريد لأنه تم إجراء التغيير التالي على حسابك:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"إذا لم تتعرف على هذا التغيير، فيرجى اتخاذ الاحتياطات الأمنية المناسبة على \"\n\"الفور. التغيير في حسابك ناتج عن:\\n\"\n\"\\n\"\n\"- عنوان IP: %(ip)s\\n\"\n\"- المتصفح: %(user_agent)s\\n\"\n\"- التاريخ: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"J لقد تم تغيير بريدك الإلكتروني من %(from_email)s إلى %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"تم تغيير عنوان البريد الالكتروني\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"تم التأكيد من عنوان بريدك الالكتروني.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"تأكيد البريد الإلكتروني\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"تلقيت هذه الرسالة لأن المستخدم %(user_display)s أعطانا بريدك الإلكتروني \"\n\"لتسجيل حساب في %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"الكود للتأكيد من بريدك الالكتروني مدرج أدناه. الرجاء إدخاله في نافذة المتصفح \"\n\"المفتوحة.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"للتأكيد بأن هذا صحيح، اذهب إلى %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"أكد عنوان البريد الإلكتروني\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"تمت إزالة عنوان البريد الإلكتروني %(deleted_email)s من حسابك.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"تم حذف البريد الالكتروني\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"رمز تسجيل الدخول الخاص بك مدرج أدناه. الرجاء إدخاله في نافذة المتصفح \"\n\"المفتوحة.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"يمكن تجاهل هذا البريد بأمان إذا لم تبدأ هذا الإجراء.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"كود تسجيل الدخول\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"تم تغيير كلمة المرور الخاصة بك.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"تم تغيير كلمة المرور\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"الكود لإعادة تعيين كلمة المرور مدرج أدناه. الرجاء إدخاله في نافذة المتصفح \"\n\"المفتوحة.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"كود إعادة تعيين كلمة المرور\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"تلقيت هذه الرسالة لأنك أو أحد آخر طلب إعادة ضبط كلمة مرور حسابك.\\n\"\n\"يمكنك تجاهل الرسالة بأمان إذا لم تطلب هذا. اضغط الرابط في الأسفل لإعادة ضبط \"\n\"كلمة المرور.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"في حال كنت قد نسيت، اسم المستخدم الخاص بك هو %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"رسالة إعادة ضبط كلمة المرور\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"تم إعادة تعيين كلمة المرور الخاصة بك.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"تم تحديد كلمة المرور الخاصة بك.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"تم تحديد كلمة المرور\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"O أنت تتلقى هذا البريد الإلكتروني لأنك، أو حاول شخص آخر، الوصول إلى حساب \"\n\"باستخدام البريد الإلكتروني %(email)s. ومع ذلك، ليس لدينا أي سجل لمثل هذا \"\n\"الحساب في قاعدة بياناتنا.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"إذا كنت أنت، فيمكنك التسجيل للحصول على حساب باستخدام الرابط أدناه.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"حساب غير معروف\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"بريد إلكتروني\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"البريد الالكتروني الحالي\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"التغيير إلى\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"ما زال عنوان البريد الإلكتروني الخاص بك بانتظار التوثيق.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"إلغاء التغيير\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"التغيير إلى\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"تغيير البريد الإلكتروني\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"تأكيد البريد الإلكتروني\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"يرجى تأكيد أن <a href=\\\"mailto:%(email)s\\\">%(email)s</a> هو عنوان بريد \"\n\"إلكتروني للمستخدم %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"فشل تأكيد %(email)s لأنه مؤكد بالفعل في حساب مختلف.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"هذا الرابط لتأكيد البريد الإلكتروني نتهت فترة صلاحيته أو إنه غير صالح. يرجى \"\n\"<a href=\\\"%(email_url)s\\\">طلب رابط جديد لتأكيد البريد الإلكتروني</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"إذا لم يكن لديك حساب، يرجى %(link)sالتسجيل%(end_link)s أولا.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"تسجيل الدخول باستعمال مفتاح مرور\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"أرسل لي كود تسجيل الدخول\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"تسجيل الخروج\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"هل تريد حقا تسجيل الخروج؟\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"لا يمكنك إزالة عنوان البريد الإلكتروني الرئيسي (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"تم إرسال رسالة تأكيد إلى العنوان %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"لقد أكدت عنوان البريد الإلكتروني %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"تمت إزالة عنوان البريد الإلكتروني %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"لقد سجلت الدخول بنجاح يا %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"تم تسجيل خروجك.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"تم إرسال كود تسجيل الدخول إلى %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"تم تغيير كلمة المرور بنجاح‪.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"تم إعداد كلمة المرور بنجاح‪.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"تم إرسال رمز التحقق إلى %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"لقد تحققت من رقم الهاتف %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"تم تعيين عنوان البريد الإلكتروني الرئيسي‪.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"غيّر كلمة المرور\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"هل نسيت كلمة المرور؟\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"هل نسيت كلمة المرور؟ أدخل عنوان البريد الإلكتروني أدناه، وسنرسل لك رسالة \"\n\"تتيح لك إعادة تعيينها.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"إعادة تعيين كلمة المرور\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"يرجى الاتصال بنا إذا كنت تواجه أي مشاكل في إعادة تعيين كلمة المرور.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"أرسلنا لك رسالة. إذا لم تصلك يرجى التحقق من صندوق الرسائل غير المرغوب فيها. \"\n\"اتصل بنا إذا لم تصل في غضون دقائق.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"كود غير صالح\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"رابط إعادة تعيين كلمة المرور غير صالح، ربما لأنه قد تم استخدامه مسبقا. يرجى \"\n\"طلب <a href=\\\"%(passwd_reset_url)s\\\">رابط جديد</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"تم تغيير كلمة مرورك الآن.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"تعيين كلمة مرور\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"تغيير الهاتف\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"رقم الهاتف الحالي\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"ما زال رقم الهاتف الخاص بك بانتظار التوثيق.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"تغيير الهاتف\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"أدخل كلمة المرور الخاص بك:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"ستتلقى كود خاص لتسجيل الدخول بدون كلمة مرور.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"كود الطلب\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"خيارات تسجيل الدخول الأخرى\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"التسجيل\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"الاشتراك\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"لديك حساب؟ %(link)sسجل الدخول%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"تسجيل باستعمال مفتاح مرور\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"التسجيل عن خلال مفتاح مرور\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"خيارات أخرى\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"الاشتراك مغلق\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"نحن آسفون‪:‬ الاشتراك مغلق حاليا‪.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"ملاحظة\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"تم تسجيل دخولك بالفعل يا %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"تحذير‪:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"ليس لديك أي بريد إلكتروني مضبوط. عليك حقا إضافة عنوان لكي تتلقى الإشعارات، \"\n\"وتعيد تعيين كلمة المرور، إلخ.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"التحقق من البريد الإلكتروني\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"لقد أرسلنا لك رسالة للتوثيق. اتبع الرابط المزود لإكمال عملية التسجيل. إذا لم \"\n\"ترى الرسالة في صندوقك الرئيسي، تحقق من صندوق الرسائل غير المرغوب فيها. يرجى \"\n\"التواصل معنا إذا لم تتلقى الرسالة في غضو دقائق.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"تتطلب هذه الصفحة توثيق هويتك.\\n\"\n\"لهذا نطلب منك توثيق ملكية\\n\"\n\" بريدك الإلكتروني. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"أرسلنا لك رسالة للتوثيق.\\n\"\n\"يرجى الضغط على الرابط في الرسالة. إذا لم ترى الرسالة في صندوقك الرئيسي، تحقق \"\n\"من صندوق الرسائل غير المرغوب فيها.\\n\"\n\"يرجى التواصل معنا إذا لم تتلقاه في غضون دقائق.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>ملاحظة:</strong> ما زال بإمكانك <a href=\\\"%(email_url)s\\\">تغيير \"\n\"البريد الإلكتروني</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"رسائل:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"قائمة:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"اتصالات الحساب\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"توثيق ذو عاملين\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"الجلسات\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"تفويض\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s يريد الوصول إلى حسابك في %(site_name)s.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"أدخل رمز الجهاز\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"أدخل الرمز المعروض على جهازك.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"المتابعة\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"تأكيد الجهاز\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"يرجى تأكيد الرمز المعروض على %(client_name)s الخاص بك لتفويض هذا الجهاز.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"رفض\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"تم تفويض الجهاز\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"لقد قمت بتفويض جهاز %(client_name)s الخاص بك بنجاح.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"تم رفض الجهاز\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"تم رفض التفويض لجهاز %(client_name)s الخاص بك.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"خطأ\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"البقاء مسجل الدخول\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"حسابك محمي بواسطة المصادقة الثنائية. الرجاء إدخال رمز المصادقة:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"تم إنشاء مجموعة جديدة من رموز استرداد المصادقة الثنائية.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"تم إنشاء رموز استرداد جديدة\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"تم تفعيل تطبيق المصادقة.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"تم تفعيل تطبيق المصادقة\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"تم تعطيل تطبيق المصادقة.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"تم تعطيل تطبيق المصادقة\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"أضيف مفتاح أمان جديد.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"تم إضافة مفتاح أمان\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"تم حذف مفتاح أمان.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"تم حذف مفتاح أمان\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"تطبيق المصادقة\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"المصادقة باستخدام تطبيق المصادقة نشطة.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"تطبيق المصادقة غير نشط.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"إلغاء التنشيط\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"تفعيل\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"مفاتيح أمان\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"أضفت %(count)s مفتاح أمان.\"\nmsgstr[1] \"أضفت مفتاح أمان واحد.\"\nmsgstr[2] \"أضفت مفتاحين أمان.\"\nmsgstr[3] \"أضفت %(count)s مفاتيح أمان.\"\nmsgstr[4] \"أضفت %(count)s مفتاح أمان.\"\nmsgstr[5] \"أضفت %(count)s مفتاح أمان.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"لم تُضاف مفاتيح أمان.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"إدارة\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"إضافة\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"رموز الاسترداد\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"هناك 6(unused_count)s من %(total_count)s رموز الاسترداد المتاحة.\"\nmsgstr[1] \"هناك 6(unused_count)s من %(total_count)s رموز الاسترداد المتاحة.\"\nmsgstr[2] \"هناك %(unused_count)s من %(total_count)s رموز الاسترداد المتاحة.\"\nmsgstr[3] \"هناك %(unused_count)s من %(total_count)s رموز الاسترداد المتاحة.\"\nmsgstr[4] \"هناك %(unused_count)s من %(total_count)s رموز الاسترداد المتاحة.\"\nmsgstr[5] \"هناك %(unused_count)s من %(total_count)s رموز الاسترداد المتاحة.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"لم يتم إعداد رموز الاسترداد.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"عرض\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"تحميل\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"يولد\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"تم إنشاء مجموعة جديدة من رموز الاسترداد.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"تم إضافة مفتاح أمان.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"تم حذف مفتاح أمان.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"أدخل كود تطبيق المصادقة:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"أنت على وشك إنشاء مجموعة جديدة من رموز الاسترداد لحسابك.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"سيؤدي هذا الإجراء إلى إبطال رموزك الحالية.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"هل أنت متأكد؟\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"رموز غير مستخدمة\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"تنزيل الرموز\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"توليد رموز جديدة\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"تفعيل تطبيق المصادقة\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"لحماية حسابك من خلال المصادقة الثنائية، قم بمسح رمز الاستجابة السريعة أدناه \"\n\"باستخدام تطبيق المصادقة الخاص بك. ثم أدخل رمز التحقق الذي أنشأه التطبيق \"\n\"أدناه.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"سر تطبيق المصادقة\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"يمكنك تخزين هذا السر واستخدامه لإعادة تثبيت تطبيق المصادقة الخاص بك في وقت \"\n\"لاحق.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"قم بإلغاء تنشيط تطبيق المصادقة\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"أنت على وشك إلغاء تنشيط المصادقة المستندة إلى تطبيق المصادقة. هل أنت متأكد؟\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"هل تثق بهذا المتصفح؟\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"إذا اخترت الوثوق بهذا المتصفح، فلن يُطلب منك رمز التحقق في المرة التالية التي \"\n\"تقوم فيها بتسجيل الدخول.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"الثقة لفترة %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"لا تثق\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"إضافة مفتاح أمان\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"إزالة مفتاح أمان\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"هل أنت متأكد أنك تريد إزالة مفتاح الأمان هذا؟\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"الاستخدام\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"مفتاح المرور\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"مفتاح أمان\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"هذا المفتاح لا يشير إلى ما إذا كان مفتاح المرور.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"غير محدد\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"تاريخ الإضافة: %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"تاريخ آخر استعمال: %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"تحرير\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"تغيير مفتاح الأمان\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"حفظ\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"إنشاء مفتاح مرور\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"أنت على وشك أن تنشأ مفتاح مرور لحسابك. يمكنك تعيين اسم وصفي لهذا المفتاح \"\n\"لتمييزه عن أي مفتاح مرور تضيفه لاحقا.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"إنشاء\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"تحتاج هذه العملية استعمال جافاسكرِبت.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"فشل تسجيل الدخول بحساب طرف ثالث\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"حدث خطأ أثناء محاولة تسجيل الدخول عن طريق حساب طرف ثالث.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"يمكنك تسجيل الدخول إلى حسابك باستخدام أي من حسابات الطرف الثالث التالية:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"ليس لديك حاليا أي حساب طرف ثالث متصل بهذا الحساب.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"إضافة حساب طرف ثالث\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"تم ربط حساب جهة خارجية من %(provider)s بحسابك.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"تم إضافة حساب طرف ثالث\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"تم قطع اتصال حساب جهة خارجية من %(provider)s بحسابك.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"تم إزالة حساب طرف ثالث\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"ربط %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"أنت على وشك ربط حساب طرف ثالث جديد من %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"تسجيل الدخول عبر %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"أنت على وشك تسجيل الدخول باستخدام حساب طرف ثالث من %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"تم إلغاء تسجيل الدخول\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"قد قررت إلغاء تسجيل الدخول إلى الموقع باستخدام أحد الحسابات الموجودة الخاصة \"\n\"بك. إذا كان هذا خطأ، الرجاء المتابعة إلى <a href=\\\"%(login_url)s\\\">تسجيل \"\n\"الدخول</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"تم ربط حساب طرف ثالث.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"تم قطع الاتصال بحساب الطرف الثالث.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"أنت على وشك استخدام حسابك من %(provider_name)s لتسجيل الدخول إلى \"\n\"%(site_name)s.\\n\"\n\"كخطوة أخيرة، يرجى ملء النموذج التالي:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"أو استخدم طرفًا ثالثًا\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"تم تسجيل الخروج من جميع الجلسات الأخرى.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"بدأت في\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"عنوان IP\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"المتصفح\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"شوهد آخر مرة في\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"حالي\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"تسجيل الخروج من الجلسات الأخرى\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"جلسات المستخدم\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"مفتاح جلسة\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"اتصالات الحساب\"\n\n#~ msgid \"Use security key or device\"\n#~ msgstr \"استخدم مفتاح او جهاز الحماية\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"كلمة المرور يجب أن لا تقل عن {0} حروف.\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"تلقيت هذه الرسالة لأنك أو أحد آخر طلب كلمة لحسابك.\\n\"\n#~ \"لكن ليس لدينا قيد مستخدم يستخدم عنوان البريد الإلكتروني %(email)s\\n\"\n#~ \"في قاعدة بياناتنا.\\n\"\n#~ \"\\n\"\n#~ \"يمكنك تجاهل هذه الرسالة بأمان إذا لم تطلب إعادة ضبط كلمة المرور.\\n\"\n#~ \"\\n\"\n#~ \"إذا كنت أنت من طلب، يمكنك تسجيل حساب باستخدام الرابط في الأسفل.\"\n\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"عناوين البريد الإلكتروني التالية مربوطة مع حسابك:\"\n\n#~ msgid \"Change Email Address\"\n#~ msgstr \"تغيير البريد الإلكتروني\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"يرجى تسجيل الدخول مع واحد من حسابات الطرف الثالث الموجودة لديك‪.‬\\n\"\n#~ \"كما يمكنك <a href=\\\"%(signup_url)s\\\">تسجيل</a> حساب\\n\"\n#~ \"في موقع %(site_name)s والدخول في الأسفل:\"\n\n#~ msgid \"or\"\n#~ msgstr \"أو\"\n\n#~ msgid \"change password\"\n#~ msgstr \"تغيير كلمة المرور\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"تسجيل الدخول عبر OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"عنوان البريد الإلكتروني هذا مقترن بالفعل بحساب آخر.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"لقد قمنا بإرسال رسالة اليك عبر البريد الإلكتروني. يرجى الاتصال بنا اذا \"\n#~ \"كنت لا تتلقى في غضون بضع دقائق.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"تسجيل الدخول و / أو كلمة المرور الذي حددته غير صحيحة.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"يمكن أن تحتوي أسماء المستخدمين إلا على الحروف، الأرقام و @/‪.‬/-/+/_.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"اسم المستخدم مسجل مسبقا. الرجاء اختيار اسم اخر‪.‬\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"لقد اكّدت ان <a href=\\\"mailto:%(email)s\\\">%(email)s</a> هو من إحدى عناوين \"\n#~ \"للمستعمل %(user_display)s.\"\n\n#~ msgid \"Thanks for using our site!\"\n#~ msgstr \"شكرا لاستخدام موقعنا!\"\n\n#~ msgid \"Confirmation email sent to %(email)s\"\n#~ msgstr \"ارسلت رسالة التأكيد الى بريدك الالكتروني %(email)s\"\n\n#~ msgid \"Delete Password\"\n#~ msgstr \"احذف كلمة المرور\"\n\n#~ msgid \"\"\n#~ \"You may delete your password since you are currently logged in using \"\n#~ \"OpenID.\"\n#~ msgstr \"بامكانك حذف كلمة المرور بما انك قمت بتسجيل الدخول بواسطة OpenID\"\n\n#~ msgid \"delete my password\"\n#~ msgstr \"احذف كلمة المرور الخاصة بي\"\n\n#~ msgid \"Password Deleted\"\n#~ msgstr \"تم حذف كلمة المرور\"\n"
  },
  {
    "path": "allauth/locale/az/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n# Translators:\n# Jeyhun Piriyev <jeihunpiriyev@gmail.com>, 2023\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: django-allauth\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-05-14 16:01+0000\\n\"\n\"Last-Translator: Elchin Aliyev <elchin.f.aliyev@gmail.com>\\n\"\n\"Language-Team: Azerbaijani <https://hosted.weblate.org/projects/allauth/\"\n\"django-allauth/az/>\\n\"\n\"Language: az\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 5.12-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Bu hesab hazırda aktiv deyil.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Siz əsas e-poçt ünvanınızı silə bilməzsiniz.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Bu e-poçt ünvanı artıq bu hesabla əlaqələndirilib.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Göstərdiyiniz e-poçt ünvanı və ya şifrə düzgün deyil.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Göstərdiyiniz istifadəçi adı və yaxud şifrə düzgün deyil.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"İstifadəçi artıq bu e-poçt ünvanı ilə qeydiyyatdan keçib.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Zəhmət olmasa cari şifrənizi yazın.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Yanlış kod.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Yanlış şifrə.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Etibarsız və ya müddəti bitmiş açar.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Etibarsız giriş.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Şifrə sıfırlama tokeni yanlışdır.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Siz %d-dən çox e-poçt ünvanı əlavə edə bilməzsiniz.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Bu telefon nömrəsi ilə artıq bir istifadəçi qeydiyyatdan keçib.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Həddindən artıq uğursuz giriş cəhdi. Biraz sonra yenidən cəhd edin.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Bu e-poçt ünvanı heç bir istifadəçi hesabına aid deyil.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Bu telefon nömrəsi heç bir istifadəçi hesabına aid deyil.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Əsas e-poçt ünvanınız təsdiqlənməlidir.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"İstifadəçi adı istifadə edilə bilməz. Zəhmət olmasa başqa istifadəçi adından \"\n\"istifadə edin.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Göstərdiyiniz istifadəçi adı və/yaxud şifrə düzgün deyil.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Zəhmət olmasa, yalnız birini seçin.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Yeni dəyər cari dəyərdən fərqli olmalıdır.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Səbirli olun, çox sayda sorğu göndərirsiniz.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Şifrənizi istifadə edin\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Autentifikator tətbiqi və ya kod istifadə edin\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Təhlükəsizlik açarı istifadə edin\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} doğrulanmış kimi işarələndi.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"{email} doğrulanmış kimi işarələmək mümkün olmadı.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Seçilmiş e-poçt ünvanlarını doğrulanmış kimi işarələ\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Hesablar\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-poçt\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"E-poçt ünvanı\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Ölkə kodu daxil olmaqla telefon nömrəsini daxil edin (məsələn, ABŞ üçün +1).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Hər dəfə eyni şifrəni daxil etməlisiniz.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Şifrə\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Məni xatırla\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"İstifadəçi adı\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Daxil ol\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"İstifadəçi adı, e-poçt və ya telefon\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"İstifadəçi adı və ya e-poçt\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"İstifadəçi adı və ya telefon\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-poçt və ya telefon\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Şifrəni unutmusan?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-poçt (təkrar)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"E-poçt ünvanı təsdiqi\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-poçt (istəyə bağlı)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"İstifadəçi adı (istəyə bağlı)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Hər dəfə eyni e-poçtu daxil etməlisiniz.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Şifrə (təkrar)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Mövcud şifrə\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Yeni şifrə\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Yeni şifrə (təkrar)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kod\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"istifadəçi\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"e-poçt ünvanı\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"doğrulanmış\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"əsas\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"e-poçt ünvanları\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"yaradılmış\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"göndərildi\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"açar\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"e-poçt təsdiqi\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"e-poçt təsdiqləri\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Başsız\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"İstifadəçi ID-nizi görüntüləyin\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"E-poçt ünvanınıza baxın\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Əsas profil məlumatlarınıza baxın\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"İcazələri verin\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"'URI joker simvollarına icazə ver' aktivləşdirilmədikcə joker simvollara \"\n\"icazə verilmir.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' birdən çox joker simvol (*) ehtiva edir. Hər URI üçün yalnız bir \"\n\"joker simvola icazə verilir.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Joker simvollara yalnız URI-nin host hissəsində icazə verilir.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Avtorizasiya kodu\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Cihaz kodu\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Müştəri etimadnaməsi\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Yeniləmə tokeni\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Gizli\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Açıq\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Müştərinin tələb etməyə icazəsi olan əhatə dairəsi. Hər sətrdə bir dəyər \"\n\"daxil edin, məsələn: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Müştəri heç bir əhatə dairəsi göstərmədikdə, bu standart əhatə dairələri \"\n\"istifadə olunur. Hər sətrdə bir dəyər daxil edin, məsələn: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"İcazə verilən təqdimat növlərinin siyahısı. Hər sətrdə bir dəyər daxil edin, \"\n\"məsələn: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Çarpaz mənbə sorğuları üçün icazə verilən mənbələrin siyahısı, hər sətrdə \"\n\"bir ədəd.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Yönləndirmə URI-lərində və CORS mənbələrində joker simvollara (*) icazə \"\n\"verin. Aktivləşdirildikdə, URI-lər alt domenlərə uyğun gəlmək üçün tək ulduz \"\n\"ehtiva edə bilər.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"İcazə verilən cavab növlərinin siyahısı. Hər sətrdə bir dəyər daxil edin, \"\n\"məsələn: code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"müştəri\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"müştərilər\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Siz iki faktorlu doğrulama ilə qorunan hesaba e-poçt ünvanı əlavə edə \"\n\"bilməzsiniz.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Siz iki faktorlu doğrulamanı deaktiv edə bilməzsiniz.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"İki faktorlu doğrulama aktivləşdirilmədən bərpa kodları yarada bilməzsiniz.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Siz e-poçt ünvanınızı doğrulamayana qədər iki faktorlu doğrulamanı \"\n\"aktivləşdirə bilməzsiniz.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Əsas açar\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Ehtiyat açar\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Açar nr. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Bərpa kodları\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP Autentifikator\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Doğrulama kodu\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Şifrəsiz\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Şifrəsiz əməliyyatın aktivləşdirilməsi yalnız bu açardan istifadə edərək \"\n\"daxil olmağa imkan verir, lakin biometrika və ya PIN qorunması kimi əlavə \"\n\"tələblər qoyur.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Bu e-poçt ünvanı ilə artıq hesab mövcuddur. Lütfən, əvvəlcə həmin hesaba \"\n\"daxil olun, sonra %s hesabınızı birləşdirin.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Yanlış token.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Hesabınızda şifrə quraşdırılmayıb.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Hesabınızın təsdiqlənmiş e-poçt ünvanı yoxdur.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Son qalan üçüncü tərəf hesabınızın əlaqəsini kəsə bilməzsiniz.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Üçüncü tərəf hesabı artıq başqa hesaba bağlıdır.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Sosial Hesablar\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"provayder\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"provayder ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"ad\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"müştəri id\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"Tətbiq ID-si və ya istehlakçı açarı\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"gizli açar\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API sirri, müştəri sirri və ya istehlakçı sirri\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Açar\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"sosial tətbiq\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"sosial tətbiqlər\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"son giriş\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"qoşulma tarixi\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"əlavə məlumat\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"sosial hesab\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"sosial hesablar\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) və ya giriş tokeni (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"token sirri\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) və ya token yeniləyin (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"vaxtı bitir\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"sosial tətbiq tokeni\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"sosial tətbiq tokenləri\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Yanlış profil məlumatı\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Daxil ol\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Ləğv et\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"\\\"%s\\\"-dən sorğu tokeni alınarkən yanlış cavab alındı. Cavab belə oldu: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\"-dən giriş tokeni əldə edərkən yanlış cavab alındı.\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\" üçün heç bir sorğu tokeni saxlanılmadı.\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\" üçün heç bir giriş tokeni saxlanılmadı.\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\" ünvanında şəxsi resurslara giriş yoxdur.\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\"-dən sorğu tokeni alınarkən uğursuz cavab alındı.\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Hesab Aktiv Deyil\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Bu hesab aktiv deyil.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"%(recipient)s ünvanına kod göndərdik. Kodun müddəti tezliklə bitir, ona görə \"\n\"zəhmət olmasa tezliklə daxil edin.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Təsdiq edin\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Yeni kod tələb et\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Girişi Təsdiqlə\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Hesabınızı qorumaq üçün lütfən, yenidən doğrulayın.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Alternativ variantlar\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"E-poçt Doğrulama\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"E-poçt Doğrulama Kodunu Daxil Edin\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Fərqli e-poçt ünvanı istifadə edin\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Daxil Ol\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Giriş Kodunu Daxil Edin\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Şifrə Sıfırlama\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Şifrə Sıfırlama Kodunu Daxil Edin\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Telefon Doğrulama\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Telefon Doğrulama Kodunu Daxil Edin\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Fərqli telefon nömrəsi istifadə edin\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"E-poçt Ünvanları\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Aşağıdakı e-poçt ünvanları hesabınızla əlaqələndirilir:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Doğrulanmış\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Doğrulanmamış\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Əsas\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Əsas Et\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Doğrulamanı Yenidən Göndər\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Sil\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"E-poçt Ünvanı Əlavə Et\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"E-poçt Əlavə Et\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Həqiqətən seçilmiş e-poçt ünvanını silmək istəyirsiniz?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Siz və ya başqası e-poçt ünvanından istifadə edərək\\n\"\n\"hesab üçün qeydiyyatdan keçməyə çalışdığınız üçün bu e-məktubu alırsınız:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Lakin həmin e-poçt ünvanından istifadə edən hesab artıq mövcuddur. Bunu \"\n\"unutmusunuzsa, lütfən, hesabınızı bərpa etmək üçün unudulmuş şifrə \"\n\"prosedurundan istifadə edin:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Hesab Artıq Mövcuddur\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"%(site_name)s-dan Salam!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"%(site_name)s!\\n\"\n\"%(site_domain)s istifadə etdiyiniz üçün təşəkkür edirik\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"Bu məktubu alırsınız, çünki hesabınızda aşağıdakı dəyişiklik edildi:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Bu dəyişikliyi tanımırsınızsa, dərhal lazımi təhlükəsizlik tədbirləri görün. \"\n\"Hesabınızdakı dəyişiklik aşağıdakı mənbədəndir:\\n\"\n\"\\n\"\n\"- IP ünvanı: %(ip)s\\n\"\n\"- Brauzer: %(user_agent)s\\n\"\n\"- Tarix: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"E-poçtunuz %(from_email)s-dən %(to_email)s-ə dəyişdirildi.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"E-poçt Dəyişdirildi\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"E-poçtunuz təsdiqləndi.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"E-poçt Təsdiqi\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"%(user_display)s istifadəçisi %(site_domain)s-də hesab qeydiyyatından keçmək \"\n\"üçün e-poçt ünvanınızı verdiyinə görə bu e-məktubu alırsınız.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"E-poçt doğrulama kodunuz aşağıda verilmişdir. Zəhmət olmasa onu açıq brauzer \"\n\"pəncərənizdə daxil edin.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Bunun düzgün olduğunu təsdiqləmək üçün %(activate_url)s ünvanına keçin\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Lütfən e-poçt ünvanınızı təsdiqləyin\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"%(deleted_email)s e-poçt ünvanı hesabınızdan silindi.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"E-poçt Silindi\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Giriş kodunuz aşağıda verilmişdir. Zəhmət olmasa onu açıq brauzer \"\n\"pəncərənizdə daxil edin.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Bu hərəkəti siz başlatmamısınızsa, bu məktubu etinasız qoya bilərsiniz.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Giriş Kodu\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Şifrəniz dəyişdirildi.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Şifrə Dəyişdirildi\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Şifrə sıfırlama kodunuz aşağıda verilmişdir. Zəhmət olmasa onu açıq brauzer \"\n\"pəncərənizdə daxil edin.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Şifrə Sıfırlama Kodu\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Siz və ya başqa biri hesabınız üçün şifrə sıfırlamasını tələb etdiyinə görə \"\n\"bu e-məktubu alırsınız.\\n\"\n\"Əgər belə bir sorğu etməmisinizsə, bu e-məktubu gözardı edə bilərsiniz. \"\n\"Şifrənizi sıfırlamaq üçün aşağıdakı linkə keçid edin.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Əgər unutmusunuzsa, istifadəçi adınız %(username)s-dir.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Şifrə Sıfırlama E-poçtu\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Şifrəniz sıfırlandı.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Şifrəniz təyin edildi.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Şifrə Təyin Edildi\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Bu e-məktubu alırsınız, çünki siz və ya başqa biri %(email)s e-poçt ünvanı \"\n\"ilə hesaba daxil olmağa çalışıb. Lakin verilənlər bazamızda belə bir hesab \"\n\"qeydimiz yoxdur.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Bu siz idinizsə, aşağıdakı linkdən istifadə edərək hesab yarada bilərsiniz.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Naməlum Hesab\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"E-poçt Ünvanı\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Mövcud e-poçt\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Dəyişdirilir\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"E-poçt ünvanınız hələ də doğrulamanı gözləyir.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Dəyişikliyi Ləğv Et\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Dəyiş\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"E-poçt Dəyiş\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"E-poçt Ünvanını Təsdiqlə\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Lütfən, təsdiq edin ki, <a href=\\\"mailto:%(email)s\\\">%(email)s</a> \"\n\"%(user_display)s istifadəçisi üçün e-poçt ünvanıdır.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"%(email)s-u təsdiqləmək mümkün deyil, çünki, o, artıq başqa hesab tərəfindən \"\n\"təsdiqlənib.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Bu e-poçt təsdiqi linkinin vaxtı keçib və ya etibarsızdır. Lütfən, <a \"\n\"href=\\\"%(email_url)s\\\">yeni e-poçt təsdiq sorğusu göndərin</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Hələ hesab yaratmamısınızsa, lütfən, əvvəlcə %(link)sqeydiyyatdan \"\n\"keçin%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Giriş açarı ilə daxil olun\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Mənə giriş kodu göndərin\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Çıxış\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Hesabdan çıxmaq istədiyinizə əminsiniz?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Siz əsas e-poçt ünvanınızı (%(email)s) silə bilməzsiniz.\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Təsdiq e-məktubu %(email)s ünvanına göndərildi.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Siz %(email)s-u təsdiqlədiniz.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"%(email)s e-poçt ünvanı silindi.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"%(name)s olaraq uğurla daxil oldun.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Siz hesabdan çıxdınız.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"%(recipient)s ünvanına giriş kodu göndərildi.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Şifrə uğurla dəyişdirildi.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Şifrə uğurla təyin edildi.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"%(phone)s nömrəsinə doğrulama kodu göndərildi.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"%(phone)s telefon nömrəsini doğruladınız.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Əsas e-poçt ünvanı təyin edildi.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Şifrəni Dəyiş\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Şifrəni Unutmusunuz?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Şifrənizi unutmusunuz? Aşağıya e-poçt ünvanınızı daxil edin və biz sizə onu \"\n\"sıfırlamağa imkan verən e-məktub göndərəcəyik.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Şifrəmi Sıfırlayın\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Şifrənizi sıfırlamaqla bağlı hər hansı probleminiz olarsa, bizimlə əlaqə \"\n\"saxlayın.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Sizə e-məktub göndərdik. Əgər onu almamısınızsa, spam qovluğunuzu yoxlayın. \"\n\"Əks halda, bir neçə dəqiqə ərzində onu almasanız, bizimlə əlaqə saxlayın.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Yanlış Token\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Şifrə sıfırlama linki etibarsız idi, ola bilsin ki, artıq istifadə olunub. \"\n\"Lütfən, <a href=\\\"%(passwd_reset_url)s\\\">yeni şifrə sıfırlamasını</a> tələb \"\n\"edin.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Şifrəniz dəyiştirildi.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Şifrə Təyin Et\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Telefonu Dəyiş\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Mövcud telefon\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Telefon nömrəniz hələ də doğrulamanı gözləyir.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Telefonu Dəyiş\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Şifrənizi daxil edin:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Şifrəsiz giriş üçün xüsusi kod alacaqsınız.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Kod Tələb Et\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Digər giriş seçimləri\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Qeydiyyatdan keçin\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Qeydiyyatdan Keç\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Artıq bir hesabınız var? Lütfən %(link)sdaxil olun%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Giriş açarı ilə qeydiyyatdan keçin\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Giriş Açarı ilə Qeydiyyat\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Digər seçimlər\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Qeydiyyat Bağlıdır\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Üzr istəyirik, lakin qeydiyyat hazırda bağlıdır.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Qeyd\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Siz artıq %(user_display)s kimi daxil olmusunuz.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Xəbərdarlıq:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Hazırda ayarlanmış e-poçt ünvanınız yoxdur. Siz mütləq e-poçt ünvanı əlavə \"\n\"etməlisiniz ki, bildirişlər ala, şifrənizi sıfırlayasınız və s.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"E-poçt Ünvanınızı Doğrulayın\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Doğrulama üçün sizə e-məktub göndərdik. Qeydiyyat prosesini yekunlaşdırmaq \"\n\"üçün verilən linki izləyin. Doğrulama e-məktubunu əsas gələnlər qutunuzda \"\n\"görmürsünüzsə, spam qovluğunuzu yoxlayın. Bir neçə dəqiqə ərzində doğrulama \"\n\"e-məktubunu almasanız, bizimlə əlaqə saxlayın.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Saytın bu hissəsi siz olduğunuzu təsdiq etməyimizi tələb edir\\n\"\n\".Bu məqsədlə sizdən e-poçt ünvanınızın sahibliyini\\n\"\n\"doğrulamanızı tələb edirik.\"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Doğrulama üçün\\n\"\n\"sizə e-məktub göndərdik. Zəhmət olmasa həmin e-poçtun içindəki linkə keçid \"\n\"edin. Doğrulama e-poçtunu əsas gələnlər qutunuzda görmürsünüzsə, spam \"\n\"qovluğunuzu yoxlayın. Əks halda\\n\"\n\"bir neçə dəqiqə ərzində onu almasanız, bizimlə əlaqə saxlayın.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Qeyd:</strong> siz hələ də <a href=\\\"%(email_url)s\\\">e-poçt \"\n\"ünvanınızı dəyişə bilərsiniz</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Mesajlar:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menyu:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Hesab Əlaqələri\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"İki Faktorlu Doğrulama\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sessiyalar\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"İcazə ver\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s %(site_name)s hesabınıza daxil olmaq istəyir.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Cihaz Kodunu Daxil Edin\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Cihazınızda göstərilən kodu daxil edin.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Davam et\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Cihazı Təsdiq Et\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Bu cihazı avtorizasiya etmək üçün %(client_name)s-da göstərilən kodu təsdiq \"\n\"edin.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Rədd et\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Cihaz Avtorizasiya Edildi\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"%(client_name)s cihazınızı uğurla avtorizasiya etdiniz.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Cihaz Rədd Edildi\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"%(client_name)s cihazınız üçün avtorizasiya rədd edildi.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Xəta\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Daxil Olmuş Qal\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Hesabınız iki faktorlu doğrulama ilə qorunur. Zəhmət olmasa autentifikator \"\n\"kodunu daxil edin:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"Yeni iki faktorlu doğrulama bərpa kodları dəsti yaradıldı.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Yeni Bərpa Kodları Yaradıldı\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Autentifikator tətbiqi aktivləşdirildi.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Autentifikator Tətbiqi Aktivləşdirildi\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Autentifikator tətbiqi deaktiv edildi.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Autentifikator Tətbiqi Deaktiv Edildi\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Yeni təhlükəsizlik açarı əlavə edildi.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Təhlükəsizlik Açarı Əlavə Edildi\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Təhlükəsizlik açarı silindi.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Təhlükəsizlik Açarı Silindi\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Autentifikator Tətbiqi\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Autentifikator tətbiqindən istifadə edərək doğrulama aktivdir.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Autentifikator tətbiqi aktiv deyil.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Deaktiv et\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktivləşdir\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Təhlükəsizlik Açarları\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"%(count)s təhlükəsizlik açarı əlavə etdiniz.\"\nmsgstr[1] \"%(count)s təhlükəsizlik açarı əlavə etdiniz.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Heç bir təhlükəsizlik açarı əlavə edilməyib.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"İdarə et\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Əlavə et\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Bərpa kodları\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"%(total_count)s bərpa kodundan %(unused_count)s-i mövcuddur.\"\nmsgstr[1] \"%(total_count)s bərpa kodundan %(unused_count)s-i mövcuddur.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Bərpa kodları qurulmayıb.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Bax\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Yüklə\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Yarat\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Yeni bərpa kodları dəsti yaradıldı.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Təhlükəsizlik açarı əlavə edildi.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Təhlükəsizlik açarı silindi.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Autentifikator kodunu daxil edin:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Hesabınız üçün yeni bərpa kodları dəsti yaratmaq üzrəsiniz.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Bu əməliyyat mövcud kodlarınızı etibarsız edəcək.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Siz əminsiniz?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"İstifadə edilməmiş kodlar\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Kodları yükləyin\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Yeni kodlar yarat\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Autentifikator Tətbiqini Aktivləşdirin\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Hesabınızı iki faktorlu doğrulama ilə qorumaq üçün autentifikator \"\n\"tətbiqinizlə aşağıdakı QR kodunu skan edin. Sonra, aşağıdakı proqram \"\n\"tərəfindən yaradılan doğrulama kodunu daxil edin.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Autentifikator sirri\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Siz bu sirri saxlaya və ondan autentifikator tətbiqinizi daha sonra yenidən \"\n\"quraşdırmaq üçün istifadə edə bilərsiniz.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Autentifikator Tətbiqini Deaktiv Et\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Siz autentifikator tətbiqinə əsaslanan doğrulamanı deaktiv etmək üzrəsiniz. \"\n\"Siz əminsiniz?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Bu Brauzerə Güvənirsiniz?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Bu brauzerə güvənməyi seçsəniz, növbəti dəfə daxil olarkən sizdən doğrulama \"\n\"kodu istənilməyəcək.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"%(period)s müddətinə güvən\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Güvənmə\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Təhlükəsizlik Açarı Əlavə Et\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Təhlükəsizlik Açarını Sil\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Bu təhlükəsizlik açarını silmək istədiyinizə əminsiniz?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"İstifadə\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Giriş açarı\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Təhlükəsizlik açarı\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Bu açar giriş açarı olub-olmadığını göstərmir.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Müəyyən edilməyib\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"%(created_at)s tarixində əlavə edildi\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Son istifadə %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Redaktə et\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Təhlükəsizlik Açarını Redaktə Et\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Saxla\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Giriş Açarı Yarat\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Hesabınız üçün giriş açarı yaratmaq üzrəsiniz. Daha sonra əlavə açarlar \"\n\"əlavə edə biləcəyiniz üçün açarları fərqləndirmək üçün təsviri ad istifadə \"\n\"edə bilərsiniz.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Yarat\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Bu funksionallıq JavaScript tələb edir.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Üçüncü Tərəf Giriş Xətası\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Üçüncü tərəf hesabınız vasitəsilə daxil olmağa cəhd edərkən xəta baş verdi.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Aşağıdakı üçüncü tərəf hesablarından hər hansı birini istifadə edərək \"\n\"hesabınıza daxil ola bilərsiniz:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Hazırda bu hesaba bağlı heç bir üçüncü tərəf hesabınız yoxdur.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Üçüncü Tərəf Hesabı Əlavə Et\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"%(provider)s-dən üçüncü tərəf hesabı hesabınıza bağlandı.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Üçüncü Tərəf Hesabı Bağlandı\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"%(provider)s-dən üçüncü tərəf hesabının hesabınızla əlaqəsi kəsildi.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Üçüncü Tərəf Hesabının Əlaqəsi Kəsildi\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"%(provider)s ilə əlaqə\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Siz %(provider)s-dən yeni üçüncü tərəf hesabını qoşmaq üzrəsiniz.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"%(provider)s vasitəsi ilə daxil olun\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Siz %(provider)s-dən üçüncü tərəf hesabından istifadə etməklə daxil olmaq \"\n\"üzrəsiniz.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Giriş Ləğv Edildi\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Mövcud hesablarınızdan birini istifadə edərək saytımıza daxil olmağı ləğv \"\n\"etmək qərarına gəldiniz. Bu səhvdirsə, <a href=\\\"%(login_url)s\\\">daxil olun</\"\n\"a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Üçüncü tərəf hesabı bağlandı.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Üçüncü tərəf hesabının əlaqəsi kəsildi.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Siz \\n\"\n\" %(site_name)s hesabına daxil olmaq üçün %(provider_name)s hesabınızdan \"\n\"istifadə etmək üzrəsiniz. Son addım olaraq, aşağıdakı formu doldurun:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Və ya üçüncü tərəf istifadə edin\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Bütün digər sessiyalardan çıxıldı.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Başlama Vaxtı\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP Ünvanı\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Brauzer\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Son görülmə\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Mövcud\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Digər Sessiyalardan Çıx\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"İstifadəçi Sessiyaları\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"sessiya açarı\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Hesab Əlaqələri\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Şifrə ən az {0} simvoldan ibarət olmalıdır.\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Sizin və ya başqa birinin istifadəçi hesabınız üçün\\n\"\n#~ \"şifrə tələb etdiyini bildirmək üçün bu e-məktubu alırsınız. Lakin, bizim \"\n#~ \"verilənlər bazamızda\\n\"\n#~ \"%(email)s e-poçt ünvanına sahib heç bir istifadəçi məlumatı yoxdur.\\n\"\n#~ \"\\n\"\n#~ \"Şifrənin sıfırlanmasını tələb etməmisinizsə, bu e-məktubu gözardı edə \"\n#~ \"bilərsiniz.\\n\"\n#~ \"\\n\"\n#~ \"Əgər bu siz idinizsə, siz aşağıdakı linkdən istifadə edərək hesaba daxil \"\n#~ \"ola bilərsiniz.\"\n\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Aşağıdakı e-poçt ünvanı hesabınızla əlaqələndirilib:\"\n\n#~ msgid \"Change Email Address\"\n#~ msgstr \"E-poçt Ünvanını Dəyiş\"\n"
  },
  {
    "path": "allauth/locale/bg/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-07-25 20:23+0200\\n\"\n\"Last-Translator: Ilia Iliev <p3sh0tr4mv4y4@gmail.com>\\n\"\n\"Language-Team: Bulgarian <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/bg/>\\n\"\n\"Language: bg\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 5.12-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Този акаунт в момента е неактивен.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Не можете да премахнете основния си имейл адрес.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Този имейл адрес вече е свързан с този акаунт.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"E-mail адресът и/или паролата, които въведохте, са грешни.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Телефонният номер и/или паролата, които въведохте, са грешни.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Вече има регистриран потребител с този имейл адрес.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Моля, въведете вашата текуща парола.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Неправилен код.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Грешна парола.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Грешен или изтекъл ключ.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Невалиден вход.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Невалиден код за възстановяване на парола.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Не можете да добавяте повече от %d e-mail адреса.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Вече има регистриран потребител с този телефонен номер.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Твърде много неуспешни опити за влизане. Опитайте отново по-късно.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Няма потребител с този e-mail адрес.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Няма потребител с този телефонен номер.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Основният ви e-mail адрес трябва да бъде потвърден.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"Това потребителско име не може да бъде използвано. Моля, изберете друго.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Потребителското име и/или паролата, които въведохте, са грешни.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Моля изберете само една опция.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Новата стойност трябва да е различна от настоящата.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Бъдете търпеливи, изпращате твърде много трафик.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Използвайте парола\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Използвайте апликация за автентикация или код\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Използвайте код за сигурност\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Имейл адрес {email} е маркиран като потвърден.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Неуспешно маркиране на {email} като потвърден.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Изберете имейл адресите като верифицирани\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Акаунти\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"E-mail адрес\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Въведете телефонен номер с код на държавата (+359 за България).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Телефон\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Трябва да въведете една и съща парола.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Парола\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Запомни ме\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Потребителско име\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Акаунт\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Потребителско име, e-mail или телефонен номер\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Потребителско име или e-mail\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Потребителско име или телефон\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-mail или телефонен номер\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Забрави си паролата?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-mail (отново)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Потвърждение на e-mail адрес\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-mail (опционален)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Потребителско име(по избор)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Трябва да въведете един и същ email.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Парола (отново)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Текуща парола\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Нова парола\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Нова парола (отново)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Код\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"потребител\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"e-mail адрес\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"потвърден\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"основен\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"email адреси\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"създадено\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"изпратено\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"ключ\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"email потвърждение\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"email потвърждения\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Скрит режим\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Преглед на вашия потребителски идентификатор\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Преглед на вашия имейл адрес\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Преглед на основната информация за вашия профил\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Предоставяне на разрешения\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Заместващи символи (*) не са разрешени, освен ако не е включена опцията \"\n\"'Разрешаване на заместващи символи в URI'.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' съдържа повече от един заместващ символ (*). Разрешен е само един \"\n\"заместващ символ за URI.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"\"\n\"Заместващи символи (*) са разрешени само в частта за име на хост от URI.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Код за оторизация\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Код на устройство\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Клиентски идентификационни данни\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Токен за обновяване\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Поверителен\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Публичен\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Обхват(ите), които клиентът има право да заявява. Въведете по една стойност \"\n\"на ред, напр.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"В случай че клиентът не посочи обхват, се използват тези по подразбиране. \"\n\"Въведете по една стойност на ред, напр.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Списък с разрешени типове разрешения. Въведете по една стойност на ред, \"\n\"напр.: authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"Списък с разрешени източници за cross-origin заявки, по един на ред.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Разрешаване на заместващи символи (*) в URI за пренасочване и CORS \"\n\"източници. Когато е включено, URI адресите могат да съдържат една звездичка \"\n\"за съвпадение на поддомейни.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Списък с разрешени типове отговори. Въведете по една стойност на ред, напр.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"клиент\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"клиенти\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Не можете да добавите имейл адрес към акаунт, който ползва двустепенна \"\n\"защита.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Не можете да деактивирате двустепенна защита.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Не можете да генерирате кодове за възстановяване, без да сте включили \"\n\"двустепенна защита.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Не можете да активирате двустепенна защита, преди да сте верифицирали имейл \"\n\"адреса си.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Основен ключ\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Резервен ключ\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Ключ №{number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Кодове за възстановяване\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP Автентикатор\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Автентикиращ код\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Без парола\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Включвайки режим без парола Ви позволява да се вписвате чрез ключ, но има \"\n\"допълнителни изисквания например биометрични данни или защита с ПИН код.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Вече съществува акаунт с този имейл адрес. Моля, първо влезте в този акаунт \"\n\"и тогава свържете вашия %s акаунт.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Грешен код.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Вашият акаунт няма парола.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Вашият акаунт няма потвърден e-mail адрес.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Не можете да прекъснете последната си връзка към външен акаунт.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Този акаунт вече е свързан с друг акаунт.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Социални акаунти\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"доставчик\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"Идентификатор на доставчик\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"име\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"id на клиент\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"ID на приложение, или ключ на консуматор\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"таен ключ\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"таен ключ на API, клиент или консуматор\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Ключ\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"социално приложение\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"социални приложения\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"УИД\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"последно влизане\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"дата на регистрация\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"допълнителни данни\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"социален акаунт\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"социални акаунти\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"код\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) или access token (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"таен код\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) или refresh token (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"изтича\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"код на социално приложение\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"кодове на социални приложения\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Невалидни профилни данни\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Влизане\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Откажи\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Грешен отговор при получаване на код за заявка от \\\"%s\\\". Отговорът беше: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Грешен отговор при получаване на код за достъп от \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Няма запазен код за заявка за \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Няма запазен код за достъп за \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Няма достъп до лични данни при \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Грешен отговор при получаване на код за заявка от \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Неактивен акаунт\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Този акаунт е неактивен.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Изпратихме Ви код за потвърждение на %(recipient)s. Кода изтича скоро, моля \"\n\"въведете го скоро.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Потвърди\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Поискай нов ключ\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Потвърждение на достъпа\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Моля, влезте отново, за да потвърдим сигурността на акаунта Ви.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Алтернативи\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Имейл за потвърждение\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Въведете код за потвърждение от имейла\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Използвайте друг e-mail адрес\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Вход\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Въведете код за влизане\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Възстановяване на парола\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Въведете код за възстановяване на паролата\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Потвърждение с телефонен номер\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Въведете код за потвърждение от телефона\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Използвайте друг телефонен номер\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"E-mail адреси\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Следните e-mail адреси са свързани с вашия акаунт:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Потвърден\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Непотвърден\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Основен\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Направи основен\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Изпрати потвърждение отново\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Премахни\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Добяне на е-mail адрес\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Добави e-mail\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Наистина ли искате да премахнете избрания e-mail адрес?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Получавате този имейл, защото Вие или някой друг се опитва да влезе в \\n\"\n\"акаунт използващ този имейл:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Въпреки това, акаунт с този имейл адрес вече съществува. Ако сте\\n\"\n\"забравили за този акаунт, моля използвайте процедурата за възстановяване\\n\"\n\"на паролата, за да възстановите достъпа до него:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Акаунтът вече съществува\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Здравейте от %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Благодарим, че ползвате %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Получавате този имейл, защото бяха направени следните промени по Вашият \"\n\"акаунт:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Ако не разпознавате тези промени, моля вземете мерки за сигурността веднага. \"\n\"Първоизточникът на промените е от:\\n\"\n\"\\n\"\n\"- IP адрес: %(ip)s\\n\"\n\"- Браузър: %(user_agent)s\\n\"\n\"- Дата: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Имейлът Ви беше променен от %(from_email)s на %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Имейлът е променен\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Имейлът Ви беше потвърден.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Имейл потвърждение\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Получавате този имейл, защото потребител %(user_display)s е дал Вашият имейл \"\n\"адрес, за да регистрира акаунт в %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Можете да откриете Вашият код за верификация по-долу. Моля, въведете го в \"\n\"отворения прозорец на браузъра.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"За да потвърдите, моля посетете %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Моля, потвърдете вашия e-mail адрес\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"Имейлът %(deleted_email)s е премахнат от Вашият акаунт.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Премахнат имейл\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Вашият код за влизане е посочен по-долу. Моля, въведете го в отворения \"\n\"прозорец на браузъра.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Този имейл може да бъде игнориран безопасно, ако не сте инициирали това \"\n\"действие.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Код за влизане\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Паролата Ви е променена.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Паролата е сменена\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Вашият код за смяна на паролата е посочен по-долу. Моля, въведете го в \"\n\"отворения прозорец на браузъра.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Код за възстановяване на паролата\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Получавате този имейл, защото Вие или някой друг е поискал смяна на парола \"\n\"за Вашия потребителски акаунт.\\n\"\n\"Можете да го пренебрегнете, ако не сте поискали възстановяване на парола. \"\n\"Кликнете линка по-долу за да възстановите Вашата парола.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"В случай, че сте забравили, вашето потребителско име е %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Възстановяване на парола\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Паролата Ви е сменена.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Паролата Ви е сменена.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Зададена парола\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Получавате този имейл, защото Вие или някой друг се опита да влезе в акаунт \"\n\"с имейл адрес %(email)s. Въпреки това, нямаме запис за такъв акаунт в нашата \"\n\"база данни.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"Ако сте Вие, можете да се впишете за акаунт използвайки линка по-долу.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Неразпознат акаунт\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Имейл адрес\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Текущ имейл\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Промяна към\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Вашият имейл адрес все още очаква потвърждение.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Прекъсване на промяна\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Промяна към\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Промяна на имейл\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Потвърждение на e-mail адрес\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Моля, потвърдете, че <a href=\\\"mailto:%(email)s\\\">%(email)s</a> е имейл \"\n\"адрес на потребител %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Не може да се потвърди %(email)s, защото вече е потвърден от различен акаунт.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Този линк за потвърждение на имейла е изтекъл или невалиден. Моля, <a \"\n\"href=\\\"%(email_url)s\\\">подайте нова заявка за потвърждение на e-mail</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Ако все още не сте създали акаунт, моля, %(link)sрегистрирайте \"\n\"се%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Влизане с код за достъп\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Изпрати ми ключ за влизане\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Изход\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Сигурни ли сте, че искате да излезете?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Не можете да премахнете основния си e-mail адрес (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Потвърждение на e-mail адрес изпратено на %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Потвърдихте e-mail адрес %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Премахнат e-mail адрес %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Успешно влязохте като %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Излязохте.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Ключ за влизане беше изпратен на %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Паролата беше сменена успешно.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Паролата беше запазена успешно.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Ключ за верификация беше изпратен на %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Потвърдили сте телефонен номер %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Основният e-mail адрес беше избран.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Смяна на парола\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Забравена парола?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Забравили сте паролата си? Въведете вашия имейл адрес по-долу и ще ви \"\n\"изпратим имейл с инструкции за нулиране на паролата.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Възстанови паролата ми\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Моля, свържете се с нас, ако имате проблеми с възстановяването на вашата \"\n\"парола.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Изпратихме Ви имейл. Ако не сте го получили, моля, проверете папката със \"\n\"спам. Ако все пак не го получите в рамките на няколко минути, моля, свържете \"\n\"се с нас.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Грешен код\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Линкът за възстановяване на парола е невалиден, може би защото вече е бил \"\n\"използван. Моля, заявете <a href=\\\"%(passwd_reset_url)s\\\">ново \"\n\"възстановяване на парола</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Паролата ви е сменена.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Създаване на парола\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Промяна на телефон\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Текущ телефонен номер\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Вашият телефонен номер все още очаква потвърждение.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Промяна на телефон\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Напишете паролата си:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Ще получите специален код за влизане без парола.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Поискай ключ\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Други опции за влизане\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Регистрация\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Регистрация\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Вече имате акаунт? Тогава, моля, %(link)sвлезте%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Регистрация с ключ за достъп\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Регистрация с ключ за достъп\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Други опции\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Регистрацията е затворена\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Съжаляваме, но в момента регистрацията е затворена.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Забележка\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"вече сте влезли като %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Предупреждение:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"В момента нямате добавен имейл адрес. Трябва да добавите имейл адрес, за да \"\n\"можете да получавате известия, да нулирате паролата си и др.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Потвърдете вашия e-mail адрес\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Изпратихме ви имейл за потвърждение. Следвайте връзката в него, за да \"\n\"финализирате процеса на регистрация. Ако не виждате имейла за потвърждение в \"\n\"основната си поща, проверете папката със спам. Моля, свържете се с нас, ако \"\n\"не получите имейла за потвърждение в рамките на няколко минути.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Тази част от сайта изисква да потвърдим, че\\n\"\n\"Вие сте този, за когото се представяте. За тази цел е необходимо да\\n\"\n\"потвърдите собствеността на Вашия имейл адрес. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Изпратихме ви имейл за\\n\"\n\"потвърждение. Моля, кликнете върху връзката в този имейл. Ако не виждате \"\n\"имейла за потвърждение в основната си поща, проверете папката със спам. Ако \"\n\"не го получите\\n\"\n\"в рамките на няколко минути, моля, свържете се с нас.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Забележка:</strong> можете да <a href=\\\"%(email_url)s\\\">смените \"\n\"вашия имейл адрес</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Съобщения:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Меню:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Свързани акаунти\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Двустепенна автентикация\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Сесии\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Оторизация\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s иска достъп до вашия %(site_name)s акаунт.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Въведете код на устройство\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Въведете кода, показан на вашето устройство.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Продължи\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Потвърждение на устройство\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Моля, потвърдете кода, показан на вашия %(client_name)s, за да оторизирате \"\n\"това устройство.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Откажи\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Устройството е оторизирано\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Успешно оторизирахте вашето %(client_name)s устройство.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Устройството е отказано\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Оторизацията за вашето %(client_name)s устройство беше отказана.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Грешка\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Остани вписан\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Вашият акаунт е защитен с двустепенна автентикация. Моля, въведете Вашият \"\n\"ключ за автентикация:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Нов сет от ключове за възстановяване на двустепенната автентикация са \"\n\"генерирани.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Нови ключове за възстановяване са генерирани\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Апликацията за автентикация е активирана.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Автентикиращата апликация е активирана\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Автентикиращата апликация е деактивирана.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Автентикиращата апликация е деактивирана\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Нов ключ за сигурност беше добавен.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Добавен е ключ за сигурност\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Беше премахнат ключ за сигурност.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Премахнат е ключ за сигуреност\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Автентикираща апликация\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Автентикация чрез автентикираща апликация е активирана.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Автентикиращата апликация е неактивна.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Деактивирай\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Активирай\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Ключове за сигурност\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Добавихте %(count)s ключ за сигурност.\"\nmsgstr[1] \"Добавихте %(count)s ключа за сигурност.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Не бяха добавени ключове за сигурност.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Управление\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Добави\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Ключове за възстановяване\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Има %(unused_count)s налични от %(total_count)s ключове за възстановяване.\"\nmsgstr[1] \"\"\n\"Има %(unused_count)s налични от %(total_count)s ключове за възстановяване.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Няма създадени ключове за възстановяване.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Изглед\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Свали\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Генерирай\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Нов сет от ключове за възстановяване бяха генерирани.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Добавен е ключ за възстановяване.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Премахнат е ключ за възстановяване.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Въведете ключ за автентикация:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\"На път сте да генерирате нов сет с ключове за възстановяване за Вашият \"\n\"акаунт.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Това действие ще направи съществуващите ключове невалидни.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Сигурни ли сте?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Неизползвани ключове\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Свалете ключовете\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Генерирайте нови ключове\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Активация на Автентикираща апликация\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"За да защитите акаунта си с двустепенна автентикация, сканирайте QR кода по-\"\n\"долу с Вашата автентикираща апликация. След това, въведете верифициращия код \"\n\"от апликацията в полето по-долу.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Таен код за автентикираща апликация\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Можете да запазите този таен ключ и да го използвате ако някога \"\n\"преинсталирате автентикиращата апликация.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Деактивирайте автентикиращата апликация\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"На път сте да деактивирате апликация за автентикация. Сигурни ли сте?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Вярвате ли на този браузър?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Ако решите да се доверите на този браузър, няма да бъдете помолени за код за \"\n\"потвърждение следващия път, когато влезете.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Доверие за %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Не се доверявайте\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Добавяне на ключ за сигурност\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Премахване на ключ за сигурност\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Сигурни ли сте, че искате да премахнете ключа за сигурност?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Употреба\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Ключ за достъп\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Ключ за сигурност\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Ключът не индикира дали е ключ за достъп или не.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Неупоменат\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Добавено на %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Последно използван на %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Редактиране\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Редактирай ключ за сигурност\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Запази\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Създай ключ за достъп\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Предстои да създадете ключ за достъп за вашия акаунт. Тъй като по-късно \"\n\"можете да добавяте допълнителни ключове, можете да използвате описателно \"\n\"име, за да ги разграничавате.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Създай\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Тази функционалност изисква JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Неуспешно влизане чрез приложение за автентикация на трета страна\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"Възникна грешка при опит за влизане чрез вашия акаунт на трета страна.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Можете да влезете в акаунта си, използвайки някой от следните акаунти на \"\n\"трети страни:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"В момента нямате свързани акаунти на трети страни с този акаунт.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Добавяне на акаунт на трета страна\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Акаунт от %(provider)s беше свързан с вашия акаунт.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Добавен е акаунт на трета страна\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"Акаунт от %(provider)s беше прекъснат от вашия акаунт.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Връзката с акаунт на трета страна е прекъсната\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Свържи с %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Предстои да свържете нов акаунт на трета страна от %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Влизане с %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Предстои да влезете с акаунт на %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Вход прекъснат\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Прекъснахте влизането в нашия сайт чрез ваш съществуващ акаунт. Ако това е \"\n\"било грешка, моля, <a href=\\\"%(login_url)s\\\">влезте</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Акаунт на трета страна беше свързан с Вашият.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Връзката с акаунт на трета страна беше прекъсната.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"На път сте да използвате вашия %(provider_name)s акаунт за вход в\\n\"\n\"%(site_name)s. Като последна стъпка, моля, попълнете следната форма:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Или използвайте трета страна\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Излезнахте от всички останали сесии.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Започнато на\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP Адрес\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Браузър\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Последно видян на\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Текуща\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Отпиши други сесии\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Потребителски сесии\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"сесиен ключ\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Свързани акаунти\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Паролата трябва да бъде поне {0} символа.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Получавате този e-mail, защото вие или някой друг е поискал парола за \"\n#~ \"вашия потребителски акаунт.\\n\"\n#~ \"На сървъра обаче не беше намерен потребител свързван с електронния адрес \"\n#~ \"%(email)s.\\n\"\n#~ \"\\n\"\n#~ \"Можете да пренебрегнете това писмо, ако не сте поискали възстановяване на \"\n#~ \"парола. Кликнете линка по-долу, за да направите нов акаунт.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Следните e-mail адреси са свързани с вашия акаунт:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Потвърждение на e-mail адрес\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Моля, влезте с някой\\n\"\n#~ \"от съществуващите ви външни акаунти. Или %(link)sсе регистрирайте</a>\\n\"\n#~ \"за %(site_name)s акаунт и влезте по-долу:\"\n\n#~ msgid \"or\"\n#~ msgstr \"или\"\n\n#~ msgid \"change password\"\n#~ msgstr \"смени паролата\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Вход с OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Този e-mail адрес вече е свързан с друг акаунт.\"\n"
  },
  {
    "path": "allauth/locale/ca/LC_MESSAGES/django.po",
    "content": "# DJANGO-ALLAUTH.\n# Copyright (C) 2016\n# This file is distributed under the same license as the django-allauth package.\n#\n# Translators:\n# Marc Seguí Coll <metarizard@gmail.com>, 2022.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: django-allauth\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2024-09-26 16:15+0000\\n\"\n\"Last-Translator: Ajordat <alexjortri@gmail.com>\\n\"\n\"Language-Team: Catalan <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/ca/>\\n\"\n\"Language: ca\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 5.8-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Ara mateix aquest compte està inactiu.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"No podeu eliminar el vostre correu electrònic principal.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Aquest correu electrònic ja està associat amb aquest compte.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"\"\n\"El correu electrònic i/o la contrasenya que heu especificat no són correctes.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"\"\n\"El número de telèfon i/o la contrasenya que heu especificat no són correctes.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"\"\n\"Un usuari ja ha estat registrat amb aquesta direcció de correu electrònic.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Si us plau, escriviu la vostra contrasenya actual.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Codi incorrecte.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Contrasenya actual.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Clau no vàlida o caducada.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Inici de sessió no vàlid.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"El token per reiniciar la contrasenya no és vàlid.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"No es poden afegit més de %d adreces de correu electrònic.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Un usuari ja ha estat registrat amb aquest número de telèfon.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Massa intents fallits. Intenteu-ho de nou més tard.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"El correu electrònic no està assignat a cap compte d'usuari.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"El número de telèfon no està assignat a cap compte d'usuari.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"La vostra adreça de correu electrònic principal ha de ser verificada.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"Aquest nom d'usuari no pot ser emprat. Si us plau utilitzeu-ne un altre.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"L'usuari i/o la contrasenya que heu especificat no són correctes.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Si us plau, seleccioneu-ne només un.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"El nou valor ha de ser diferent de l'actual.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Tingueu paciència, esteu enviant massa sol·licituds.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Utilitzeu la vostra paraula de pas\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Utilitzar una aplicació d’autenticació o un codi\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Utilitzar una clau de seguretat\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"S'ha marcat {email} com a verificat.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"No s'ha pogut marcar {email} com a verificat.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Marqueu l’adreça de correu seleccionada com a verificada\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Comptes\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"Correu electrònic\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Correu electrònic\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Introduïu un número de telèfon incloent el codi de país (p. ex. +1 per als \"\n\"EUA).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telèfon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Heu d'escriure la mateixa contrasenya cada cop.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Contrasenya\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Recordar-me\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Nom d'usuari\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Iniciar sessió\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Nom d'usuari, correu electrònic o telèfon\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Nom d'usuari o correu electrònic\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Nom d'usuari o telèfon\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Correu electrònic o telèfon\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Heu oblidat la contrasenya?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"Correu electrònic (un altre cop)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Confirmació de direcció de correu electrònic\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"Correu electrònic (opcional)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Nom d'usuari (opcional)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Heu d'escriure el mateix correu electrònic cada cop.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Contrasenya (de nou)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Contrasenya actual\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Nova contrasenya\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Nova contrasenya (de nou)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Codi\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"usuari\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"correu electrònic\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"verificat\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"principal\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"correus electrònics\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"creat\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"enviat\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"clau\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"confirmació de correu electrònic\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"confirmacions de correu electrònic\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Sense capçalera\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Veure el vostre identificador d'usuari\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Veure la vostra adreça de correu electrònic\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Veure la vostra informació bàsica de perfil\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Atorgar permisos\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Els comodins no estan permesos tret que 'Permetre comodins a les URI' \"\n\"estigui activat.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"L'URI '{}' conté més d'un comodí (*). Només es permet un comodí per URI.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Els comodins només estan permesos a la part del nom de host de l'URI.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Codi d'autorització\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Codi de dispositiu\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Credencials del client\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Token de refresc\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Confidencial\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Públic\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Els àmbits que el client pot sol·licitar. Proporcioneu un valor per línia, \"\n\"p. ex.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"En cas que el client no especifiqui cap àmbit, s'utilitzen aquests àmbits \"\n\"per defecte. Proporcioneu un valor per línia, p. ex.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Una llista de tipus de concessió permesos. Proporcioneu un valor per línia, \"\n\"p. ex.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Una llista d'orígens permesos per a sol·licituds cross-origin, un per línia.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Permetre comodins (*) a les URI de redirecció i orígens CORS. Quan està \"\n\"activat, les URI poden contenir un sol asterisc per coincidir amb subdominis.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Una llista de tipus de resposta permesos. Proporcioneu un valor per línia, \"\n\"p. ex.: code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"client\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"clients\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"No podeu afegir una adreça de correu electrònic a un compte protegit per \"\n\"l'autenticació de dos factors.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"No podeu desactivar el doble factor d’autenticació.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"No podeu generar codis de recuperació sense tindre activat el doble factor \"\n\"d’autenticació.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"No podeu activar l'autenticació de dos factors fins que no hàgiu verificat \"\n\"la vostra adreça de correu electrònic.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Clau mestra\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Clau de recanvi\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Clau n. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Codis de recuperació\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"Autenticador TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Codi de l’autenticador\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Sense contrasenya\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Habilitar operacions sense contrasenya permet iniciar la sessió utilitzant \"\n\"aquesta clau, però imposa requisits adicionals com la biometrica o protecció \"\n\"per PIN.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Ja existeix un compte associat a aquesta adreça de correu electrònic. Si us \"\n\"plau, primer identifiqueu-vos utilitzant aquest compte, i després vinculeu \"\n\"el vostre compte %s.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Token invàlid.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"El vostre compte no té una contrasenya definida.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"El vostre compte no té un correu electrònic verificat.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"No podeu desconnectar l'últim dels vostres comptes de tercers.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"El compte de xarxa social ja està connectada a un compte diferent.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Comptes de xarxes socials\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"proveïdor\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ID de proveïdor\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"nom\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"identificador client\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"Identificador de App o clau de consumidor\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"clau secreta\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"\"\n\"frase secrete de API, frase secreta client o frase secreta de consumidor\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Clau\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"aplicació de xarxa social\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"aplicacions de xarxes socials\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"darrer inici de sessió\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"data d'incorporació\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"dades extra\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"compte de xarxa social\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"comptes de xarxes socials\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) o token d'accés (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"frase secreta de token\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) o token de refrescament (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"expira el\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"token d'aplicació de xarxa social\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"tokens d'aplicació de xarxa social\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Dades de perfil invàlides\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Iniciar sessió\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Cancel·lar\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Resposta invàlida a l'hora d'obtenir token des de “%s”. La resposta fou: \"\n\"\\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Resposta invàlida a l'hora d'obtenir token d'accés de \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"No hi ha token de sol·licitud guardat per \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"No hi ha token d'accés guardat per \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Sense accés recursos privats de \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Resposta invàlida a l'hora d'obtenir token de sol·licitud de \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Compte inactiu\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Aquest compte està inactiu.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Hem enviat un codi a %(recipient)s. El codi caduca en breu, així que si us \"\n\"plau introduïu-lo aviat.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Confirmar\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Sol·licitar un nou codi\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Confirmeu l’accés\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"\"\n\"Sisplau, torneu-vos a autenticar per tal de mantenir el vostre compte segur.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Opcions alternatives\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Verificació de correu electrònic\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Entreu un codi d’autenticació de correu\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Utilitzar una adreça de correu electrònic diferent\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Iniciar sessió\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Introduïu el codi d'inici de sessió\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Restablir Contrasenya\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Introduïu el codi de restabliment de contrasenya\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Verificació del telèfon\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Introduïu el codi de verificació del telèfon\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Utilitzar un número de telèfon diferent\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Adreces de correu electrònic\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"\"\n\"Les següents adreces de correu electrònic estan associades al vostre compte:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Verificat\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Sense verificar\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Principal\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Definir com a principal\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Reenviar Verificació\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Eliminar\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Afegir adreça de correu electrònic\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Afegir correu electrònic\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"\"\n\"Esteu segurs de voler eliminar l'adreça de correu electrònic seleccionada?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Heu rebut aquest correu electrònic perquè vostè o algú altre s'ha intentat \"\n\"registrar\\n\"\n\"per obtenir un compte amb aquest correu:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"No obstant això, ja existeix un compte amb aquesta adreça electrònica. En \"\n\"cas que\\n\"\n\"ho hàgiu oblidat, utilitzeu el servei de recuperació de contrasenya oblidada \"\n\"per\\n\"\n\"recuperar el vostre compte:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"El compte ja existeix\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Hola des de %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Gràcies per utilitzar %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Heu rebut aquest correu perquè el següent canvi ha estat fet al vostre \"\n\"compte:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Si no reconeixeu aquest canvi, premeu precaucions de manera immediata. El \"\n\"canvi ha estat originat des de:\\n\"\n\"\\n\"\n\"- Adreça IP: %(ip)s\\n\"\n\"- Navegador: %(user_agent)s\\n\"\n\"- Data: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"\"\n\"El vostre correu ha canviat. Correu anterior: %(from_email)s nou correu: \"\n\"%(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Correu electròni canviat\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"El vostre correu ha estat confirmat.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Confirmació de correu electrònic\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Heu rebut aquest missatge perquè l'usuari %(user_display)s ha proporcionat \"\n\"la vostra adreça per registrar un compte a %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"El seu codi de verificació per correu electrònic es troba a continuació. Si \"\n\"us plau, introdueixi'l a la finestra oberta del navegador.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Per confirmar que això és correcte, aneu a %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Si us plau, confirmeu la vostra adreça de correu electrònic\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"El correu %(deleted_email)s s'ha eliminat del vostre compte.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Correu esborrat\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"El seu codi d'inici de sessió es troba a continuació. Si us plau, \"\n\"introdueixi'l a la finestra oberta del navegador.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Aquest correu es pot ignorar de manera segura si vostè no ha iniciat aquesta \"\n\"acció.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Codi d'inici de sessió\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"La vostra contrasenya ha canviat.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"La vostra contrasenya ha canviat\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"El vostre codi de restabliment de contrasenya es mostra a continuació. Si us \"\n\"plau, introduïu-lo a la finestra oberta del navegador.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Codi de restabliment de contrasenya\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Heu rebut aquest correu electrònic perquè vosaltres o una altra persona heu \"\n\"sol·licitat una contrasenya per al vostre compte d'usuari.\\n\"\n\"Es pot ignorar de forma segura si no es va sol·licitar el restabliment de \"\n\"contrasenya. Seguiu el següent enllaç per restablir la vostra contrasenya.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"En cas d'haver-lo oblidat, el vostre nom d'usuari és %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Correu electrònic per restablir contrasenya\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"S’ha restablert la vostra contrasenya.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"La vostra contrasenya ha canviat.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Contrasenya establerta\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Està rebent aquest correu perquè vostè, o algú altre, ha intentat accedir a \"\n\"un compte amb el correu %(email)s. No obstant això, no tenim constància de \"\n\"cap compte associat a aquest correu electrònic a la nostra base de dades.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Si era vostè, pot registrar-se per un compte amb l'enllaç a continuació.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Compte desconegut\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Adreces de correu electrònic\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Correu actual\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Canviant a\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"\"\n\"La vostra adreça de correu electrònic encara està pendent de ser verificada.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Cancel·lar el canvi\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Canviar a\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Canviar correu electrònic\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Confirmar adreça de correu electrònic\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Si us plau confirmeu que <a href=\\\"mailto:%(email)s\\\">%(email)s</a> és una \"\n\"adreça de correu electrònic de l'usuari %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"No es pot confirmar %(email)s perquè ja està confirmat en un compte diferent.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Aquest enllaç de verificació de correu electrònic ha expirat o és invàlid. \"\n\"Si us plau, <a href=\\\"%(email_url)s\\\">sol·liciteu una nova verificació per \"\n\"correu electrònic.</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Si encara no heu creat un compte, llavors si us plau %(link)sregistreu-\"\n\"vos%(end_link)s primer.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Inicia sessió amb un clau d'accés\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Envieu-me un codi d'inici de sessió\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Tancar sessió\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Esteu segurs de voler tancar sessió?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"No podeu eliminar el vostre correu electrònic principal (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Correu electrònic de confirmació enviat a %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Heu confirmat %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Eliminat correu electrònic %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Heu iniciat sessió exitosament com a %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Heu tancat sessió.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"S'ha enviat un codi d'inici de sessió a %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Contrasenya canviada amb èxit.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Contrasenya establerta amb èxit.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"S'ha enviat un codi de verificació a %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Heu verificat el número de telèfon %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Adreça de correu electrònic principal establerta.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Canviar Contrasenya\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Heu oblidat la vostra contrasenya?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Heu oblidat la vostra contrasenya? Introduïu el vostre correu electrònic i \"\n\"us enviarem un correu que us permetrà restablir-la.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Restablir la meva contrasenya\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Si us plau contacteu-nis si teniu algun problema per restablir la vostra \"\n\"contrasenya.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Us hem enviat un correu electrònic. Si us plau contacteu-nos si no el rebeu \"\n\"en uns minuts.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Hi ha un problema amb el token\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"L'enllaç per restablir la contrasenya és invàlid, probablement porquè ja ha \"\n\"estat utilitzat. Si us plau soliciteu <a \"\n\"href=\\\"%(passwd_reset_url)s\\\">restablir la contrasenya novament</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"La vostra contrasenya ha canviat.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Establir contrasenya\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Canviar telèfon\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Telèfon actual\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"El vostre número de telèfon encara està pendent de verificació.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Canviar telèfon\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Introduïu la vostra paraula de pas:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Rebreu un codi especial per iniciar sessió sense contrasenya.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Sol·licitar codi\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Opcions alternatives d'inici de sessió\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Registrar-se\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Registrar-se\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Ja teniu un compte? Si us plau %(link)sinicieu sessió%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Registra't amb un clau d'accés\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Registrar clau d'accés\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Opcions alternatives\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Registre tancat\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Ho sentim, en aquest moment el registre está tancat.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Nota\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"ja heu iniciat sessió com a %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Advertència:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Actualment no teniu cap adreça de correu electrònic definida. Hauríeu \"\n\"d'afegir una adreça de correu electrònic per poder rebre notificacions, \"\n\"restablir la contrasenya, etc.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Verifiqueu la vostra direcció de correu electrònic\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Us hem enviat un correu electrònic per la seva verificació. Seguiu l'enllaç \"\n\"per completar el procés de registre. Si us plau contacteu-nos si no el rebeu \"\n\"en uns minuts.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Aquesta part del lloc web requereix que verifiquem que\\n\"\n\"sou qui dieu ser. Per això us requerim que verifiqueu la\\n\"\n\"propietat del vostre correu electrònic. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Us hem enviat un correu electrònic per la vostra\\n\"\n\"verificació. Si us plau accediu al link dins el correu electrònic. Si no \"\n\"veieu el correu de verificació a la vostra bústia principal, comproveu la \"\n\"carpeta d'spam. D'altra banda\\n\"\n\"contacteu-nos si no el rebeu en uns minuts.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Nota:</strong> encara podeu <a href=\\\"%(email_url)s\\\">canviar la \"\n\"vostra adreça de correu electrònic</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Missatges:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menú:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Connexions de Compte\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Autenticació de doble factor (TFA)\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sessions\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autoritzar\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s vol accedir al vostre compte de %(site_name)s.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Introduïu el codi de dispositiu\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Introduïu el codi que es mostra al vostre dispositiu.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Continuar\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Confirmeu el dispositiu\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Si us plau, confirmeu el codi que es mostra al vostre %(client_name)s per \"\n\"autoritzar aquest dispositiu.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Denegar\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Dispositiu autoritzat\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Heu autoritzat correctament el vostre dispositiu %(client_name)s.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Dispositiu denegat\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"\"\n\"L'autorització del vostre dispositiu %(client_name)s ha estat denegada.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Error\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Mantenir la sessió iniciada\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"El teu compte està protegit per doble factor d’autenticació. Sisplau, entreu \"\n\"el codi de l’autenticador:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"S’ha generat un nou conjunt de codis de recuperació de doble factor \"\n\"d’autenticació.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"S’ha generat un nou codi de recuperació\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"App d’autenticació activada.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"App d’autenticació activada\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"App d’autenticació desactivada.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"App d’autenticació desactivada\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Una nova clau de seguretat ha estat afegida.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Clau de Seguretat Afegida\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"S'ha eliminat una clau de seguretat.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Clau de seguretat eliminada\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"App d’autenticació\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"L’autenticació està fent servir una app d’autenticació activa.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"L’app d’autenticació no està activa.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Desactivat\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Activat\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Claus de seguretat\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Has afegit %(count)s clau de seguretat.\"\nmsgstr[1] \"Has afegit %(count)s claus de seguretat.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"No s'ha afegit cap clau de seguretat.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Gestionar\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Afegir\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Codis de recuperació\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Hi ha %(unused_count)s de %(total_count)s codis de recuperació disponible.\"\nmsgstr[1] \"\"\n\"Hi ha %(unused_count)s de %(total_count)s codis de recuperació disponibles.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"No heu definit codis de recuperació.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Vista\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Descarrega\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Generar\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Un nou conjunt de codis de recuperació ha estat generat.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"S'ha afegit la clau de seguretat.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"S'ha eliminat la clau de seguretat.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Entreu un codi d’autenticació:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\"Esteu a punt de generar un nou conjunt de codis de recuperació pel vostre \"\n\"compte.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Aquesta acció invalidarà els vostres codis existents.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Esteu segur?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Codis no utilitzats\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Descarrega els codis\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Genera nous codis\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Activa la App d’autenticació\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Per protegir el vostre compte amb doble factor d’autenticació, escanejeu el \"\n\"codi QR de sota amb la vostra App d’autenticació. Llavors, introduïu el codi \"\n\"de verificació generat per l’App a sota.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Secret d’autenticador\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Podeu emmagatzemar aquest secret i usar-lo per reinstal·lar la vostra app \"\n\"d’autenticació més endavant.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Desactiva l’App d’autenticació\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Esteu a punt de desactivar la seguretat basada en app d’autenticació. \"\n\"N’esteu segurs?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Voleu confiar en aquest navegador?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Si decidiu confiar en aquest navegador, no se us demanarà un codi de \"\n\"verificació la propera vegada que inicieu sessió.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Confiar durant %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"No confiar\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Afegir clau de seguretat\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Eliminar clau de seguretat\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Esteu segurs de voler eliminar aquesta clau de seguretat?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Ús\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Clau d'accés\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Clau de seguretat\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Aquesta clau no indica si és una clau d'accés.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Sense especificar\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Afegida el %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Últim ús %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Editar\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Editar clau de seguretat\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Desar\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Crear clau d'accés\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Esteu a punt de crear una clau d'accés per al vostre compte. Com que podeu \"\n\"afegir claus addicionals més endavant, podeu utilitzar un nom descriptiu per \"\n\"distingir-les.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Crear\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Aquesta funcionalitat requereix JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Ha fallat l’autenticació de tercers\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"S'ha produït un error intentant iniciar sessió a través del vostre compte de \"\n\"xarxa social.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"Podeu iniciar sessió amb algun dels següents comptes de tercers:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Actualment no tens cap compte de tercers associat a aquest compte.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Afegir un compte de tercers\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"\"\n\"El compte de tercers des de %(provider)s ha estat vinculat al teu compte.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Compte de tercers vinculat\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"El compte de tercers des de %(provider)s ha estat desvinculat al teu compte.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Compte de tercers desvinculat\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Connectar %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Esteu a punt de connectar un nou compte extern des de %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Iniciar sessió via %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Esteu a punt d'iniciar sessió utilitzant un compte extern des de \"\n\"%(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Inici de sessió cancel·lat\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Heu decidit cancel·lar l'inici de sessió al vostre lloc web utilitzant un \"\n\"dels vostres comptes existents. Si ha estat un error, si us plau <a \"\n\"href=\\\"%(login_url)s\\\">inicieu sessió</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"El compte de xarxa social ha estat connectat.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"El compte de xarxa social s'ha desconnectat.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Esteu a punt d'utilitzar el vostre compte de %(provider_name)s per iniciar \"\n\"sessió a\\n\"\n\"%(site_name)s. Com a pas final, si us plau completeu el següent formulari:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"O utilitzeu un compte de tercers\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Sortiu de totes les altres sessions.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Ha començat a les\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"Adreça IP\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Navegador\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Vist darreranent\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Actual\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Tanca les altres sessions\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Sessions de l’usuari\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"clau de sessió\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Connexions de Compte\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"La contrasenya ha de contenir al menys {0} caràcters.\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Has rebut aquest correu electrònic perquè vosaltres o algú altre heu \"\n#~ \"sol·licitat una\\n\"\n#~ \"contrasenya per al vostre compte d'usuari. Tot i això, no tenim cap \"\n#~ \"registre d'un usuari\\n\"\n#~ \"amb correu electrònic %(email)s a la nostra base de dades.\\n\"\n#~ \"\\n\"\n#~ \"Aquest correu es pot ignorar de forma segura si no heu sol·licitat un \"\n#~ \"canvi de contrasenya.\\n\"\n#~ \"\\n\"\n#~ \"Si heu estat vosaltres, podeu registrar un compte d'usuari utilitzant el \"\n#~ \"link de sota.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"\"\n#~ \"Les següents adreces de correu electrònic estan associades al vostre \"\n#~ \"compte:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Confirmar adreça de correu electrònic\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Si us plau, inicieu sessió amb un\\n\"\n#~ \"compte d'una altra xarxa social. O %(link)sregistreu-vos</a> \\n\"\n#~ \"com a usuari de %(site_name)s i inicieu sessió a continuació:\"\n\n#~ msgid \"or\"\n#~ msgstr \"o\"\n\n#~ msgid \"change password\"\n#~ msgstr \"canviar la contrasenya\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Iniciar sessió amb OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Aquest correu electrònic ja està associat amb un altre compte.\"\n"
  },
  {
    "path": "allauth/locale/cs/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# Tomas Marcik <tomas.marcik@dolnex.cz>, 2013.\n# Beda Kosata <beda.kosata@gmail.com>, 2018.\n# Filip Dobrovolny <dobrovolny.filip@gmail.com>, 2023.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: 0.55\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-07-30 18:06+0000\\n\"\n\"Last-Translator: Jakub Boukal <www.bagr@gmail.com>\\n\"\n\"Language-Team: Czech <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/cs/>\\n\"\n\"Language: cs\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n \"\n\"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\\n\"\n\"X-Generator: Weblate 5.13-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Účet je v tuto chvíli neaktivní.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Nemůžete odstranit primární e-mailovou adresu.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Tento e-mail je již k tomuto účtu přiřazen.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Zadaný e-mail nebo heslo není správné.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Zadané telefonní číslo nebo heslo není správné.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Uživatel s tímto e-mailem je již registrován.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Prosím, zadejte svoje současné heslo.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Nesprávný kód.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Nesprávné heslo.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Neplatný klíč.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Neplatné přihlášení.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Token pro reset hesla není platný.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Nelze přidat více než %d e-mailových adres.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Uživatel s tímto telefonním číslem je již registrován.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Příliš mnoho pokusů o přihlášení. Zkuste to prosím později.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"E-mailová adresa není přiřazena k žádnému uživatelskému účtu.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Telefonní číslo není přiřazeno k žádnému uživatelskému účtu.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Vaše primární e-mailová adresa musí být ověřena.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Toto uživatelské jméno nemůže být zvoleno. Prosím, zvolte si jiné.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Zadané uživatelské jméno nebo heslo není správné.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Vyberte prosím pouze jednu možnost.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Nová hodnota se musí lišit od aktuální.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Buďte trpěliví, odesíláte příliš mnoho požadavků.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Zadejte své heslo\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Použijte ověřovací aplikaci nebo kód\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Zadejte tajný klíč\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"E-mailová adresa {email} byla označena jako ověřená.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Nepodařilo se označit {email} jako ověřenou.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Označ vybrané e-mailové adresy jako ověřené\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Účty\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"E-mailová adresa\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Zadejte telefonní číslo včetně předvolby země (např. +1 pro USA).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Hesla se musí shodovat.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Heslo\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Zapamatovat\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Uživatelské jméno\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Přihlášení\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Uživatelské jméno, e-mail nebo telefon\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Uživatelské jméno nebo e-mail\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Uživatelské jméno nebo telefon\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-mail nebo telefon\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Zapomněli jste heslo?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-mail (znovu)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Potrvzení e-mailové adresy\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-mail (nepovinné)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Uživatelské jméno (nepovinné)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Vložené e-maily se musí shodovat.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Heslo (znovu)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Současné heslo\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Nové heslo\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Nové heslo (znovu)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kód\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"uživatel\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"e-mailová adresa\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"ověřeno\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"primární\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"e-mailové adresy\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"vytvořeno\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"odeslaný\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"klíč\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"Potvrzovací e-mail\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"Ověřovací e-maily\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Zobrazit vaše ID uživatele\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Zobrazit vaši e-mailovou adresu\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Zobrazit vaše základní profilové informace\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Udělit oprávnění\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Zástupné znaky nejsou povoleny, pokud není povolena možnost 'Povolit \"\n\"zástupné znaky v URI'.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' obsahuje více než jeden zástupný znak (*). Na jedno URI je povolen \"\n\"pouze jeden zástupný znak.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Zástupné znaky jsou povoleny pouze v části URI s názvem hostitele.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Autorizační kód\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Kód zařízení\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Přihlašovací údaje klienta\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Obnovovací token\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Důvěrný\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Veřejný\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Rozsahy, které může klient požadovat. Uveďte jednu hodnotu na řádek, např.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Pokud klient neuvede žádný rozsah, použijí se tyto výchozí rozsahy. Uveďte \"\n\"jednu hodnotu na řádek, např.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Seznam povolených typů udělení. Uveďte jednu hodnotu na řádek, např.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"Seznam povolených zdrojů pro cross-origin požadavky, jeden na řádek.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Povolit zástupné znaky (*) v přesměrovacích URI a zdrojích CORS. Pokud je \"\n\"povoleno, mohou URI obsahovat jednu hvězdičku pro shodu subdomén.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Seznam povolených typů odpovědí. Uveďte jednu hodnotu na řádek, např.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"klient\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"klienti\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Nelze přidat e-mailovou adresu k účtu chráněnému dvoufaktorovouautentizací.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Dvoufaktorové ověřování nelze deaktivovat.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Nelze generovat kódy pro obnovení bez aktivovaného dvoufaktorového ověřování.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Nemůžete aktivovat dvoufaktorovou autentizaci, dokud nepotvrdíte svoue-\"\n\"mailovou adresu.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Hlavní klíč\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Záložní klíč\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Klíč #{number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"2FA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Záchranné kódy\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP Autentifikátor\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Kód autentifikátoru\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Bez hesla\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Povolení možnosti bez hesla vám umožní přihlásit se pouze pomocí tohoto \"\n\"klíče, ale klade další požadavky, jako je biometrie nebo ochrana PIN.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Účet s touto e-mailovou adresou již existuje. Prosím přihlaste se nejdříve \"\n\"pod tímto účtem a potom připojte svůj %s účet.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Neplatný token.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Váš účet nemá nastavené heslo.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Váš účet nemá žádný ověřený e-mail.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Nemůžete odpojit svůj poslední externí účet.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Externí účet je již spojen s jiným účtem.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Účty sociálních sítí\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"poskytovatel\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ID poskytovatele\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"jméno\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"id klienta\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"App ID nebo uživatelský klíč\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"tajný klíč\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"tajný API klíč, tajný klientský klíč nebo uživatelský tajný klíč\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Klíč\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"sociální aplikace\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"sociální aplikace\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"poslední přihlášení\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"datum registrace\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"extra data\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"účet sociální sítě\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"účty sociálních sítí\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) nebo přístupový token (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"tajný token\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) nebo token pro obnovu (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"vyprší\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"token sociální aplikace\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"tokeny sociálních aplikací\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Neplatná data profilu\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Přihlášení\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Zrušit\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"Chyba při odesílání požadavku: \\\"%s\\\". Odpoveď byla: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Chyba při získávání přístupového klíče od \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Není uložen žádný požadavkový klíč pro: \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Není uložen žádný přístupový klíč pro: \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Není přístup k privátním zdrojům: \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Chyba při získávání požadavkového klíče \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Neaktivní účet\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Tento účet není aktivní.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Na adresu %(recipient)s jsme poslali kód. Jeho platnost brzy vyprší, zadejte \"\n\"ho prosím včas.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Potvrdit\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Požádat o nový kód\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Potvrdit přístup\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Pro ochranu účtu se prosím znovu ověřte.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Alternativní možnosti\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Ověření e-mailu\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Zadejte ověřovací kód e-mailu\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Použít jinou e-mailovou adresu\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Přihlásit se\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Zadejte Ověřovací Kód\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Reset hesla\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Zadejte kód pro obnovení hesla\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Ověření telefonního čísla\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Zadejte ověřovací kód telefonu\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Použít jiné telefonní číslo\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"E-mailové adresy\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"K vašemu účtu jsou přiřazeny tyto e-mailové adresy:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Ověřeno\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Neověřeno\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Primární\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Zvolit jako primární\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Znovu zaslat oveřovací e-mail\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Odstranit\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Přidat e-mailovou adresu\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Přidat e-mail\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Opravdu chcete odstranit zvolené e-mailové adresy?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Tento e-mail jste obdrželi, protože vy nebo někdo jiný se pokusil \"\n\"registrovat účet s \\n\"\n\"použitím e-mailové adresy:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Ale účet s touto e-mailovou adresou již existuje. Pokud jste na to \"\n\"zapomněli, \\n\"\n\"použijte prosím postup obnovení hesla k obnovení vašeho účtu:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Účet již existuje\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Pozdrav z %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Děkujeme, že používáte %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Tento e-mail jste obdrželi, protože ve vašem účtu byla provedena následující \"\n\"změna:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Pokud tuto změnu nepoznáváte, prosím okamžitě proveďte náležitá bezpečnostní \"\n\"opatření. Změna vašeho účtu pochází z:\\n\"\n\"\\n\"\n\"- IP adresa: %(ip)s\\n\"\n\"- Prohlížeč: %(user_agent)s\\n\"\n\"- Datum %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Váš e-mail byl změněn z %(from_email)s na %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Email změněn\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Váš email byl potvrzen.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Potvrzení E-mailu\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Tento e-mail jste obdrželi protože uživatel %(user_display)s zadal vaši e-\"\n\"mailovou adresu k registraci účtu na stránkách %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Níže najdete váš ověřovací kód. Zadejte jej do otevřeného okna prohlížeče.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Pro potvrzení, že je to v pořádku, pokračujte na %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Potvrďte prosím svou e-mailovou adresu\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"E-mailová adresa %(deleted_email)s byla odstraněna z vašeho účtu.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Email odstraněn\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Níže najdete váš přihlašovací kód. Zadejte jej do otevřeného okna prohlížeče.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Tento e-mail může být bezpečně ignorován, pokud jste tuto akci nezahájili vy.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Přihlašovací kód\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Vaše heslo bylo změněno.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Heslo změněno\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Níže najdete váš kód pro obnovení hesla. Zadejte jej do otevřeného okna \"\n\"prohlížeče.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Kód pro obnovení hesla\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Tento e-mail jste obdrželi protože jste vy nebo někdo jiný zažádal o změnu \"\n\"hesla uživatelského účtu.\\n\"\n\"Pokud jste to nebyli vy, můžete tento e-mail ignorovat. Pokud ano, klikněte \"\n\"na odkaz níže pro změnu vašeho hesla.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"\"\n\"Pro případ, že byste zapomněli, vaše uživatelské jméno je %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"E-mail pro reset hesla\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Vaše heslo bylo obnoveno.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Vaše heslo bylo nastaveno.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Nastavení hesla\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Tento e-mail jste obdrželi, protože jste se vy nebo někdo jiný pokusili o \"\n\"přístup k účtu s e-mailem %(email)s. V naší databázi však žádný záznam o \"\n\"takovém účtu nemáme.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Pokud jste to byli vy, můžete si účet zaregistrovat pomocí odkazu níže.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Neznámý účet\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"E-mailové adresa\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Aktuální email\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Změněn na\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Vaše primární e-mailová adresa stále čeká na ověření.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Zrušit změnu\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Změnit na\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Změnit E-mail\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Potvrzení e-mailové adresy\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Prosím, potvrďte, že <a href=\\\"mailto:%(email)s\\\">%(email)s</a> je e-mailová \"\n\"adresa pro uživatele %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"Nelze potvrdit %(email)s, protože již byl spojen s jiným účtem.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Tento ověřovací odkaz již vypršel nebo není správný. Prosím, <a \"\n\"href=\\\"%(email_url)s\\\">zažádejte si o nový</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Pokud jste si ještě nevytvořili účet, nejprve se \"\n\"%(link)szaregistrujte%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Přihlaste se pomocí přístupového klíče\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Pošlete mi přihlašovací kód\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Odhlásit se\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Jste si jisti, že se chcete odhlásit?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Nemůžete odstranit primární e-mailovou adresu (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Ověření e-mailu posláno na %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Ověřili jste %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"E-mailová adresa %(email)s byla odebrána.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Úspěšně přihlášen jako %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Právě jste byl odhlášen.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Přihlašovací kód byl zaslán na adresu %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Heslo bylo úspěšně změněno.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Heslo bylo úspěšně nastaveno.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Ověřovací kód byl zaslán na číslo %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Ověřili jste telefonní číslo %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Primární e-mail byla nastavena.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Změnit heslo\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Zapomenuté heslo?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Zapomněli jste heslo? Zadejte prosím svoji e-mailovou adresu a do e-mailové \"\n\"schránky Vám přijde návod na jeho obnovu.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Resetovat moje heslo\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Prosím, kontaktujte nás, pokud máte jakékoliv potíže s resetováním hesla.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Poslali jsme vám e-mail. Pokud jste ho neobdrželi, zkontrolujte prosím \"\n\"složku s nevyžádanou poštou (spam). V opačném případě nás kontaktujte, pokud \"\n\"ho neobdržíte do několika minut.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Chybný klíč\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Odkaz na resetování hesla byl neplatný, možná proto, že již byl použit. \"\n\"Požádejte prosím o <a href=\\\"%(passwd_reset_url)s\\\">nový reset hesla</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Vaše heslo je nyní změněno.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Nastavit heslo\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Změnit telefon\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Aktuální telefon\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Vaše telefonní číslo stále čeká na ověření.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Změnit telefon\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Zadejte své heslo:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Obdržíte speciální kód pro přihlášení bez hesla.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Požádat kód\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Další možnosti přihlášení\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Zaregistrovat se\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Zaregistrovat se\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Máte již účet? %(link)sPřihlašte se%(end_link)s, prosím.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Zaregistrujte se pomocí přístupového klíče\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Registrace přístupového klíče\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Další možnosti\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Registrace je uzavřena\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Omlouváme se, ale registrace je momentálně uzavřena.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Poznámka\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Již jste přihlášen jako %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Varování:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"V současné chvíli nemáte nastaveny žádné e-mailové adresy. Prosím, uložte si \"\n\"k účtu alespoň jeden e-mail, abyste moli dostávat upozornění nebo mohli \"\n\"použít funkci zapomenutého hesla apod.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Ověřte svoji e-mailovou adresu\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Byl vám zaslán ověřovací e-mail. Následujte odkaz v e-mailu pro dokončení \"\n\"registračního procesu. Pokud jste ho neobdrželi, zkontrolujte prosím složku \"\n\"s nevyžádanou poštou (spam). Neváhejte nás kontaktovat v případě, pokud e-\"\n\"mail do několika minut neobdržíte.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Tato část stránek vyžaduje ověření,\\n\"\n\"že jste ten, kdo tvrdíte. K těmto účelům požadujeme\\n\"\n\"aby jste ověřil vlastnictví své e-mailové adresy. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Zaslali jsme vám email pro oveření.\\n\"\n\"Prosím, klikněte na odkaz uvnitř e-mailu. Pokud jste ho neobdrželi, \"\n\"zkontrolujte prosím složku s nevyžádanou poštou (spam).\\n\"\n\"Neváhejte nás kontaktovat v případě, pokud e-mail nedostanete do několika \"\n\"minut.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Poznámka:</strong> stále můžete <a href=\\\"%(email_url)s\\\">změnit \"\n\"vaši e-mailovou adresu.</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Zprávy:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menu:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Propojení účtu\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Dvoufaktorová autentizace\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Relace\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autorizovat\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s chce získat přístup k vašemu účtu %(site_name)s.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Zadejte kód zařízení\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Zadejte kód zobrazený na vašem zařízení.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Pokračovat\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Potvrdit zařízení\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Potvrďte prosím kód zobrazený na vašem %(client_name)s pro autorizaci tohoto \"\n\"zařízení.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Zamítnout\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Zařízení autorizováno\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Úspěšně jste autorizovali vaše zařízení %(client_name)s.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Zařízení zamítnuto\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Autorizace vašeho zařízení %(client_name)s byla zamítnuta.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Chyba\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Zůstat přihlášen\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Váš účet je chráněn dvoufaktorovou autentizací. Prosím, zadejte autentizační \"\n\"kód:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Byla vygenerována nová sada obnovovacích kódů dvoufaktorové autentizace.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Nové obnovovací kódy vygenerovány\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Autentifikátor byl aktivován.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Autentifikátor byl aktivován\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Autentifikátor byl deaktivován.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Autentifikátor byl deaktivován\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Byl přidán nový bezpečnostní klíč.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Bezpečnostní klíč přidán\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Bezpečnostní klíč byl odstraněn.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Bezpečnostní klíč odstraněn\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Autentifikátor\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Autentizace pomocí autentifikátoru je aktivní.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Autentifikátor není aktivní.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Deaktivovat\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktivovat\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Bezpečnostní klíče\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Přidali jste %(count)s bezpečnostní klíč.\"\nmsgstr[1] \"Přidali jste %(count)s bezpečnostní klíče.\"\nmsgstr[2] \"Přidali jste %(count)s bezpečnostního klíče.\"\nmsgstr[3] \"Přidali jste %(count)s bezpečnostních klíčů.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Nebyly přidány žádné bezpečnostní klíče.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Spravovat\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Přidat\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Záchranné kódy\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Z dostupných záchranných kódů je použit %(unused_count)s z celkového počtu \"\n\"%(total_count)s kódů.\"\nmsgstr[1] \"\"\n\"Z dostupných záchranných kódů jsou použity %(unused_count)s z celkového \"\n\"počtu %(total_count)s kódů.\"\nmsgstr[2] \"\"\n\"Z dostupných záchranných kódů je použito %(unused_count)s z celkového počtu \"\n\"%(total_count)s kódů.\"\nmsgstr[3] \"\"\n\"Z dostupných záchranných kódů je použitých %(unused_count)s z celkového \"\n\"počtu %(total_count)s kódů.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Nejsou nastaveny žádné záchranné kódy.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Zobrazit\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Stáhnout\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Generovat\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Byla vygenerována nová sada záchranných kódů.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Bezpečnostní klíč přidán.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Bezpečnostní klíč odstraněn.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Zadejte ověřovací kód:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Chystáte se vygenerovat novou sadu obnovovacích kódů pro váš účet.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Tato akce zruší platnost vašich stávajících kódů.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Jste si jistý?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Nepoužité kódy\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Stáhnout kódy\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Generovat nové kódy\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Aktivovat Autentifikátor\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Chcete-li svůj účet chránit pomocí dvoufaktorového ověřování, naskenujte \"\n\"pomocí autentikační aplikace uvedený QR kód. Poté níže zadejte ověřovací kód \"\n\"vygenerovaný aplikací.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Klíč autentifikátoru\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Tento klíč můžete uložit a později použít k opětovné instalaci aplikace \"\n\"autentikátoru.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Deaktivovat Autentifikátor\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Chystáte se deaktivovat autentizaci pomocí autentifikátoru. Jste si jisti?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Důvěřovat tomuto prohlížeči?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Pokud se rozhodnete důvěřovat tomuto prohlížeči, při příštím přihlášení \"\n\"nebudete požádáni o ověřovací kód.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Důvěřovat po dobu %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Nedůvěřovat\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Přidat tajný klíč\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Odebrat tajný klíč\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Jste si jisti, že se chcete odebrat tajný klíč?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Použito\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Přístupový klíč\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Bezpečnostní klíč\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Tento klíč neoznačuje, zda se jedná o přístupový klíč.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Nespecifikováno\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Přidáno %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Naposledy použito %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Upravit\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Upravit bezpečnostní klíč\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Uložit\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Vytvořte přístupový klíč\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Chystáte se vytvořit přístupový klíč pro svůj účet. Protože později můžete \"\n\"přidat další klíče, můžete klíče odlišit pomocí popisného názvu.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Vytvořit\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Tato funkce vyžaduje JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Přihlášení pomocí externího účtu selhalo\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"Nastala chyba při přihlašování pomocí externího účtu.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"Můžete se přihlásit pomocí jakéhokoliv následujícího externího účtu:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"V současné chvíli nemáte připojeny žádné další účty.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Přidejte další externí účet\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"K vašemu účtu byl připojen další účet od %(provider)s.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Externí účet přidán\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"Externí účet od %(provider)s byl odpojen od vašeho účtu.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Externí účet odpojen\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Připojit %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Chystáte se připojit nový externí účet od %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Přihlásit se pomocí %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Chystáte se přihlásit pomocí externího účtu od %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Přihlášení zrušeno\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Rozhodli jste se zrušit přihlašování jednoho z vašich účtů. Pokud je to \"\n\"omylem, následujte <a href=\\\"%(login_url)s\\\">přihlášení</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Externí účet byl připojen.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Externí účet byl odpojen.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Chystáte se použít vášeho %(provider_name)s účtu k přihlášení na naše \"\n\"stránky \\n\"\n\"%(site_name)s. Jako poslední krok, prosím, vyplňte následující formulář:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Nebo použijte externí účet\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Odhlášen ze všech ostatních relací.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Začala v\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP adresa\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Prohlížeč\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Napoposledy použita v\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Aktuální\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Odhlásit ostatní relace\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Uživatelské relace\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"klíč relace\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Propojení účtu\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Heslo musí obsahovat minimálně {0} znaků.\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Tento e-mail jste obdrželi protože jste vy nebo někdo jiný zažádal o \"\n#~ \"změnu \\n\"\n#~ \"hesla uživatelského účtu. Nicméně, nemáme žádný záznam o uživateli s \\n\"\n#~ \"e-mailem %(email)s v naší databázi.\\n\"\n#~ \"\\n\"\n#~ \"Tento e-mail můžete bezpečně ignorovat, pokud jste nezažádali o změnu \"\n#~ \"hesla.\\n\"\n#~ \"\\n\"\n#~ \"Jestliže jste to byli vy, můžete se zaregistrovat na stránkách pomocí \"\n#~ \"odkazu \\n\"\n#~ \"níže.\"\n\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"K vašemu účtu je přiřazena tato e-mailová adresa:\"\n\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Změna e-mailové adresy\"\n\n#~ msgid \"\"\n#~ \"To safeguard the security of your account, please enter your password:\"\n#~ msgstr \"Pro zabezpečení vašeho účtu, prosím, zadejte vaše heslo:\"\n\n#, fuzzy\n#~ msgid \"Regenerate\"\n#~ msgstr \"Generovat\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Přihlašte se prosím výběrem jednoho\\n\"\n#~ \"z vašich účtů třetích stran. Nebo se <a \"\n#~ \"href=\\\"%(signup_url)s\\\">zaregistruje</a> na stránky %(site_name)s a \"\n#~ \"přihlašte se níže:\"\n\n#~ msgid \"or\"\n#~ msgstr \"nebo\"\n\n#~ msgid \"change password\"\n#~ msgstr \"změnit heslo\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Přihlášení OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Tento e-mail je již přiřazen k jinému účtu.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Zaslali jsme vám e-mail. Prosím, kontaktujte nás, pokud ho nedostanete do \"\n#~ \"několika minut.\"\n\n#~ msgid \"The provided password is not valid.\"\n#~ msgstr \"Použité heslo není platné.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"Zadané přihlašovací údaje nejsou správné.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"\"\n#~ \"Uživatelské jméno může obsahovat pouze písmena, číslice a znaky @/./+/-/_.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"Toto uživatelské jméno je již zvoleno. Prosím, vyberte si jiné.\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"Potvrdili jste e-mailovou adresu <a href=\\\"mailto:%(email)s\\\">%(email)s</\"\n#~ \"a> uživateli %(user_display)s.\"\n\n#~ msgid \"Thanks for using our site!\"\n#~ msgstr \"Děkujeme za využívání našich stránek!\"\n\n#~ msgid \"Confirmation email sent to %(email)s\"\n#~ msgstr \"Ověřovací e-mail byl zaslán: %(email)s\"\n\n#~ msgid \"Delete Password\"\n#~ msgstr \"Smazat heslo\"\n\n#~ msgid \"\"\n#~ \"You may delete your password since you are currently logged in using \"\n#~ \"OpenID.\"\n#~ msgstr \"Můžete si smazat heslo, protože používáte jiné způsoby přihlášení.\"\n\n#~ msgid \"delete my password\"\n#~ msgstr \"Odstanit moje heslo\"\n\n#~ msgid \"Password Deleted\"\n#~ msgstr \"Heslo bylo odstraněno\"\n"
  },
  {
    "path": "allauth/locale/da/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2024-04-20 21:40+0200\\n\"\n\"Last-Translator: b'Tuk Bredsdorff <tukodeb@gmail.com>'\\n\"\n\"Language-Team: \\n\"\n\"Language: da\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Generator: Poedit 2.1.1\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Denne konto er i øjeblikket inaktiv.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Du kan ikke fjerne din primære emailadresse.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Denne emailadresse er allerede knyttet til denne konto.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Den angivne emailadresse og/eller adgangskode er ikke korrekt.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Det angivne telefonnummer og/eller adgangskode er ikke korrekt.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"En bruger er allerede registreret med denne emailadresse.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Indtast din nuværende adgangskode.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Forkert kode.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Forkert adgangskode.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Ugyldig eller udløbet nøgle.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Ugyldigt login.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Token for nulstilling af adgangskode var ugyldig.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Du kan ikke tilføje mere end %d emailadresser.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"En bruger er allerede registreret med dette telefonnummer.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Der er for mange mislykkede logonforsøg. Prøv igen senere.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Emailadressen er ikke tildelt til nogen brugerkonto.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Telefonnummeret er ikke tildelt til nogen brugerkonto.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Din primære emailadresse skal bekræftes.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Brugernavn kan ikke bruges. Brug venligst et andet brugernavn.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Det angivne brugernavn og/eller adgangskoden er ikke korrekt.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Vælg kun én.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Den nye værdi skal være anderledes end den nuværende.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Hav tålmodighed, du sender for mange anmodninger.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Brug din adgangskode\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Brug autentificeringsapp eller kode\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Brug en sikkerhedsnøgle\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Markerede {email} som bekræftet.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Kunne ikke markere {email} som bekræftet.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Marker valgte emailadresser som bekræftede\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Konti\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"Email\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Emailadresse\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Indtast et telefonnummer inklusive landekode (f.eks. +1 for USA).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Du skal skrive den samme adgangskode hver gang.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Adgangskode\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Husk mig\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Brugernavn\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Bruger\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Brugernavn, email eller telefon\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Brugernavn eller email\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Brugernavn eller telefon\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Email eller telefon\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Glemt din adgangskode?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"Email (igen)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Bekræftelse af emailadresse\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"Email (valgfri)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Brugernavn (valgfrit)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Du skal skrive den samme emailadresse hver gang.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Adgangskode (igen)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Nuværende adgangskode\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Ny adgangskode\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Ny adgangskode (igen)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kode\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"bruger\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"emailadresse\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"bekræftet\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"primær\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"emailadresser\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"oprettet\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"sendt\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"nøgle\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"emailbekræfelse\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"emailbekræftelse\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Se dit bruger-ID\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Se din emailadresse\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Se dine grundlæggende profiloplysninger\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Giv tilladelser\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Jokertegn er ikke tilladt, medmindre 'Tillad URI-jokertegn' er aktiveret.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI'en '{}' indeholder mere end ét jokertegn (*). Kun ét jokertegn per URI \"\n\"er tilladt.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Jokertegn er kun tilladt i værtsnavnsdelen af URI'en.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Autorisationskode\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Enhedskode\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Klientlegitimationsoplysninger\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Opdater token\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Fortrolig\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Offentlig\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"De scope(s), som klienten har tilladelse til at anmode om. Angiv én værdi \"\n\"pr. linje, f.eks.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Hvis klienten ikke angiver nogen scope, bruges disse standardscopes. Angiv \"\n\"én værdi pr. linje, f.eks.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"En liste over tilladte grant-typer. Angiv én værdi pr. linje, f.eks.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"En liste over tilladte oprindelser for cross-origin anmodninger, én pr. \"\n\"linje.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Tillad jokertegn (*) i omdirigerings-URI'er og CORS-oprindelser. Når \"\n\"aktiveret kan URI'er indeholde en enkelt stjerne for at matche underdomæner.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"En liste over tilladte responstyper. Angiv én værdi pr. linje, f.eks.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"klient\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"klienter\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Du kan ikke tilføje en emailadresse til en konto beskyttet af to-faktor-\"\n\"autentificering.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Du kan ikke deaktivere to-faktor-autentificering.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Du kan ikke generere gendannelseskoder uden at have to-faktor-\"\n\"autentificering aktiveret.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Du kan ikke aktivere to-faktor-autentificering, før du har bekræftet din e-\"\n\"mailadresse.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Hovednøgle\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Backup-nøgle\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Nøgle nr. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Gendannelseskoder\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP-autentificering\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Autentificeringskode\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Adgangskode-fri\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Aktivering af adgangskode-fri drift giver dig mulighed for at logge ind med \"\n\"kun denne nøgle, men stiller yderligere krav såsom biometri eller PIN-\"\n\"beskyttelse.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"En konto med denne emailadresse eksisterer allerede. Log venligst ind med \"\n\"den konto først og tilknyt din %s konto derefter.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Ugyldigt token.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Der er ikke oprettet noget password til din konto.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Din konto har ikke nogen bekræftet emailadresse.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Du kan ikke afbryde din sidste resterende tredjepartskonto.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Tredjepartskontoen er allerede tilsluttet en anden konto.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Sociale konti\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"udbyder\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"udbyder-ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"navn\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"klient id\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"App ID, eller konsumer nøgle\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"hemmelig nøgle\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API hemmelighed, klient hemmelighed eller konsumet hemmelighed\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Nøgle\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"social applikation\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"sociale applikationer\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"sidste log ind\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"dato oprettet\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"ekstra data\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"social konto\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"sociale konti\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"“oauth_token” (OAuth1) eller adgangstoken (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"token hemmelighed\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"“oauth_token_secret” (OAuth1) eller fornyelsestoken (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"udløber den\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"socialt applikationstoken\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"sociale applikationstokener\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Ugyldig profildata\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Log ind\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Annuller\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Ugyldig respons under forsøg på at hente request token fra \\\"%s\\\". Respons \"\n\"var: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Ugyldig respons under forsøg på at hente adgangstoken fra “%s”.\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Intet request token gemt for “%s”.\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Intet adgangstoken gemt for “%s”.\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Ingen adgang til private ressourcer på “%s”.\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Ugyldig respons under forsøg på at hente request token fra “%s”.\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Inaktiv konto\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Denne konto er inaktiv.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Vi har sendt en kode til %(recipient)s. Koden udløber snart, så indtast den \"\n\"venligst hurtigt.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Bekræft\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Anmod om ny kode\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Bekræft adgang\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Genautentificer venligst for at beskytte din konto.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Alternative muligheder\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Emailbekræftelse\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Indtast emailbekræftelseskode\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Brug en anden emailadresse\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Log ind\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Indtast login-kode\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Nulstil password\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Indtast adgangskode-nulstillingskode\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Telefonbekræftelse\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Indtast telefonbekræftelseskode\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Brug et andet telefonnummer\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Emailadresser\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"De følgende emailadresser er tilknyttet din konto:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Bekæftet\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Ubekræftet\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Primær\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Gør primær\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Send bekræftelse igen\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Fjern\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Tilføj emailadresse\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Tilføj email\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Vil du virkelig fjerne den valgte emailadresse?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Du modtager denne email, fordi du eller en anden har forsøgt at tilmelde sig \"\n\"en\\n\"\n\"konto med emailadressen:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Der findes dog allerede en konto med denne emailadresse. Hvis du har\\n\"\n\"glemt dette, brug venligst proceduren for glemt adgangskode for at gendanne\\n\"\n\"din konto:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Konto eksisterer allerede\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Hej fra %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Tak fordi du bruger %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Du modtager denne email, fordi følgende ændring er blevet foretaget på din \"\n\"konto:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Hvis du ikke genkender denne ændring, skal du straks tage passende \"\n\"sikkerhedsforanstaltninger. Ændringen af din konto stammer fra:\\n\"\n\"\\n\"\n\"- IP-adresse: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Dato: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Din email er blevet ændret fra %(from_email)s til %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Email ændret\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Din email er blevet bekræftet.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Emailbekræftelse\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Du modtager denne email, fordi brugeren %(user_display)s har angivet din \"\n\"emailadresse for at registrere en konto på %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Din emailbekræftelseskode er angivet nedenfor. Indtast den venligst i dit \"\n\"åbne browservindue.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"For at bekræfte at dette er korrekt, gå til %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Bekræft venligst din emailadresse\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"Emailadressen %(deleted_email)s er blevet fjernet fra din konto.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Email fjernet\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Din login-kode er angivet nedenfor. Indtast den venligst i dit åbne \"\n\"browservindue.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Denne email kan ignoreres, hvis du ikke selv har startet denne handling.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Login-kode\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Din adgangskode er blevet ændret.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Adgangskode ændret\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Din adgangskode-nulstillingskode er angivet nedenfor. Indtast den venligst i \"\n\"dit åbne browservindue.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Adgangskode-nulstillingskode\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Du modtager denne email, fordi du eller en anden har anmodet om nulstilling \"\n\"af adgangskoden til din brugerkonto.\\n\"\n\"Den kan ignoreres, hvis du ikke har anmodet om nulstilling af adgangskode. \"\n\"Klik på linket nedenfor for at nulstille din adgangskode.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"I tilfælde af at du har glemt det er dit brugernavn %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Nulstilling af Password Email\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Din adgangskode er blevet nulstillet.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Din adgangskode er blevet indstillet.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Adgangskode indstillet\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Du modtager denne email, fordi du eller en anden har forsøgt at få adgang \"\n\"til en konto med emailen %(email)s. Vi har dog ingen registrering af sådan \"\n\"en konto i vores database.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Hvis det var dig, kan du tilmelde dig en konto ved hjælp af linket nedenfor.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Ukendt konto\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Emailadresse\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Nuværende email\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Ændrer til\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Din emailadresse afventer stadig bekræftelse.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Annuller ændring\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Skift til\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Skift email\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Bekræft venligst din emailadresse\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Bekræft venligst at <a href=\\\"mailto:%(email)s\\\">%(email)s</a> er en \"\n\"emailadresse for bruger %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Kan ikke bekræfte %(email)s, da den allerede er bekræftet af en anden konto.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Dette link til bekræftelse af email er udløbet eller ugyldigt. Lav venligst \"\n\"<a href=\\\"%(email_url)s\\\">et nyt</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Hvis du ikke allerede har oprettet en konto, så %(link)sopret \"\n\"dig%(end_link)s først.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Log ind med en adgangsnøgle\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Send mig en login-kode\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Log ud\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Er du sikker på, at du vil logge af?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Du kan ikke fjerne din primære emailadresse (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Bekræftelses-email sendt til %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Du har bekræftet %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Fjernede emailadressen %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Loggede succesfuldt ind med %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Du har logget ud.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"En login-kode er blevet sendt til %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Password ændret med success.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Password indstillet med success.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"En bekræftelseskode er blevet sendt til %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Du har bekræftet telefonnummer %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Primær emailadresse indstillet.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Ændr password\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Glemt password?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Glemt dit password? Skriv din emailadresse herunder, og vi vil sende dig en \"\n\"email, hvorfra du kan nulstille det.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Nulstil mit password\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Kontakt os venligst, hvis du har problemer med at nulstille dit password.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Vi har sendt en email til dig. Hvis du ikke har modtaget den, tjek venligst \"\n\"din spam-mappe. Ellers kontakt os, hvis du ikke modtager den inden for få \"\n\"minutter.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Ugyldigt token\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Linket til nulstilling af password var ugyldigt, muligvis fordi det allerede \"\n\"er blevet brugt. Lav venligst <a href=\\\"%(passwd_reset_url)s\\\">et nyt</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Dit password er nu ændret.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Indstil password\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Skift telefon\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Nuværende telefon\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Dit telefonnummer afventer stadig bekræftelse.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Skift telefon\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Indtast din adgangskode:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Du vil modtage en speciel kode til login uden adgangskode.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Anmod om kode\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Andre login-muligheder\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Opret\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Opret konto\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Har du allerede en konto? Så %(link)slog ind%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Tilmeld dig med en adgangsnøgle\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Tilmelding med adgangsnøgle\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Andre muligheder\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Lukket for nye konti\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Vi beklager, men der er for tiden lukket for oprettelse af nye konti.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Note\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Du er allerede logget ind som %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Advarsel:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Du har på nuværende tidspunkt ingen emailadresse tilknyttet. Du bør virkelig \"\n\"tilføje en emailadresse, så du kan modtage notifikationer, nulstille din \"\n\"adgangskode osv.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Bekræft din emailadresse\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Vi har sendt en email til dig til bekræftelse. Følg det angivne link for at \"\n\"færdiggøre tilmeldingsprocessen. Hvis du ikke ser bekræftelsesemailen i din \"\n\"indbakke, tjek din spam-mappe. Kontakt os venligst, hvis du ikke modtager \"\n\"bekræftelsesemailen inden for få minutter.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Denne del af siden kræver, at vi bekræfter, at\\n\"\n\"du er hvem du påstår at være. Derfor kræver vi, at du\\n\"\n\"bekræfter ejerskab af din emailadresse. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Vi har sendt en email til dig til\\n\"\n\"bekræftelse. Klik venligst på linket i den email. Hvis du ikke ser \"\n\"bekræftelsesemailen i din indbakke, tjek din spam-mappe. Ellers\\n\"\n\"kontakt os, hvis du ikke modtager den inden for få minutter.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Bemærk:</strong> du kan stadig <a href=\\\"%(email_url)s\\\">ændre din \"\n\"emailadresse</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Beskeder:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menu:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Kontoforbindelser\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"To-faktor-autentificering\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sessioner\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autoriser\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s ønsker at få adgang til din %(site_name)s konto.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Indtast enhedskode\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Indtast koden vist på din enhed.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Fortsæt\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Bekræft enhed\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Bekræft venligst koden vist på din %(client_name)s for at autorisere denne \"\n\"enhed.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Afvis\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Enhed autoriseret\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Du har autoriseret din %(client_name)s enhed.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Enhed afvist\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Autorisering af din %(client_name)s enhed er blevet afvist.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Fejl\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Forbliv logget ind\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Din konto er beskyttet af to-faktor-autentificering. Indtast venligst en \"\n\"autentificeringskode:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Et nyt sæt to-faktor-autentificering gendannelseskoder er blevet genereret.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Nye gendannelseskoder genereret\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Autentificeringsapp aktiveret.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Autentificeringsapp aktiveret\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Autentificeringsapp deaktiveret.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Autentificeringsapp deaktiveret\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"En ny sikkerhedsnøgle er blevet tilføjet.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Sikkerhedsnøgle tilføjet\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"En sikkerhedsnøgle er blevet fjernet.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Sikkerhedsnøgle fjernet\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Autentificeringsapp\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Autentificering via en autentificeringsapp er aktiv.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"En autentificeringsapp er ikke aktiv.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Deaktiver\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktiver\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Sikkerhedsnøgler\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Du har tilføjet %(count)s sikkerhedsnøgle.\"\nmsgstr[1] \"Du har tilføjet %(count)s sikkerhedsnøgler.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Ingen sikkerhedsnøgler er blevet tilføjet.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Administrer\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Tilføj\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Gendannelseskoder\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Der er %(unused_count)s ud af %(total_count)s gendannelseskoder tilgængelige.\"\nmsgstr[1] \"\"\n\"Der er %(unused_count)s ud af %(total_count)s gendannelseskoder tilgængelige.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Ingen gendannelseskoder er sat op.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Vis\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Download\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Generer\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Et nyt sæt gendannelseskoder er blevet genereret.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Sikkerhedsnøgle tilføjet.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Sikkerhedsnøgle fjernet.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Indtast en autentificeringskode:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Du er ved at generere et nyt sæt gendannelseskoder til din konto.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Denne handling vil ugyldiggøre dine eksisterende koder.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Er du sikker?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Ubrugte koder\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Download koder\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Generer nye koder\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Aktiver autentificeringsapp\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"For at beskytte din konto med to-faktor-autentificering, skal du scanne QR-\"\n\"koden nedenfor med din autentificeringsapp. Indtast derefter \"\n\"bekræftelseskoden genereret af appen nedenfor.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Autentificeringshemmelighed\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Du kan gemme denne hemmelighed og bruge den til at geninstallere din \"\n\"autentificeringsapp på et senere tidspunkt.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Deaktiver autentificeringsapp\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Du er ved at deaktivere autentificeringsapp-baseret autentificering. Er du \"\n\"sikker?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Stol på denne browser?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Hvis du vælger at stole på denne browser, vil du ikke blive spurgt om en \"\n\"bekræftelseskode næste gang du logger ind.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Stol på i %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Stol ikke\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Tilføj sikkerhedsnøgle\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Fjern sikkerhedsnøgle\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Er du sikker på, at du vil fjerne denne sikkerhedsnøgle?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Anvendelse\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Adgangsnøgle\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Sikkerhedsnøgle\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Denne nøgle angiver ikke, om den er en adgangsnøgle.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Uspecificeret\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Tilføjet den %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Senest brugt %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Rediger\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Rediger sikkerhedsnøgle\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Gem\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Opret adgangsnøgle\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Du er ved at oprette en adgangsnøgle til din konto. Da du kan tilføje flere \"\n\"nøgler senere, kan du bruge et beskrivende navn til at skelne nøglerne fra \"\n\"hinanden.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Opret\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Denne funktionalitet kræver JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Tredjepartslogin-fejl\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Der opstod en fejl under forsøget på at logge ind via din tredjepartskonto.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Du kan logge ind på din konto ved hjælp af en af følgende tredjepartskonti:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Du har i øjeblikket ingen tredjepartskonti tilknyttet denne konto.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Tilføj en tredjepartskonto\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"\"\n\"En tredjepartskonto fra %(provider)s er blevet tilsluttet til din konto.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Tredjepartskonto tilsluttet\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"En tredjepartskonto fra %(provider)s er blevet frakoblet din konto.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Tredjepartskonto frakoblet\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Tilslut %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Du er ved at tilslutte en ny tredjepartskonto fra %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Log ind via %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Du er ved at logge ind med en tredjepartskonto fra %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Log ind afbrudt\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Du valgte at afbryde log ind på vores side med en af dine eksisterende \"\n\"konti. Hvis det var en fejl, så fortsæt venligst til <a \"\n\"href=“%(login_url)s”>log ind</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Tredjepartskontoen er blevet tilsluttet.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Tredjepartskontoen er blevet frakoblet.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Du er ved at bruge din %(provider_name)s -konto til at logge ind i\\n\"\n\"%(site_name)s. Som et sidste skridt, udfyld venligst denne formular:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Eller brug en tredjepart\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Logget ud af alle andre sessioner.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Startet kl.\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP-adresse\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Browser\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Sidst set kl.\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Nuværende\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Log ud af andre sessioner\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Brugersessioner\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"sessionsnøgle\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Kontoforbindelser\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Adgangskoden skal være på mindst {0} tegn.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Hej fra %(site_name)s!\\n\"\n#~ \"\\n\"\n#~ \"Du har modtaget denne email fordi du eller en anden har bedt om et \"\n#~ \"password til din konto.\\n\"\n#~ \"Den kan trygt ses bort fra, hvis du ikke har bedt om at få nulstillet dit \"\n#~ \"password. Klik linket herunder for at nulstille dit password.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"De følgende emailadresser er tilknyttet din konto:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Bekræft venligst din emailadresse\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Log venligst ind med en\\n\"\n#~ \"af dine eksisterende tredjeparts konti. Eller, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">opret</a>\\n\"\n#~ \"en konto på %(site_name)s og log ind herunder:\"\n\n#~ msgid \"or\"\n#~ msgstr \"eller\"\n\n#~ msgid \"change password\"\n#~ msgstr \"ændr password\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"OpenID Log ind\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Denne emailadresse er allerede knyttet til en anden konto.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Vi har sendt dig en email. Kontakt os venligst, hvis du ikke modtager den \"\n#~ \"i løbet af et par minutter.\"\n"
  },
  {
    "path": "allauth/locale/de/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n# Translators:\n# Jannis Vajen, 2013-2014\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: django-allauth\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-02-13 09:05-0600\\n\"\n\"PO-Revision-Date: 2025-10-31 09:40+0000\\n\"\n\"Last-Translator: sowinski <philipp.sowinski@gmail.com>\\n\"\n\"Language-Team: German <https://hosted.weblate.org/projects/allauth/django-allauth/de/>\\n\"\n\"Language: de\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 5.14.1-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Dieses Konto ist derzeit inaktiv.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Du kannst deine primäre E-Mail-Adresse nicht löschen.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Diese E-Mail-Adresse wird bereits in diesem Konto verwendet.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Die E-Mail-Adresse und/oder das Passwort sind leider falsch.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"\"\n\"Die angegebene Telefonnummer und/oder das Passwort sind leider falsch.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Es ist bereits jemand mit dieser E-Mail-Adresse registriert.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Bitte gib dein aktuelles Passwort ein.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Falscher Code.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Falsches Passwort.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Falsches oder abgelaufenes Token.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Ungültige Anmeldung.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Das Sicherheits-Token zum Zurücksetzen des Passwortes war ungültig.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Du kannst nicht mehr als %d E-Mail-Adressen hinzufügen.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Es ist bereits ein Benutzer mit dieser Rufnummer registriert.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"\"\n\"Zu viele gescheiterte Anmeldeversuche. Bitte versuche es später erneut.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Diese E-Mail-Adresse ist keinem Konto zugeordnet.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Die Telefonnummer ist keinem Benutzerkonto zugeordnet.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Deine primäre E-Mailadresse muss bestätigt werden.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"Anmeldename kann nicht verwendet werden. Bitte wähle einen anderen Namen.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Der Anmeldename und/oder das Passwort sind leider falsch.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Bitte wähle nur eine aus.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Die neue Wert muss sich vom aktuellen unterscheiden.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Bitte habe Geduld, du sendest zu viele Anfragen.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Verwenden Sie Ihr Passwort\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Verwenden Sie eine Authentifizierungs-App oder einen Code\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Verwenden Sie einen Sicherheitsschlüssel\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} als verifiziert markieren.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Fehler beim Markieren von {email} als verifiziert.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Markierte E-Mail-Adressen als verifiziert kennzeichnen\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Konten\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-Mail\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"E-Mail-Adresse\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Geben Sie eine Telefonnummer einschließlich Ländervorwahl ein (z. B. +49 für\"\n\" Deutschland).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Du musst zweimal das selbe Passwort eingeben.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Passwort\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Angemeldet bleiben\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Anmeldename\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Anmeldung\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Anmeldename, E-Mail oder Telefon\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Anmeldename oder E-Mail\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Anmeldename oder Telefon\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-Mail oder Telefon\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Passwort vergessen?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-Mail (wiederholen)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Bestätigung der E-Mail-Adresse\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-Mail (optional)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Anmeldename (optional)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Du musst zweimal dieselbe E-Mail-Adresse eingeben.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Passwort (Wiederholung)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Aktuelles Passwort\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Neues Passwort\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Neues Passwort (Wiederholung)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Code\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"Benutzer\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"E-Mail-Adresse\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"bestätigt\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"Primär\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"E-Mail-Adressen\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"Erstellt\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"Gesendet\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"Schlüssel\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"E-Mail-Bestätigung\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"E-Mail-Bestätigungen\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Kopflos\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Deine Benutzer-ID ansehen\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Deine E-Mail-Adresse ansehen\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Deine grundlegenden Profilinformationen ansehen\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Berechtigungen erteilen\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Platzhalter sind nicht erlaubt, es sei denn, 'URI-Platzhalter zulassen' ist \"\n\"aktiviert.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' enthält mehr als einen Platzhalter (*). Pro URI ist nur ein \"\n\"Platzhalter erlaubt.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Platzhalter sind nur im Hostnamen-Teil der URI erlaubt.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Autorisierungscode\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Gerätecode\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Client-Anmeldedaten\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Token auffrischen\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Vertraulich\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Öffentlich\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Die Geltungsbereiche, die der Client anfordern darf. Gib einen Wert pro \"\n\"Zeile an, z.B.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Falls der Client keinen Geltungsbereich angibt, werden diese Standard-\"\n\"Geltungsbereiche verwendet. Gib einen Wert pro Zeile an, z.B.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Eine Liste erlaubter Grant-Typen. Gib einen Wert pro Zeile an, z.B.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Eine Liste erlaubter Ursprünge für Cross-Origin-Anfragen, eine pro Zeile.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Platzhalter (*) in Weiterleitungs-URIs und CORS-Ursprüngen zulassen. Wenn \"\n\"aktiviert, können URIs ein einzelnes Sternchen enthalten, um Subdomains \"\n\"abzugleichen.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Eine Liste erlaubter Antworttypen. Gib einen Wert pro Zeile an, z.B.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"Client\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"Clients\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Sie können keine E-Mail-Adresse zu einem Konto hinzufügen, das durch die \"\n\"Zwei-Faktor-Authentifizierung geschützt ist.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Sie können die Zwei-Faktor-Authentifizierung nicht deaktivieren.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Sie können keine Wiederherstellungscodes generieren, ohne die Zwei-Faktor-\"\n\"Authentifizierung aktiviert zu haben.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Sie können die Zwei-Faktor-Authentifizierung nicht aktivieren, bis Sie Ihre \"\n\"E-Mail-Adresse verifiziert haben.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Hauptschlüssel\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Sicherungsschlüssel\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Schlüsselnr. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Wiederherstellungs-Codes\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP Authenticator\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Authentifizierungscode\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Passwortlos\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Wenn Sie den passwortlosen Betrieb aktivieren, können Sie sich nur mit \"\n\"diesem Schlüssel anmelden, müssen aber zusätzliche Anforderungen erfüllen, \"\n\"wie z. B. biometrische Daten oder PIN-Schutz.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Es existiert bereits ein Konto mit dieser E-Mail-Adresse. Bitte melde dich \"\n\"zuerst mit diesem Konto an, und verknüpfe es dann mit deinem %s-Konto.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Falsches Token.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Für dein Konto wurde noch kein Passwort festgelegt.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Dein Konto hat keine bestätigte E-Mail-Adresse.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"\"\n\"Sie können Ihr letztes verbleibendes Drittanbieterkonto nicht trennen.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"\"\n\"Das Konto des Drittanbieters ist bereits mit einem anderen Konto dieser \"\n\"Seite verknüpft.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Konto\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"Anbieter\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"Anbieter-ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"Name\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"Client-ID\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"App-ID oder 'Consumer key'\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"Geheimer Schlüssel\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"'API secret', 'client secret' oder 'consumer secret'\"\n\n#: socialaccount/models.py:70\n#: templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Schlüssel\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"Soziale Anwendung\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"Soziale Anwendungen\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"UID\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"Letzte Anmeldung\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"Registrierdatum\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"Weitere Daten\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"Soziales Konto\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"Soziale Konten\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"Token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) oder \\\"access token\\\" (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"Geheimes Token\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) oder \\\"refresh token\\\" (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"Läuft ab\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"Token für soziale Anwendung\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"Tokens für soziale Anwendungen\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Ungültige Profildaten\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Anmeldung\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Abbrechen\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: \"\n\"%s.\"\nmsgstr \"\"\n\"Ungültige Antwort von \\\"%s\\\" als Anfrageschlüssel erbeten wurde. Die Antwort\"\n\" war: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Ungültige Antwort von \\\"%s\\\" als Zugangsschlüssel erbeten wurde.\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Kein Request-Token gespeichert für \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Kein Access-Token gespeichert für \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Kein Zugriff zu privaten Daten auf \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Ungültige Antwort von \\\"%s\\\" als Anfrageschlüssel erbeten wurde.\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Konto inaktiv\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Dieses Konto ist inaktiv.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Wir haben einen Code an %(recipient)s gesendet. Der Code läuft in Kürze ab, \"\n\"bitte geben Sie ihn bald ein.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Bestätigen\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Neuen Code anfordern\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Zugriff bestätigen\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Bitte authentifizieren Sie sich erneut, um Ihr Konto zu schützen.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Alternative Optionen\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"E-Mail-Verifizierung\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Geben Sie den E-Mail-Bestätigungscode ein\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Andere E-Mail-Adresse verwenden\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Anmeldung\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Anmeldecode eingeben\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Passwort zurücksetzen\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Passwort-Zurücksetzungscode Eingeben\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Telefonverifizierung\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Geben Sie den Telefon-Bestätigungscode ein\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Eine andere Telefonnummer verwenden\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"E-Mail-Adressen\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Folgende E-Mail-Adressen sind mit diesem Konto verknüpft:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Bestätigt\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Unbestätigt\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Primär\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Als primäre Adresse festlegen\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Bestätigungs-Mail nochmal verschicken\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Ausgewählte entfernen\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"E-Mail-Adresse hinzufügen\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"E-Mail hinzufügen\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Möchtest du wirklich die ausgewählte E-Mail-Adresse entfernen?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you have\\n\"\n\"forgotten about this, please use the password forgotten procedure to recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Du erhältst diese E-Mail, weil du oder jemand anderes versucht hat, sich für ein Konto anzumelden mit E-Mail-Adresse:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Es existiert jedoch bereits ein Konto mit dieser E-Mail-Adresse. Falls du dies vergessen hast, verwende bitte das Passwort-Vergessen-Verfahren, um dein Konto wiederherzustellen:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Konto existiert bereits\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Hallo von %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Danke dass du %(site_name)s nutzt!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Sie erhalten diese E-Mail, weil die folgende Änderung an Ihrem Konto \"\n\"vorgenommen wurde:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Wenn Sie diese Änderung nicht erkennen, ergreifen Sie bitte umgehend angemessene Sicherheitsmaßnahmen. Die Änderung an Ihrem Konto stammt von:\\n\"\n\"\\n\"\n\"- IP-Adresse: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Datum: %(timestamp)s\\\"\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Ihre E-Mail wurde von %(from_email)s auf %(to_email)s geändert.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"E-Mail geändert\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Ihre E-Mail wurde bestätigt.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"E-Mail-Bestätigung\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Sie erhalten diese E-Mail, weil Benutzer %(user_display)s Ihre E-Mail-\"\n\"Adresse angegeben hat, um ein Konto bei %(site_domain)s zu registrieren.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Ihr E-Mail-Verifizierungscode ist unten aufgeführt. Bitte geben Sie diese in\"\n\" Ihrem geöffneten Browserfenster ein.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"\"\n\"Um zu bestätigen, dass dies korrekt ist, gehen Sie zu %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Bitte bestätige deine E-Mail-Adresse\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"Die E-Mail-Adresse %(deleted_email)s wurde aus Ihrem Konto entfernt.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"E-Mail entfernt\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Ihr Anmeldecode steht unten. Bitte geben Sie ihn in Ihrem geöffneten \"\n\"Browserfenster ein.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Diese E-Mail kann ignoriert werden, wenn Sie diese Aktion nicht initiiert \"\n\"haben.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Anmeldecode\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Dein Passwort wurde geändert.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Passwort geändert\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Ihre Passwort-Zurücksetzungscode steht unten. Bitte geben Sie ihn in Ihrem \"\n\"geöffneten Browserfenster ein.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Passwort-Zurücksetzungscode\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the link below to reset your password.\"\nmsgstr \"\"\n\"Du erhältst diese E-Mail weil du oder jemand anderes die Zurücksetzung des Passwortes für dein Konto gefordert hat.\\n\"\n\"Falls es sich dabei nicht um dich handelt, kann diese Nachricht ignoriert werden. Rufe folgende Adresse auf um dein Passwort zurückzusetzen.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"\"\n\"Falls du deinen Anmeldenamen vergessen haben solltest; er lautet \"\n\"%(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"E-Mail zum Zurücksetzen des Passworts\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Ihr Passwort wurde zurückgesetzt.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Ihr Passwort wurde festgelegt.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Passwort festgelegt\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Sie erhalten diese E-Mail, weil Sie oder jemand anderes versucht hat, auf \"\n\"ein Konto mit der E-Mail %(email)s zuzugreifen. Wir haben jedoch keinen \"\n\"solchen Account in unserer Datenbank gefunden.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Wenn es von Ihnen war, können Sie über den unten stehenden Link ein Konto \"\n\"erstellen.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Unbekanntes Konto\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Email-Adresse\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Aktuelle E-Mail\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Wechsel zu\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Deine E-Mail-Adresse steht immer noch aus und muss überprüft werden.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Änderung abbrechen\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Ändern zu\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Email ändern\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"E-Mail-Adresse bestätigen\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Bitte bestätige, dass <a href=\\\"mailto:%(email)s\\\">%(email)s</a> eine \"\n\"E-Mail-Adresse von %(user_display)s ist.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Kann %(email)s nicht bestätigen, da sie bereits von einem anderen Konto \"\n\"bestätigt wurde.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Dieser Bestätigungslink ist leider abgelaufen. Lass Dir bitte eine neue <a \"\n\"href=\\\"%(email_url)s\\\">Bestätigungs-Mail</a> schicken.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Du hast noch kein Konto bei uns? Dann %(link)serstelle%(end_link)s bitte \"\n\"zunächst eins.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Mit einem Passkey anmelden\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Anmeldecode senden\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Abmelden\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Bist du sicher, dass du dich abmelden möchtest?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Du kannst deine primäre E-Mail-Adresse (%(email)s) nicht löschen.\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Bestätigungs-E-Mail wurde an %(email)s verschickt.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Du hast die Adresse %(email)s bestätigt.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"E-Mailadresse %(email)s entfernt.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Erfolgreich als %(name)s angemeldet.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Du hast dich abgemeldet.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Ein Anmeldecode wurde an %(recipient)s gesendet.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Das Passwort wurde geändert.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Das Passwort wurde erfolgreich gesetzt.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Ein Verifizierungscode wurde an %(phone)s gesendet.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Sie haben die Telefonnummer %(phone)s verifiziert.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Primäre E-Mailadresse festgelegt.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Passwort ändern\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Passwort vergessen?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Passwort vergessen? Gib deine E-Mail-Adresse unten ein, dann schicken wir \"\n\"dir einen Link, unter dem du dein Passwort zurücksetzen kannst.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Passwort zurücksetzen\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Bitte kontaktiere uns, wenn das Zurücksetzen des Passworts nicht klappt.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Wir haben Dir eine E-Mail geschickt. Wenn du die E-Mail nicht in deinem \"\n\"Posteingang siehst, überprüfe bitte deinen Spam-Ordner. Wenn die E-Mail \"\n\"ansonsten nicht in ein paar Minuten angekommen ist, gib uns bitte Bescheid.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Falsches Token\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password \"\n\"reset</a>.\"\nmsgstr \"\"\n\"Der Link zum Zurücksetzen des Passworts war ungültig, womöglich wurde dieser\"\n\" Link bereits benutzt. Bitte lass dein Passwort noch mal <a \"\n\"href=\\\"%(passwd_reset_url)s\\\">zurücksetzen</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Dein Passwort wurde geändert.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Passwort setzen\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Telefon ändern\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Aktuelle Telefonnummer\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Dein Telefonnummer steht immer noch aus und muss überprüft werden.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Telefon ändern\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Geben Sie Ihr Passwort ein:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Sie erhalten einen speziellen Code für eine passwortfreie Anmeldung.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Code anfordern\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Andere Anmeldeoptionen\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Registrieren\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74\n#: templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Registrieren\"\n\n#: templates/account/signup.html:17\n#: templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"\"\n\"Du hast bereits ein Konto bei uns? Dann bitte %(link)shier \"\n\"entlang%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Mit einem Passkey registrieren\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Passkey Registrierung\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Andere Optionen\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Registrierung geschlossen\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Es tut uns leid, aber die Registrierung ist derzeit geschlossen.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Anmerkung\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Du bist bereits als %(user_display)s angemeldet.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Warnung:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an\"\n\" email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Du hast derzeit keine E-Mail-Adressen angegeben. Das solltest du allerdings \"\n\"tun, denn nur so können wir dich benachrichtigen und dein Passwort \"\n\"zurücksetzen.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Bestätige deine E-Mail-Adresse\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Wir haben dir eine E-Mail geschickt, um deine Adresse zu verifizieren. Bitte\"\n\" folge dem Link in der E-Mail um den Anmeldeprozess abzuschließen. Wenn du \"\n\"die E-Mail nicht in deinem Posteingang siehst, überprüfe bitte deinen Spam-\"\n\"Ordner. Wenn die E-Mail nicht in ein paar Minuten angekommen ist, gib uns \"\n\"bitte Bescheid.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Auf diesem Teil der Webseite möchten wie sichergehen,\\n\"\n\"dass du die Person bist für die du dich ausgibst.\\n\"\n\"Dazu musst du deine E-Mail-Adresse verifizieren. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see the verification email in your main inbox, check your spam folder. Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Wir haben Dir eine E-Mail geschickt, um deine\\n\"\n\"Adresse zu verifizieren. Bitte klick auf den Link\\n\"\n\"in der E-Mail. Wenn du die E-Mail nicht in deinem Posteingang siehst, überprüfe bitte deinen Spam-Ordner. Wenn die E-Mail ansonsten nicht in ein paar Minuten angekommen ist, gib uns bitte Bescheid.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Anmerkung:</strong> Du kannst <a href=\\\"%(email_url)s\\\">Deine \"\n\"E-Mail-Adresse ändern</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Nachrichten:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menü\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Konto-Verknüpfungen\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Zwei-Faktor-Authentifizierung\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sitzungen\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autorisieren\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s möchte auf dein %(site_name)s Konto zugreifen.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Gerätecode eingeben\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Gib den auf deinem Gerät angezeigten Code ein.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Fortfahren\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Gerät bestätigen\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Bitte bestätige den auf deinem %(client_name)s angezeigten Code, um dieses \"\n\"Gerät zu autorisieren.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Ablehnen\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Gerät autorisiert\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Du hast dein %(client_name)s Gerät erfolgreich autorisiert.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Gerät abgelehnt\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Die Autorisierung für dein %(client_name)s Gerät wurde abgelehnt.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Fehler\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Angemeldet bleiben\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Ihr Konto ist durch Zwei-Faktor-Authentifizierung geschützt. Bitte geben Sie\"\n\" einen Authenticator-Code ein:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"Ein neuer Satz Wiederherstellungscodes wurde generiert.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Neue Wiederherstellungscodes generiert\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Authenticator-App aktiviert.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Authenticator-App aktiviert\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Authenticator-App deaktiviert.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Authenticator-App deaktiviert\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Es wurde ein neuer Sicherheitsschlüssel hinzugefügt.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Sicherheitsschlüssel hinzugefügt\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Ein Sicherheitsschlüssel wurde entfernt.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Sicherheitsschlüssel entfernt\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Authenticator-App\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Die Authentifizierung mit einer Authenticator-App ist aktiv.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Es ist keine Authenticator-App aktiv.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Deaktivieren\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktivieren\"\n\n#: templates/mfa/index.html:45\n#: templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Sicherheitsschlüssel\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Sie haben %(count)s Sicherheitsschlüssel hinzugefügt.\"\nmsgstr[1] \"Sie haben %(count)s Sicherheitsschlüssel hinzugefügt.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Es wurden keine Sicherheitsschlüssel hinzugefügt.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Verwalten\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Hinzufügen\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Wiederherstellungs-Codes\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Es steht %(unused_count)s von %(total_count)s Wiederherstellungscodes zur \"\n\"Verfügung.\"\nmsgstr[1] \"\"\n\"Es stehen %(unused_count)s von %(total_count)s Wiederherstellungscodes zur \"\n\"Verfügung.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Es wurden keine Wiederherstellungscodes eingerichtet.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Anzeigen\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Herunterladen\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Generieren\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Ein neuer Satz Wiederherstellungscodes wurde generiert.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Sicherheitsschlüssel hinzugefügt.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Sicherheitsschlüssel entfernt.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Geben Sie einen Authentifizierungscode ein:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"\"\n\"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\"Du bist dabei, einen neuen Satz Wiederherstellungscodes für Ihr Konto zu \"\n\"generieren.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Diese Aktion wird Ihre vorhandenen Codes ungültig machen.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Sind Sie sicher?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Unbenutzte Codes\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Codes herunterladen\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Neue Codes generieren\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Authenticator-App aktivieren\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Um Ihr Konto mit der Zwei-Faktor-Authentifizierung zu schützen, scannen Sie \"\n\"den unten stehenden QR-Code mit Ihrer Authenticator-App. Geben Sie dann den \"\n\"von der App generierten Bestätigungscode unten ein.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Authentifizierungsgeheimnis\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Sie können dieses Geheimnis speichern und zu einem späteren Zeitpunkt \"\n\"verwenden, um Ihre Authenticator-App neu zu installieren.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Authenticator-App deaktivieren\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Du bist dabei, die Authentifizierung per Authenticator-App zu deaktivieren. \"\n\"Sind Sie sicher?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Diesem Browser vertrauen?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Wenn Sie diesem Browser vertrauen, brauchen Sie beim nächsten Anmelden \"\n\"keinen Bestätigungscode.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Für %(period)s vertrauen\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Nicht vertrauen\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Sicherheitsschlüssel hinzufügen\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Sicherheitsschlüssel entfernen\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"\"\n\"Sind Sie sicher, dass Sie diesen Sicherheitsschlüssel entfernen möchten?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Verwendung\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Passkey\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Sicherheitsschlüssel\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Dieser Schlüssel gibt nicht an, ob es sich um einen Passkey handelt.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Unbestimmt\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Hinzugefügt um %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Zuletzt verwendet %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Bearbeiten\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Sicherheitsschlüssel bearbeiten\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Speichern\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Passkey erstellen\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Sie sind dabei, einen Passkey für Ihr Konto zu erstellen. Da Sie später \"\n\"weitere Schlüssel hinzufügen können, können Sie einen beschreibenden Namen \"\n\"verwenden, um die Schlüssel voneinander zu unterscheiden.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Erstellen\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Diese Funktionalität erfordert JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Drittanbieter-Anmeldefehler\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Beim Versuch, sich über Ihr Drittanbieterkonto anzumelden, ist ein Fehler \"\n\"aufgetreten.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Sie können sich bei Ihrem Konto mit einem der folgenden Drittanbieter-Konten\"\n\" anmelden:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Derzeit sind keine Drittanbieterkonten mit diesem Konto verbunden.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Einen Drittanbieter-Account hinzufügen\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"\"\n\"Ein Drittanbieterkonto von %(provider)s wurde mit Ihrem Konto verbunden.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Drittanbieterkonto verbunden\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"Ein Drittanbieterkonto von %(provider)s wurde von Ihrem Konto getrennt.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Drittanbieterkonto getrennt\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Mit %(provider)s verbinden\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Du bist dabei, ein neues Drittanbieter-Konto von %(provider)s zu verknüpfen.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Anmelden über %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"\"\n\"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Du bist dabei, dich mit einem Konto von %(provider)s anzumelden.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Anmeldung abgebrochen\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Du hast die Anmeldung abgebrochen. Wenn das nur ein Versehen oder ein Fehler\"\n\" war, folge bitte diesem <a href=\\\"%(login_url)s\\\">Link</a> um dich \"\n\"anzumelden.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Konten wurden erfolgreich verknüpft.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Das Drittanbieterkonto wurde getrennt.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Du verwendest dein %(provider_name)s-Konto, um dich bei\\n\"\n\"%(site_name)s anzumelden. Zum Abschluss bitte das folgende Formular ausfüllen:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Oder Drittanbieter verwenden\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Von allen anderen Sitzungen abgemeldet.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Gestartet um\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP-Adresse\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Browser\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Zuletzt gesehen um\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Aktuell\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Andere Sitzungen abmelden\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Benutzersitzungen\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"Sitzungsschlüssel\"\n\n#~ msgid \"Account Connection\"\n#~ msgstr \"Konto-Verknüpfung\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Das Passwort muss aus mindestens {0} Zeichen bestehen.\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Du erhältst diese E-Mail weil du oder jemand anderes die Zurücksetzung des Passwortes für dein Konto gefordert hat. Wir haben jedoch keinen Eintrag eines Benutzers mit der E-Mail-Adresse %(email)s in unserer Datenbank.\\n\"\n#~ \"\\n\"\n#~ \"Falls es sich dabei nicht um dich handelt, kann diese Nachricht ignoriert werden.\\n\"\n#~ \"\\n\"\n#~ \"Ansonsten kannst du dich über den unten stehenden Link für ein Konto anmelden.\"\n\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Die folgende Email-Adresse ist mit Ihrem Konto verknüpft:\"\n\n#~ msgid \"Change Email Address\"\n#~ msgstr \"E-Mail-Adresse ändern\"\n\n#~ msgid \"To safeguard the security of your account, please enter your password:\"\n#~ msgstr \"\"\n#~ \"Um die Sicherheit Ihres Kontos zu gewährleisten, geben Sie bitte Ihr \"\n#~ \"Passwort ein:\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Bitte melde dich mit einem der folgenden Netzwerkkonten an, oder  <a \\n\"\n#~ \"href=\\\"%(signup_url)s\\\">registriere dich auf %(site_name)s</a>, dann kannst du dich unten mit deinem Konto anmelden:\"\n\n#~ msgid \"or\"\n#~ msgstr \"oder\"\n\n#~ msgid \"change password\"\n#~ msgstr \"Passwort ändern\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"OpenID-Anmeldung\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Diese E-Mail-Adresse wird bereits in einem anderen Konto verwendet.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Wir haben Dir eine E-Mail geschickt. Bitte kontaktiere uns, wenn du sie \"\n#~ \"nicht in ein paar Minuten erhalten hast.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"Die Anmeldedaten sind leider falsch.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"\"\n#~ \"Anmeldenamen dürfen nur Buchstaben und Ziffern und folgende Zeichen \"\n#~ \"enthalten: @/./+/-/_.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"Der Anmeldename ist bereits vergeben – bitte wähle einen anderen.\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"Du hast bestätigt, dass <a href=\\\"mailto:%(email)s\\\">%(email)s</a> eine \"\n#~ \"gültige Adresse von %(user_display)s ist.\"\n\n#~ msgid \"Thanks for using our site!\"\n#~ msgstr \"Danke, dass du unsere Seite nutzt!\"\n"
  },
  {
    "path": "allauth/locale/el/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-07-25 20:24+0200\\n\"\n\"Last-Translator: Antonis Christofides <invoices@antonischristofides.com>\\n\"\n\"Language-Team: Greek <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/el/>\\n\"\n\"Language: el\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 5.13-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Αυτός ο λογαριασμός είναι ανενεργός.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"\"\n\"Δεν μπορείτε να καταργήσετε την κύρια διεύθυνση ηλεκτρονικού ταχυδρομείου \"\n\"σας.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Αυτό το e-mail χρησιμοποιείται ήδη από αυτό το λογαριασμό.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Η διέυθυνση e-mail ή/και το συνθηματικό που δόθηκαν δεν είναι σωστά.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"\"\n\"Ο αριθμός τηλεφώνου ή/και ο κωδικός πρόσβασης που δηλώσατε δεν είναι σωστοί.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Υπάρχει ήδη εγγεγραμμένος χρήστης με αυτό το e-mail.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Παρακαλώ γράψτε το τρέχον συνθηματικό σας.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Λανθασμένος κωδικός.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Λάθος κωδικός πρόσβασης.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Μη έγκυρο ή ληγμένο κλειδί.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Μη έγκυρη σύνδεση.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Το κουπόνι επαναφοράς του συνθηματικού δεν ήταν έγκυρο.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Δεν μπορείτε να προσθέσετε περισσότερες από %d διευθύνσεις email.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Υπάρχει ήδη εγγεγραμμένος χρήστης με αυτό τον αριθμό τηλεφώνου.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Πολλές αποτυχημένες προσπάθειες σύνδεσης. Προσπαθήστε ξανά αργότερα.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"\"\n\"Η διεύθυνση ηλεκτρονικού ταχυδρομείου δεν αποδίδεται σε κανένα λογαριασμό \"\n\"χρήστη.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Ο αριθμός τηλεφώνου δεν έχει εκχωρηθεί σε κανένα λογαριασμό χρήστη.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Η πρωτεύον διεύθυνση e-mail πρέπει να επιβεβαιωθεί.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Δεν μπορεί να χρησιμοποιηθεί αυτό το όνομα χρήστη. Δοκιμάστε άλλο.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Το όνομα χρήστη ή/και το συνθηματικό που δόθηκαν δεν είναι σωστά.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Παρακαλώ επιλέξτε μόνο ένα.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Η νέα τιμή πρέπει να είναι διαφορετική από την τρέχουσα.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Παρακαλώ περιμένετε, στέλνετε πάρα πολλά αιτήματα.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Χρησιμοποιήστε τον κωδικό πρόσβασής σας\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Χρήση εφαρμογής ή κωδικού πιστοποίησης ταυτότητας\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Χρήση κλειδιού ασφαλείας\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Η διεύθυνση {email} σημειώθηκε ως επαληθευμένη.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Αποτυχία σήμανσης του {email} ως επαληθευμένου.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Σημείωση επιλεγμένων διευθύνσεων email όπως επαληθεύτηκε\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Λογαριασμοί\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Διεύθυνση e-mail\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Εισάγετε έναν αριθμό τηλεφώνου, συμπεριλαμβανομένου του κωδικού χώρας (π.χ. \"\n\"+1 για τις ΗΠΑ).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Τηλέφωνο\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Πρέπει να δοθεί το ίδιο συνθηματικό.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Συνθηματικό\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Αυτόματη Σύνδεση\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Όνομα χρήστη\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Σύνδεση\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Όνομα χρήστη, email ή τηλέφωνο\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Όνομα χρήστη ή e-mail\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Όνομα χρήστη ή τηλέφωνο\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Ηλεκτρονικό ταχυδρομείο ή τηλέφωνο\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Ξεχάσατε το συνθηματικό σας;\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"Ηλεκτρονικό ταχυδρομείο (ξανά)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Επιβεβαίωση διεύθυνσης ηλεκτρονικού ταχυδρομείου\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-mail (προαιρετικό)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Όνομα χρήστη (προαιρετικό)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Πρέπει να πληκτρολογείτε το ίδιο email κάθε φορά.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Συνθηματικό (επιβεβαίωση)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Τρέχον συνθηματικό\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Νέο συνθηματικό\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Νέο συνθηματικό (επιβεβαίωση)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Κωδικός\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"χρήστης\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"διεύθυνση e-mail\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"επαληθευμένο\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"πρωτεύον\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"διευθύνσεις e-mail\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"δημιουργήθηκε\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"απστάλει\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"κλειδί\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"e-mail επιβεβαίωσης\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"e-mail επιβεβαίωσης\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Ακέφαλος\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Προβολή του αναγνωριστικού χρήστη σας\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Προβολή της διεύθυνσης email σας\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Προβολή των βασικών πληροφοριών προφίλ σας\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Παραχώρηση δικαιωμάτων\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Οι χαρακτήρες μπαλαντέρ (*) δεν επιτρέπονται εκτός εάν είναι ενεργοποιημένη \"\n\"η επιλογή 'Επιτρέψτε χαρακτήρες μπαλαντέρ σε URI'.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"Το URI '{}' περιέχει περισσότερους από έναν χαρακτήρες μπαλαντέρ (*). \"\n\"Επιτρέπεται μόνο ένας χαρακτήρας μπαλαντέρ ανά URI.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"\"\n\"Οι χαρακτήρες μπαλαντέρ (*) επιτρέπονται μόνο στο τμήμα του ονόματος \"\n\"κεντρικού υπολογιστή του URI.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Κωδικός εξουσιοδότησης\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Κωδικός συσκευής\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Διαπιστευτήρια πελάτη\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Token ανανέωσης\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Εμπιστευτικό\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Δημόσιο\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Τα πεδία εφαρμογής (scopes) που ο πελάτης επιτρέπεται να ζητήσει. Δώστε μία \"\n\"τιμή ανά γραμμή, π.χ.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Σε περίπτωση που ο πελάτης δεν καθορίσει κάποιο πεδίο εφαρμογής, \"\n\"χρησιμοποιούνται αυτά τα προεπιλεγμένα. Δώστε μία τιμή ανά γραμμή, π.χ.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Μια λίστα επιτρεπόμενων τύπων εξουσιοδότησης. Δώστε μία τιμή ανά γραμμή, \"\n\"π.χ.: authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Μια λίστα επιτρεπόμενων πηγών για αιτήματα cross-origin, μία ανά γραμμή.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Επιτρέψτε χαρακτήρες μπαλαντέρ (*) σε URI ανακατεύθυνσης και πηγές CORS. \"\n\"Όταν είναι ενεργοποιημένο, τα URI μπορούν να περιέχουν έναν αστερίσκο για \"\n\"αντιστοίχιση υποτομέων.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Μια λίστα επιτρεπόμενων τύπων απόκρισης. Δώστε μία τιμή ανά γραμμή, π.χ.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"πελάτης\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"πελάτες\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Δεν μπορείτε να προσθέσετε μια διεύθυνση ηλεκτρονικού ταχυδρομείου σε έναν \"\n\"λογαριασμό που προστατεύεται με έλεγχο ταυτότητας δύο παραγόντων.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Δεν μπορείτε να απενεργοποιήσετε τον έλεγχο ταυτότητας δύο παραγόντων.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Δεν μπορείτε να δημιουργήσετε κωδικούς ανάκτησης χωρίς να έχετε \"\n\"ενεργοποιήσει τον έλεγχο ταυτότητας δύο παραγόντων.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Δεν μπορείτε να ενεργοποιήσετε τον έλεγχο ταυτότητας δύο παραγόντων μέχρι να \"\n\"επαληθεύσετε τη διεύθυνση ηλεκτρονικού ταχυδρομείου σας.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Βασικό κλειδί\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Εφεδρικό κλειδί\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Αριθμός κλειδιού {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Κωδικοί ανάκτησης\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"Αυθεντικοποιητής TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Κωδικός πιστοποίησης\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Χωρίς κωδικό πρόσβασης\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Η ενεργοποίηση της λειτουργίας χωρίς κωδικό πρόσβασης σάς επιτρέπει να \"\n\"συνδεθείτε χρησιμοποιώντας μόνο αυτό το κλειδί, αλλά επιβάλλει πρόσθετες \"\n\"απαιτήσεις, όπως βιομετρικά στοιχεία ή προστασία με PIN.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Υπάρχει ήδη ένας λογαριασμός με αυτή τη διεύθυνση ηλεκτρονικού ταχυδρομείου. \"\n\"Συνδεθείτε πρώτα σε αυτόν το λογαριασμό και, στη συνέχεια, συνδέστε το \"\n\"λογαριασμό %s.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Μη έγκυρη ένδειξη.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Δεν έχει οριστεί συνθηματικό στον λογαριασμό σας.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Δεν έχει επιβεβαιωθεί κανένα e-mail του λογαριασμού σας.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Δεν μπορείτε να αποσυνδέσετε τον τελευταίο λογαριασμό τρίτων.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"\"\n\"Ο λογαριασμός κοινωνικών μέσων είναι ήδη συνδεδεμένος με διαφορετικό λΟ \"\n\"λογαριασμός τρίτου μέρους είναι ήδη συνδεδεμένος με διαφορετικό λογαριασμό.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Λογαριασμοί Κοινωνικών Μέσων\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"πάροχος\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ID παρόχου\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"όνομα\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"id πελάτη\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"App ID ή consumer key(κλειδί καταναλωτή)\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"μυστικό κλειδί\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API secret, client secret, ή consumer secret\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Κλειδί\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"εφαρμογή κοινωνικών μέσων\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"εφαρμογές κοινωνικών μέσων\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"τελευταία σύνδεση\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"ημερομηνία εγγραφής\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"έξτρα δεδομένα\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"λογαριασμός κοινωνικών μέσων\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"λογαριασμοί κοινωνικών μέσων\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"κουπόνι\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) ή access token (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"διακριτικό μυστικό\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) ή refresh token (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"λήγει στις\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"token (κουπόνι) εφαρμογής κοινωνικών μέσων\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"tokens (κουπόνια) εφαρμογής κοινωνικών μέσων\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Άκυρα δεδομένα προφίλ\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Σύνδεση\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Ακύρωση\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Μη έγκυρη απάντηση κατά τη λήψη του συμβόλου αίτησης από το «%s». Η απάντηση \"\n\"ήταν: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Μη-έγκυρη απάντηση κατά την απόκτηση κουπονιού πρόσβασης από \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Δεν υπάρχει αποθηκευμένο κουπόνι αιτήματος για \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Δεν υπάρχει αποθηκευμένο κουπόνι πρόσβασης για \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Αδύνατη πρόσβαση σε ιδιοτικούς πόρους στο \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Μη-έγκυρη απάντηση κατά την απόκτηση κουπονιού αιτήματος από \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Λογαριασμός Ανενεργός\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Αυτός ο λογαριασμός είναι ανενεργός.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Στείλαμε έναν κωδικό σε %(recipient)s). Ο κωδικός λήγει σύντομα, γι' αυτό \"\n\"παρακαλούμε εισάγετε τον σύντομα.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Επιβεβαίωση\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Ζητήστε νέο κωδικό\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Επιβεβαίωση πρόσβασης\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"\"\n\"Παρακαλείστε να επαληθεύσετε την ταυτότητά σας για να διασφαλίσετε το \"\n\"λογαριασμό σας.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Εναλλακτικές επιλογές\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Επαλήθευση email\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Εισάγετε τον κωδικό επαλήθευσης email\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Χρησιμοποιήστε άλλη διεύθυνση e-mail\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Είσοδος\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Πληκτρολογήστε τον κωδικό εισόδου\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Επαναφορά Συνθηματικού\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Εισάγετε τον κωδικό επαναφοράς κωδικού πρόσβασης\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Επαλήθευση τηλεφώνου\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Εισάγετε τον κωδικό επαλήθευσης τηλεφώνου\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Χρησιμοποιήστε άλλο αριθμό τηλεφώνου\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Διεύθυνση e-mail\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"\"\n\"Οι διευθύνσεις e-mail που ακολουθούν είναι συσχετισμένες με τον λογαριασμό \"\n\"σας:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Εγκεκριμένος\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Μη-επιβεβαιωμένο\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Πρωτεύον\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Ορισμός ως Πρωτεύον\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Επανάληψη αποστολής Επαλήθευσης\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Αφαίρεση\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Προσθήκη διέυθυνσης e-mail\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Προσθήκη e-mail\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Θέλετε να αφαιρέσετε την επλεγμένη διεύθυνση e-mail?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Λαμβάνετε αυτό το email επειδή εσείς ή κάποιος άλλος επιχείρησε να\\n\"\n\"δημιουργήσει λογαριασμό με αυτή τη διεύθυνση email:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Ωστόσο, υπάρχει ήδη  λογαριασμός που χρησιμοποιεί αυτή τη διεύθυνση email.\\n\"\n\"Μπορείτε να χρησιμοποιήσετε τη διαδικασία ξεχασμένου συνθηματικού για να\\n\"\n\"ανακτήσετε το λογαριασμό σας:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Ο λογαριασμός υπάρχει ήδη\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Γεια σας από το %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Ευχαριστούμε που χρησιμοποιείτε το %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Λαμβάνετε αυτό το μήνυμα επειδή έγινε η ακόλουθη αλλαγή στο λογαριασμό σας:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Εάν δεν αναγνωρίζετε αυτή την αλλαγή, τότε παρακαλούμε λάβετε αμέσως τα \"\n\"κατάλληλα μέτρα ασφαλείας. Η αλλαγή στο λογαριασμό σας προέρχεται από:\\n\"\n\"\\n\"\n\"- Διεύθυνση IP: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Ημερομηνία: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Το email σας έχει αλλάξει από %(from_email)s σε %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Ηλεκτρονικό ταχυδρομείο άλλαξε\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Το email σας έχει επιβεβαιωθεί.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Επιβεβαίωση μέσω ηλεκτρονικού ταχυδρομείου\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Λαμβάνετε αυτό το μήνυμα ηλεκτρονικού ταχυδρομείου επειδή ο χρήστης \"\n\"%(user_display)s έδωσε τη διεύθυνση ηλεκτρονικού ταχυδρομείου σας για την \"\n\"εγγραφή ενός λογαριασμού στο %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Ο κωδικός επαλήθευσης του email σας αναφέρεται παρακάτω. Παρακαλούμε \"\n\"εισάγετε τον στο ανοιχτό παράθυρο του προγράμματος περιήγησης.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"\"\n\"Για να επιβεβαιώσετε ότι αυτό είναι σωστό, μεταβείτε στο %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Παρακαλούμε να επιβεβαιώσετε την διεύθυνση e-mail σας\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"\"\n\"Η διεύθυνση ηλεκτρονικού ταχυδρομείου %(deleted_email)s έχει αφαιρεθεί από \"\n\"το λογαριασμό σας.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Το ηλεκτρονικό ταχυδρομείο αφαιρέθηκε\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Ο κωδικός σύνδεσής σας παρατίθεται παρακάτω. Παρακαλούμε εισάγετε τον στο \"\n\"ανοιχτό παράθυρο του προγράμματος περιήγησης.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Αυτό το μήνυμα μπορείτε να το αγνοήσετε με ασφάλεια, αν δεν προκαλέσατε \"\n\"εσείς αυτή την ενέργεια.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Κωδικός εισόδου\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Ο κωδικός πρόσβασής σας έχει αλλάξει.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Ο κωδικός πρόσβασης άλλαξε\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Ο κωδικός επαναφοράς του κωδικού πρόσβασης παρατίθεται παρακάτω. Παρακαλούμε \"\n\"εισάγετε τον στο ανοιχτό παράθυρο του προγράμματος περιήγησης.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Επαναφορά κωδικού πρόσβασης\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Λαμβάνετε αυτό το email επειδή ζητήσατε επαναφορά συνθηματικού για το \"\n\"λογαριασμό σας.\\n\"\n\"Αν αυτό δεν ισχύει, μπορείτε να αγνοήσετε αυτό το μήνυμα. Ακολουθήστε τον \"\n\"παρακάτω σύνδεσμο για να επαναφέρετε το συνθηματικό σας.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Το όνομα χρήστη σας είναι %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"E-mail επαναφοράς συνθηματικού\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Ο κωδικός πρόσβασής σας έχει επαναρυθμιστεί.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Ο κωδικός πρόσβασής σας έχει ρυθμιστεί.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Ρύθμιση κωδικού πρόσβασης\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Λαμβάνετε αυτό το email επειδή εσείς ή κάποιος άλλος προσπάθησε να αποκτήσει \"\n\"πρόσβαση σε έναν λογαριασμό με ηλεκτρονικό ταχυδρομείο %(email)s. Ωστόσο, \"\n\"δεν έχουμε καμία καταγραφή ενός τέτοιου λογαριασμού στη βάση δεδομένων μας.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Αν ήσασταν εσείς, μπορείτε να εγγραφείτε για λογαριασμό χρησιμοποιώντας τον \"\n\"παρακάτω σύνδεσμο.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Άγνωστος λογαριασμός\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Διεύθυνση ηλεκτρονικού ταχυδρομείου\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Τρέχον ηλεκτρονικό ταχυδρομείο\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Αλλάζοντας σε\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"\"\n\"Η διεύθυνση ηλεκτρονικού ταχυδρομείου σας εκκρεμεί ακόμη προς επαλήθευση.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Ακύρωση Αλλαγή\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Αλλαγή σε\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Αλλαγή ηλεκτρονικού ταχυδρομείου\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Επιβεβαίωση διεύθυνση e-mail\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Παρακαλούμε επιβεβαιώστε ότι το <a href=\\\"mailto:%(email)s\\\">%(email)s</a> \"\n\"είναι μια διεύθυνση ηλεκτρονικού ταχυδρομείου για τον χρήστη \"\n\"%(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Δεν είναι δυνατή η επιβεβαίωση του %(email)s επειδή έχει ήδη επιβεβαιωθεί \"\n\"από διαφορετικό λογαριασμό.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Αυτός ο σύνδεσμος επιβεβαίωσης email έληξε ή είναι άκυρος. Παρακαλούμε <a \"\n\"href=\\\"%(email_url)s\\\">να εκδώσετε ένα νέο αίτημα επιβεβαίωσης μέσω email</\"\n\"a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Εάν δεν έχετε δημιουργήσει ακόμη λογαριασμό, τότε παρακαλούμε πρώτα να \"\n\"%(link)sεγγραφείτε%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Συνδεθείτε με κλειδί πρόσβασης\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Στείλτε μου έναν κωδικό σύνδεσης\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Αποσύνδεση\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Σίγουρα θέλετε να αποσυνδεθείτε;\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Δεν μπορείτε να αφαιρέσετε τη βασική διεύθυνση email (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"E-mail επιβεβαίωσης στάλθηκε στο %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Έχετε επιβεβαιώσει το %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Αφαιρέθηκε η διεύθυνση e-mail %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Επιτυχημένη σύνδεση ως %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Έχετε αποσυνδεθεί.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Ένας κωδικός εισόδου έχει σταλεί στον %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Το συνθηματικό τροποποιήθηκε επιτυχώς.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Συνθηματικό ορίστηκε επιτυχώς.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Ένας κωδικός επιβεβαίωσης έχει σταλεί στο %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Έχετε επαληθεύσει τον αριθμό τηλεφώνου %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Ορίστηκε η πρωτεύον διεύθυνση e-mail.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Αλλαγή συνθηματικού\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Ξεχάσατε τον κωδικό πρόσβασης;\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Ξεχάσατε τον κωδικό πρόσβασής σας; Εισάγετε τη διεύθυνση email σας παρακάτω \"\n\"και θα σας στείλουμε ένα email που θα σας επιτρέψει να τον επαναφέρετε.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Επαναφορά του συνθηματικού μου\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Παρακαλούμε επικοινωνήστε μαζί μας αν υπάρξει οποιοδήποτε πρόβλημα κατα την \"\n\"επαναφορά του συνθηματικού σας.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Σας στείλαμε ένα email. Εάν δεν το λάβατε, παρακαλούμε ελέγξτε το φάκελο \"\n\"spam σας. Διαφορετικά, επικοινωνήστε μαζί μας εάν δεν το λάβετε σε λίγα \"\n\"λεπτά.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Λανθασμένο αναγνωριστικό\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Ο σύνδεσμος επαναφοράς συνθηματικού δεν ήταν έγκυρος, πιθανόν να έχει ήδη \"\n\"χρησιμοποιηθεί.  Παρακαλούμε ζητήστε εκ νέου <a \"\n\"href=\\\"%(passwd_reset_url)s\\\">επαναφορά συνθηματικού</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Το συνθηματικό σας έχει αλλάξει.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Ορισμός Συνθηματικού\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Αλλαγή τηλεφώνου\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Τρέχον τηλέφωνο\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Ο αριθμός τηλεφώνου σας εκκρεμεί ακόμη προς επαλήθευση.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Αλλαγή τηλεφώνου\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Εισάγετε τον κωδικό πρόσβασής σας:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Θα λάβετε έναν ειδικό κωδικό για είσοδο χωρίς κωδικό πρόσβασης.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Ζητήστε κωδικός\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Άλλες επιλογές σύνδεσης\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Εγγραφή\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Εγγραφή\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Έχετε ήδη λογαριασμό; Τότε παρακαλούμε %(link)sσυνδεθείτε%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Εγγραφείτε χρησιμοποιώντας ένα κλειδί πρόσβασης\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Εγγραφή με κλειδί πρόσβασης\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Άλλες επιλογές\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Φραγή Εγγραφών\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Ζητούμε συγνώμη, αλλά η δυνατότητα εγγραφής είναι υπό φραγή.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Σημείωση\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Έχετε ήδη συνδεθεί ως %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Προσοχη:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Προς το παρόν δεν έχετε δημιουργήσει καμία διεύθυνση ηλεκτρονικού \"\n\"ταχυδρομείου. Θα πρέπει πραγματικά να προσθέσετε μια διεύθυνση ηλεκτρονικού \"\n\"ταχυδρομείου, ώστε να μπορείτε να λαμβάνετε ειδοποιήσεις, να επαναφέρετε τον \"\n\"κωδικό πρόσβασής σας κ.λπ.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Επιβεβαιώστε την διεύθυνση e-mail σας\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Σας στείλαμε ένα email για επαλήθευση. Ακολουθήστε το σύνδεσμο που παρέχεται \"\n\"για να ολοκληρώσετε τη διαδικασία εγγραφής. Εάν δεν βλέπετε το email \"\n\"επαλήθευσης στα κύρια εισερχόμενά σας, ελέγξτε το φάκελο ανεπιθύμητης \"\n\"αλληλογραφίας. Παρακαλούμε επικοινωνήστε μαζί μας εάν δεν λάβετε το email \"\n\"επαλήθευσης μέσα σε λίγα λεπτά.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Αυτό το τμήμα του ιστότοπου απαιτεί να επαληθεύσουμε ότι\\n\"\n\"είστε αυτός που ισχυρίζεστε ότι είστε. Για το σκοπό αυτό, απαιτούμε να\\n\"\n\"επαληθεύσετε την κυριότητα της διεύθυνσης ηλεκτρονικού ταχυδρομείου σας. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Σας στείλαμε ένα email για\\n\"\n\"επαλήθευση. Παρακαλούμε κάντε κλικ στο σύνδεσμο μέσα στο email. Εάν δεν \"\n\"βλέπετε το email επαλήθευσης στα κύρια εισερχόμενά σας, ελέγξτε το φάκελο \"\n\"ανεπιθύμητης αλληλογραφίας. Διαφορετικά\\n\"\n\"επικοινωνήστε μαζί μας εάν δεν το λάβετε μέσα σε λίγα λεπτά.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Note:</strong> μπορείτε ακόμη <a href=\\\"%(email_url)s\\\">αλλάξτε τη \"\n\"διεύθυνση email σας</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Μηνύματα:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Μενού:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Συνδέσεις Λογαριασμού\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Έλεγχος ταυτότητας δύο παραγόντων\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Συνεδρίες\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Εξουσιοδότηση\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"\"\n\"Η εφαρμογή %(client_name)s θέλει πρόσβαση στο λογαριασμό σας %(site_name)s.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Εισάγετε τον κωδικό συσκευής\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Εισάγετε τον κωδικό που εμφανίζεται στη συσκευή σας.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Συνέχεια\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Επιβεβαίωση συσκευής\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Παρακαλούμε επιβεβαιώστε τον κωδικό που εμφανίζεται στο %(client_name)s σας \"\n\"για να εξουσιοδοτήσετε αυτή τη συσκευή.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Απόρριψη\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Η συσκευή εξουσιοδοτήθηκε\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Εξουσιοδοτήσατε επιτυχώς τη συσκευή %(client_name)s σας.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Η συσκευή απορρίφθηκε\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Η εξουσιοδότηση για τη συσκευή %(client_name)s σας απορρίφθηκε.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Σφάλμα\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Παραμονή σε σύνδεση\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Ο λογαριασμός σας προστατεύεται με έλεγχο ταυτότητας δύο παραγόντων. \"\n\"Παρακαλούμε εισάγετε έναν κωδικό ελέγχου ταυτότητας:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Έχει δημιουργηθεί ένα νέο σύνολο κωδικών ανάκτησης για τον έλεγχο ταυτότητας \"\n\"δύο παραγόντων.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Δημιουργία νέων κωδικών ανάκτησης\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Η εφαρμογή Authenticator ενεργοποιήθηκε.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Ενεργοποίηση της εφαρμογής Authenticator\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Η εφαρμογή Authenticator απενεργοποιήθηκε.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Απενεργοποιημένη εφαρμογή Αυθεντικοποιητή\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Έχει προστεθεί ένα νέο κλειδί ασφαλείας.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Προστέθηκε κλειδί ασφαλείας\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Ένα κλειδί ασφαλείας έχει αφαιρεθεί.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Το κλειδί ασφαλείας αφαιρέθηκε\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Εφαρμογή Αυθεντικοποιητή\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"\"\n\"Ο έλεγχος ταυτότητας με χρήση μιας εφαρμογής ελέγχου ταυτότητας είναι \"\n\"ενεργός.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Μια εφαρμογή ελέγχου ταυτότητας δεν είναι ενεργή.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Απενεργοποίηση\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Ενεργοποίηση\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Κλειδιά ασφαλείας\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Έχετε προσθέσει το κλειδί ασφαλείας %(count)s.\"\nmsgstr[1] \"Έχετε προσθέσει %(count)s κλειδιά ασφαλείας.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Δεν έχουν προστεθεί κλειδιά ασφαλείας.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Διαχείριση\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Προσθήκη\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Κωδικοί Aνάκτησης\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Υπάρχει %(unused_count)s από τους %(total_count)s διαθέσιμους κωδικούς \"\n\"ανάκτησης.\"\nmsgstr[1] \"\"\n\"Υπάρχουν %(unused_count)s από τους %(total_count)s διαθέσιμους κωδικούς \"\n\"ανάκτησης.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Δεν έχουν οριστεί κωδικοί ανάκτησης.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Προβολή\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Λήψη\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Παραγάγετε\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Δημιουργήθηκε ένα νέο σύνολο κωδικών ανάκτησης.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Προστέθηκε κλειδί ασφαλείας.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Το κλειδί ασφαλείας αφαιρέθηκε.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Εισάγετε έναν κωδικό ελέγχου ταυτότητας:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\"Πρόκειται να δημιουργήσετε ένα νέο σύνολο κωδικών ανάκτησης για το \"\n\"λογαριασμό σας.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Αυτή η ενέργεια θα ακυρώσει τους υπάρχοντες κωδικούς σας.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Είσαι σίγουρος;\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Αχρησιμοποίητοι κωδικοί\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Λήψη κωδικών\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Δημιουργία νέων κωδικών\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Ενεργοποιήστε την εφαρμογή Authenticator\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Για να προστατέψετε το λογαριασμό σας με έλεγχο ταυτότητας δύο παραγόντων, \"\n\"σαρώστε τον παρακάτω κωδικό QR με την εφαρμογή ελέγχου ταυτότητας. Στη \"\n\"συνέχεια, εισαγάγετε τον κωδικό επαλήθευσης που δημιουργείται από την \"\n\"παρακάτω εφαρμογή.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Μυστικό αυθεντικοποιητή\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Μπορείτε να αποθηκεύσετε αυτό το μυστικό και να το χρησιμοποιήσετε για να \"\n\"επανεγκαταστήσετε την εφαρμογή ελέγχου ταυτότητας σε μεταγενέστερο χρόνο.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Απενεργοποίηση της εφαρμογής Authenticator\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Πρόκειται να απενεργοποιήσετε τον έλεγχο ταυτότητας με βάση την εφαρμογή \"\n\"authenticator. Είστε σίγουροι;\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Εμπιστεύεστε αυτό το πρόγραμμα περιήγησης;\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Εάν επιλέξετε να εμπιστευτείτε αυτό το πρόγραμμα περιήγησης, δεν θα σας \"\n\"ζητηθεί κωδικός επαλήθευσης την επόμενη φορά που θα συνδεθείτε.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Εμπιστοσύνη για %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Μην εμπιστεύεστε\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Προσθήκη κλειδιού ασφαλείας\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Αφαίρεση κλειδιού ασφαλείας\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Είστε σίγουροι ότι θέλετε να αφαιρέσετε αυτό το κλειδί ασφαλείας;\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Χρήση\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Κλειδί πρόσβασης\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Κλειδί ασφαλείας\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Αυτό το κλειδί δεν υποδεικνύει αν είναι κλειδί πρόσβασης.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Απροσδιόριστο\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Προστέθηκε στις %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Τελευταία χρήση %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Επεξεργασία\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Επεξεργασία κλειδιού ασφαλείας\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Αποθήκευση\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Δημιουργία κλειδιού πρόσβασης\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Πρόκειται να δημιουργήσετε ένα κλειδί πρόσβασης για το λογαριασμό σας. Καθώς \"\n\"μπορείτε να προσθέσετε επιπλέον κλειδιά αργότερα, μπορείτε να \"\n\"χρησιμοποιήσετε ένα περιγραφικό όνομα για να ξεχωρίζετε τα κλειδιά.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Δημιουργία\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Αυτή η λειτουργία απαιτεί JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Αποτυχία σύνδεσης τρίτου μέρους\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Παρουσιάστηκε σφάλμα κατά την προσπάθεια σύνδεσης μέσω του λογαριασμού σας \"\n\"τρίτου μέρους.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Μπορείτε να συνδεθείτε στο λογαριασμό σας χρησιμοποιώντας οποιονδήποτε από \"\n\"τους ακόλουθους λογαριασμούς τρίτων:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"\"\n\"Προς το παρόν δεν έχετε συνδέσει λογαριασμούς τρίτων με αυτόν το λογαριασμό.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Προσθήκη λογαριασμού τρίτου μέρους\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"\"\n\"Ένας λογαριασμός τρίτου μέρους από τον %(provider)s έχει συνδεθεί με το \"\n\"λογαριασμό σας.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Συνδεδεμένος λογαριασμός τρίτου μέρους\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"Ένας λογαριασμός τρίτου μέρους από τον %(provider)s έχει αποσυνδεθεί από το \"\n\"λογαριασμό σας.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Αποσυνδεδεμένος λογαριασμός τρίτου μέρους\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Συνδέστε %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Πρόκειται να συνδέσετε έναν νέο λογαριασμό τρίτου μέρους από τον \"\n\"%(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Συνδεθείτε με %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Πρόκειται να συνδεθείτε χρησιμοποιώντας έναν λογαριασμό τρίτου μέρους από \"\n\"τον %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Σύνδεση ακυρώθηκε\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Αποφασίσατε να ακυρώσετε την σύνδεση σας στην ιστοσελίδα με έναν από τους \"\n\"υπάρχοντες λογαριασμούς σας. Αν έγινε κατά λάθος, παρακαλώ <a \"\n\"href=\\\"%(login_url)s\\\">συνδεθείτε</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Ο λογαριασμός τρίτου μέρους έχει συνδεθεί.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Ο λογαριασμός τρίτου μέρους έχει αποσυνδεθεί.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Πρόκειται να χρησιμοποιήσετε τον %(provider_name)s λογαριασμό σας για να \"\n\"συνδεθείτε στην σελίδα\\n\"\n\"%(site_name)s. Ως τελικό βήμα, παρακαλούμε συμπληρώστε την παρακάτω φόρμα:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Ή χρησιμοποιήστε ένα τρίτο μέρος\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Αποχώρησε από όλες τις άλλες συνεδρίες.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Ξεκίνησε στο\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"Διεύθυνση IP\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Πρόγραμμα περιήγησης\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Τελευταία φορά στο\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Τρέχον\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Αποχώρηση από άλλες συνεδρίες\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Συνεδρίες χρηστών\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"κλειδί συνεδρίας\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Συνδέσεις Λογαριασμού\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Το συνθηματικό πρέπει να περιέχει τουλάχιστον {0} χαρακτήρες.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Χαιρετίσματα από το %(site_name)s!\\n\"\n#~ \"\\n\"\n#~ \"Λαμβάνετε αυτό το e-mail επειδή εσείς ή κάποιος άλλος έχει κάνει αίτηση \"\n#~ \"συνθηματικού για τον λογαριασμό σας.\\n\"\n#~ \"Αν δεν ζητήσατε επαναφορά συνθηματικού, μπορεί να αγνοηθεί με ασφάλεια. \"\n#~ \"Πατήστε στον σύνδεσμο που ακολουθεί για να επαναφέρετε το συνθηματικό σας.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"\"\n#~ \"Οι διευθύνσεις e-mail που ακολουθούν είναι συσχετισμένες με τον \"\n#~ \"λογαριασμό σας:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Επιβεβαίωση διεύθυνση e-mail\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Παρακαλούμε συνδεθείτε με έναν\\n\"\n#~ \"από τους ήδη υπάρχοντες εξωτερικούς λογαριασμούς σας. Ή, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">κάντε εγγραφή</a>\\n\"\n#~ \"για έναν λογαριασμό %(site_name)s και συνδεθείτε παρακάτω:\"\n\n#~ msgid \"or\"\n#~ msgstr \"ή\"\n\n#~ msgid \"change password\"\n#~ msgstr \"αλλαγή συνθηματικού\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Σύνδεση OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Αυτό το e-mail χρησιμοποιείται ήδη από άλλο λογαριασμό.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Σας έχουμε στείλει ένα e-mail. Παρακαλούμε επικοινωνήστε μαζί μας αν δεν \"\n#~ \"το έχετε παραλάβει μέσα σε λίγα λεπτά.\"\n"
  },
  {
    "path": "allauth/locale/en/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-02-13 09:05-0600\\n\"\n\"PO-Revision-Date: 2023-07-24 22:28+0200\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\"Language: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"\"\n"
  },
  {
    "path": "allauth/locale/es/LC_MESSAGES/django.po",
    "content": "# Traducción al castellano de django-allauth\n# Copyright (C) 2024\n# Quique <cronopios@gmail.com>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: 0.61.1\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-11-11 12:51+0000\\n\"\n\"Last-Translator: Federico Bond <federicobond@gmail.com>\\n\"\n\"Language-Team: Spanish <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/es/>\\n\"\n\"Language: es\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n > 1);\\n\"\n\"X-Generator: Weblate 5.15-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Esta cuenta se encuentra ahora mismo desactivada.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"No puede eliminar su correo electrónico principal.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Esta dirección de correo electrónico ya está asociada a esta cuenta.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"\"\n\"La dirección de correo electrónico y/o la contraseña que ha indicado no son \"\n\"correctas.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"\"\n\"El número de teléfono y/o la contraseña que ha indicado no son correctos.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Ya hay registrado un usuario con esta dirección de correo electrónico.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Por favor, escriba su contraseña actual.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Código incorrecto.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Contraseña incorrecta.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Clave no válida o caducada.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Login inválido.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"El token para restablecer la contraseña no es válido.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"No puede añadir más de %d direcciones de correo electrónico.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Ya hay registrado un usuario con este número de teléfono.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Demasiados intentos fallidos. Inténtelo más tarde.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"\"\n\"Esta dirección de correo electrónico no está asignada a ninguna cuenta de \"\n\"usuario.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"El número de teléfono no está asignado a ninguna cuenta de usuario.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Su dirección principal de correo electrónico debe ser verificada.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"No se puede usar este nombre de usuario. Por favor, utilice otro.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"El usuario y/o la contraseña que ha indicado no son correctos.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Por favor selecciona solo uno.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"El nuevo valor debe ser diferente del actual.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Ten paciencia, estás enviando muchas solicitudes.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Utilice su contraseña\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Utiliza la aplicación o el código de autenticación\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Usar una clave de seguridad\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} se ha marcado como verificado.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"No se pudo marcar {email} como verificado.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"\"\n\"Marcar las direcciones de correo electrónico seleccionadas como verificadas\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Cuentas\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"Correo electrónico\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Dirección de correo electrónico\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Introduce un número incluyendo el código del país (ej. +34 para ES).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Teléfono\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Debe escribir la misma contraseña cada vez.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Contraseña\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Recordarme\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Usuario\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Iniciar sesión\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Usuario, correo o teléfono\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Usuario o correo electrónico\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Usuario o teléfono\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Correo electrónico o teléfono\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"¿Ha olvidado tu contraseña?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"Correo electrónico (otra vez)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Confirmación de la dirección de correo electrónico\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"Correo electrónico (opcional)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Usuario (opcional)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Debe escribir el mismo correo electrónico cada vez.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Contraseña (de nuevo)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Contraseña actual\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Nueva contraseña\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Nueva contraseña (de nuevo)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Código\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"usuario\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"dirección de correo electrónico\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"verificado\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"principal\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"direcciones de correo electrónico\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"creado\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"enviado\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"clave\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"confirmación de correo electrónico\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"confirmaciones de correo electrónico\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Ver tu ID de usuario\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Ver su dirección de correo electrónico\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Ver tu información básica de perfil\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Otorgar permisos\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"No se permiten comodines a menos que se habilite 'Permitir comodines en URI'.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"El URI '{}' contiene más de un comodín (*). Solo se permite un comodín por \"\n\"URI.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Los comodines solo se permiten en la parte del nombre de host del URI.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Código de autorización\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Código del dispositivo\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Credenciales de cliente\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Refrescar token\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Confidencial\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Público\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Los alcances que el cliente puede solicitar. Proporcione un valor por línea, \"\n\"por ejemplo: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Si el cliente no especifica ningún alcance, se utilizan estos alcances \"\n\"predeterminados. Proporcione un valor por línea, por ejemplo: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Una lista de tipos de concesión permitidos. Proporcione un valor por línea, \"\n\"por ejemplo: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Una lista de orígenes permitidos para solicitudes de origen cruzado, uno por \"\n\"línea.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Permitir comodines (*) en URIs de redirección y orígenes CORS. Cuando está \"\n\"habilitado, los URIs pueden contener un solo asterisco para coincidir con \"\n\"subdominios.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Una lista de tipos de respuesta permitidos. Proporcione un valor por línea, \"\n\"por ejemplo: code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"cliente\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"clientes\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"No puede añadir una dirección de correo electrónico a una cuenta protegida \"\n\"por la autenticación de dos factores.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"No se puede desactivar la autenticación de dos factores.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"No puedes generar códigos de recuperación sin tener activada la \"\n\"autenticación de dos factores.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"No puede activar la autenticación de dos factores hasta que haya verificado \"\n\"su dirección de correo electrónico.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Llave maestra\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Clave de respaldo\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Clave n° {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Códigos de recuperación\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"Autenticador TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Código del autenticador\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Passwordless\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Habilitar la operación sin contraseña le permite iniciar sesión usando solo \"\n\"esta clave, pero impone requisitos adicionales como biometría o protección \"\n\"con PIN.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Ya existe una cuenta con esta dirección de correo electrónico. Por favor, \"\n\"primero inicie sesión con esa cuenta, y después vincule su cuenta %s.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Token no válido.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Su cuenta no tiene ninguna contraseña.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Su cuenta no tiene ninguna dirección de correo electrónico verificada.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"No puede desconectar la última cuenta de terceros restante.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Esta cuenta externa ya está asociada a otra cuenta.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Cuentas de redes sociales\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"proveedor\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ID del proveedor\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"nombre\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"identificador del cliente\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"Identificador de App, o clave de consumidor\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"clave secreta\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"\"\n\"Clave secreta de la API, clave secreta del cliente o clave secreta del \"\n\"consumidor\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Clave\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"aplicación de redes sociales\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"aplicaciones de redes sociales\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"último inicio de sesión\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"fecha de incorporación\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"datos extra\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"cuenta de redes sociales\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"cuentas de redes sociales\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) o token de acceso (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"clave secreta del token\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) o token de refresco (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"expira el\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"token de aplicación de redes sociales\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"tokens de aplicación de redes sociales\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Datos de perfil no válidos\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Iniciar sesión\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Respuesta no válida al obtener token de solicitud de \\\"%s\\\". La respuesta \"\n\"fue: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Respuesta no válida al obtener el token de acceso de \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"No hay token de solicitud guardado para \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"No hay token de acceso guardado para \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Sin acceso a recursos privados de \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Respuesta no válida al obtener token de solicitud de \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Cuenta desactivada\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Esta cuenta está desactivada.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Hemos enviado un código a %(recipient)s. El código caduca en breve, así que \"\n\"introdúcelo pronto.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Confirmar\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Solicitar nuevo código\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Confirmar acceso\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Por favor, vuelva a autenticarse para proteger su cuenta.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Opciones alternativas\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Verificación del correo electrónico\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Introduce el código de verificación del correo electrónico\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Usar una dirección de correo electrónico diferente\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Iniciar sesión\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Ingrese el código de inicio de sesión\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Restablecer Contraseña\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Introduce el código · Restablecer Contraseña\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Reenviar Verificación telefónica\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Introduce el código de verificación del teléfono\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Usar un número de teléfono diferente\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Direcciones de correo electrónico\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"\"\n\"Las siguientes direcciones de correo electrónico están asociadas a su cuenta:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Verificado\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Sin verificar\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Principal\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Definir como principal\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Reenviar Verificación\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Eliminar\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Añadir correo electrónico\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Añadir correo electrónico\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"\"\n\"¿Seguro que desea eliminar la dirección de correo electrónico seleccionada?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Usted está recibiendo este correo electrónico porque usted u otra persona \"\n\"intentó registrarse para una\\n\"\n\"cuenta utilizando la siguiente dirección de correo electrónico:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Sin embargo, ya existe una cuenta con esa dirección de correo electrónico. \"\n\"En caso de que lo haya\\n\"\n\"olvidado, utilice el procedimiento de recuperació de contraseña olvidada \"\n\"para recuperar\\n\"\n\"su cuenta:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"La cuenta ya existe\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"¡Hola de parte de %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"¡Gracias por usar %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Está recibiendo este correo porque se ha realizado el siguiente cambio en su \"\n\"cuenta:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Si no reconoce este cambio, tome inmediatamente las precauciones de \"\n\"seguridad adecuadas. El cambio en su cuenta se origina en:\\n\"\n\"\\n\"\n\"- Dirección IP: %(ip)s\\n\"\n\"- Navegador: %(user_agent)s\\n\"\n\"- Fecha: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Tu email ha sido cambiado de %(from_email)s a %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Correo electrónico modificado\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Su correo electrónico ha sido verificado.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Correo electrónico confirmado\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Estás recibiendo este correo electrónico porque el usuario %(user_display)s \"\n\"ha facilitado tu dirección de correo electrónico para registrar una cuenta \"\n\"en %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Tu código de verificación de correo electrónico aparece a continuación. Por \"\n\"favor, introdúcelo en la ventana abierta de tu navegador.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Para confirmar que esto es correcto, vete a %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Por favor, confirme su dirección de correo electrónico\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"\"\n\"La dirección de correo electrónico %(deleted_email)s ha sido eliminada de tu \"\n\"cuenta.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Correo electrónico eliminado\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Su código de inicio de sesión se enumera a continuación. Introdúzcalo en la \"\n\"ventana abierta de su navegador.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Este correo puede ser ignorado con seguridad si usted no inició esta acción.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Código de inicio de sesión\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Su contraseña ha sido modificada.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Contraseña modificada\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Su código de restablecimiento de contraseña se enumera a continuación. \"\n\"Introdúzcalo en la ventana abierta de su navegador.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Código de restablecimiento de contraseña\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Está recibiendo este correo electrónico porque usted u otra persona ha \"\n\"solicitado un restablecimiento de contraseña para su cuenta de usuario.\\n\"\n\"Puede ignorar este correo si no ha solicitado este cambio. Haga clic en el \"\n\"siguiente enlace para restablecer su contraseña.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"En caso de haberlo olvidado, su usuario es %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Correo electrónico para restablecer contraseña\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Su contraseña ha sido restablecida.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Su contraseña ha sido establecida.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Establecer contraseña\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Está recibiendo este correo electrónico porque usted, u otra persona, \"\n\"intentó acceder a una cuenta con email %(email)s. Sin embargo, no tenemos \"\n\"constancia de dicha cuenta en nuestra base de datos.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Si ha sido usted, puede registrarse para obtener una cuenta utilizando el \"\n\"siguiente enlace.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Cuenta desconocida\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Correo electrónico\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Correo electrónico actual\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Cambiando a\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Su dirección de correo electrónico sigue pendiente de verificación.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Cancelar el cambio\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Cambiar a\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Cambiar correo electrónico\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Confirmar dirección de correo electrónico\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Por favor, confirme que <a href=\\\"mailto:%(email)s\\\">%(email)s</a> es una \"\n\"dirección de correo electrónico para el usuario %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"No se puede confirmar %(email)s porque ya está confirmado por otra cuenta.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Este enlace de confirmación por correo electrónico ha caducado o no es \"\n\"válido. Por favor, <a href=\\\"%(email_url)s\\\"> emita una nueva solicitud de \"\n\"confirmación por correo electrónico</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Si aún no ha creado una cuenta, por favor %(link)sregístrese%(end_link)s \"\n\"primero.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Iniciar sesión con un passkey\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Envíame un código de inicio de sesión\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Cerrar sesión\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"¿Seguro que desea cerrar sesión?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"No puede eliminar su correo electrónico principal (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Correo electrónico de confirmación enviado a %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Ha confirmado %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Correo electrónico %(email)s eliminado.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Ha iniciado sesión exitosamente como %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Ha cerrado sesión.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"\"\n\"Se ha enviado un código de inicio de sesión por correo a %(recipient)s .\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Contraseña cambiada con éxito.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Contraseña establecida con éxito.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Se ha enviado un código de verificación a %(phone)s .\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Has verificado el número de teléfono %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Dirección principal de correo electrónico establecida.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Cambiar la contraseña\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"¿Olvidó su contraseña?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"¿Ha olvidado su contraseña? Introduzca su dirección de correo electrónico, y \"\n\"le enviaremos un correo que le permitirá restablecerla.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Restablecer mi contraseña\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Si tiene alguna dificultad para restablecer su contraseña, por favor \"\n\"contáctenos.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Le hemos enviado un correo electrónico. Si no lo ha recibido, compruebe su \"\n\"carpeta de correo no deseado. De lo contrario, póngase en contacto con \"\n\"nosotros si no lo recibe en unos minutos.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Hay un problema con el token\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"El enlace para restablecer la contraseña es inválido, probablemente porque \"\n\"ya ha sido utilizado. Por favor solicite <a \"\n\"href=\\\"%(passwd_reset_url)s\\\">restablecer la contraseña de nuevo</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Su contraseña ha cambiado.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Establecer contraseña\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Cambiar a teléfono\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Teléfono actual\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Su número de teléfono sigue pendiente de verificación.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Cambiar a teléfono\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Introduzca su contraseña:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Recibirá un código especial para iniciar sesión sin contraseña.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Solicite el código\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Otras opciones de inicio de sesión\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Registro\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Registrarse\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"¿Ya tiene una cuenta? Por favor %(link)sinicie sesión%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Regístrate usando una passkey\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Regítrate con passkey\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Otras opciones\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Registro cerrado\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Lo sentimos, en este momento el registro está cerrado.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Nota\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Ya ha iniciado sesión como %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Advertencia:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Actualmente no tienes ninguna dirección de correo electrónico configurada. \"\n\"Debería añadir una dirección de correo electrónico para recibir \"\n\"notificaciones, restablecer su contraseña, etc.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Verifique su dirección de correo electrónico\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Le hemos enviado un correo electrónico para su verificación. Siga el enlace \"\n\"proporcionado para finalizar el proceso de registro. Si no ves el correo \"\n\"electrónico de verificación en tu bandeja de entrada principal, comprueba tu \"\n\"carpeta de correo no deseado. Por favor, póngase en contacto con nosotros si \"\n\"no recibe el correo electrónico de verificación en unos minutos.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Esta parte de la página requiere que verifiquemos que\\n\"\n\"usted es quien dice ser. Para ello, le pedimos que\\n\"\n\"verifique la titularidad de su dirección de correo electrónico. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Le hemos enviado un correo electrónico para\\n\"\n\"verificación. Por favor, haga clic en el enlace que aparece en ese correo \"\n\"electrónico. Si no ve el correo electrónico de verificación en su bandeja de \"\n\"entrada principal, compruebe su carpeta de correo no deseado. De lo \"\n\"contrario,\\n\"\n\"póngase en contacto con nosotros si no lo recibe en unos minutos.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Nota:</strong> aún puedes <a href=\\\"%(email_url)s\\\">cambiar tu \"\n\"dirección de correo electrónico</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Mensajes:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menú:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Conexiones de Cuenta\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Autenticació de doble factor\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sesiones\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autorizar\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s quiere acceder a tu cuenta de %(site_name)s.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Ingrese el código del dispositivo\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Ingrese el código que se muestra en su dispositivo.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Continuar\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Confirmar dispositivo\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Por favor confirme el código que se muestra en su %(client_name)s para \"\n\"autorizar este dispositivo.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Rechazar\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Dispositivo autorizado\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Has autorizado satisfactoriamente tu dispositivo %(client_name)s.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Dispositivo rechazado\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"La autorización para tu dispositivo %(client_name)s fue rechazada.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Error\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Mantener la sesión iniciada\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Su cuenta está protegida por doble factor de autenticación. Por favor, entre \"\n\"el código del autenticador:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Se ha generado un nuevo conjunto de códigos de recuperación de Autenticación \"\n\"de Dos Factores.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Generados nevos códigos de recuperación\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"La aplicación de autenticación ha sido activada.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Aplicación de autenticación activada\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Aplicación de autenticación desactivada.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Aplicación de autenticación desactivada\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Se ha agregado una nueva clave de seguridad.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Clave de seguridad añadida\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Se ha eliminado una clave de seguridad.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Clave de seguridad eliminada\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Aplicación de autenticación\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"La autenticación con una aplicación de autenticación está activa.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"No hay ninguna aplicación de autenticación activa.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Desactivar\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Activar\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Claves de seguridad\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Has añadido %(count)s clave.\"\nmsgstr[1] \"Has añadido %(count)s claves.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"No se han agregado claves de seguridad.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Administrar\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Añadir\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Códigos de recuperación\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Hay %(unused_count)s de %(total_count)s código de recuperación disponibles.\"\nmsgstr[1] \"\"\n\"Hay %(unused_count)s de %(total_count)s códigos de recuperación disponibles.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"No se han configurado códigos de recuperación.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Mostrar\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Descargar\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Generar\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Se ha generado un nuevo conjunto de códigos de recuperación.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Clave de seguridad añadida.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Clave de seguridad eliminada.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Ingrese un código de autenticación:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\"Está a punto de generar un nuevo conjunto de código de recuperación para su \"\n\"cuenta.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Esta operación invalidará sus códigos existentes.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"¿Está seguro?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Códigos no utilizados\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Descarga los códigos\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Crear nuevos códigos\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Activar la aplicación de autenticación\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Escanee el código QR a continuación con su aplicación de autenticación para \"\n\"proteger su cuenta con autenticación de dos factores. Luego, ingrese el \"\n\"código de verificación generado por la aplicación a continuación.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Secreto de autenticador\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Puede guardar este secreto y usarlo más tarde para reinstalar su aplicación \"\n\"de autenticación.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Deshabilitar la aplicación de autenticación\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Está a punto de desactivar la autenticación a través de la aplicación de \"\n\"autenticación. ¿Está seguro?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Confía en este navegador?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Si decides confiar en este navegador, no se te pedirá un código de \"\n\"verificación la próxima vez que inicies sesión.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Confía durante %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"No confíes\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Añadir una clave de seguridad\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Eliminar clave de seguridad\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"¿Estás seguro de que deseas eliminar esta clave de seguridad?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Passkey\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Clave de seguridad\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Esta clave no indica si es una clave de acceso.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Sin especificar\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Añadida el %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Usada por última vez %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Editar\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Editar la clave de seguridad\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Guardar\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Crear una passkey\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Estás a punto de crear una passkey para tu cuenta. Como puedes añadir claves \"\n\"adicionales más adelante, puedes utilizar un nombre descriptivo para \"\n\"diferenciar las claves.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Crear\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Esta funcionalidad requiere JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Falló la autenticación de terceros\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Se produjo un error al intentar iniciar sesión a través de su cuenta de \"\n\"terceros.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Puede iniciar sesión en su cuenta utilizando una de las siguientes cuentas \"\n\"de terceros:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Actualmente no tiene cuentas de terceros conectadas a esta cuenta.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Agregar una cuenta de terceros\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Una cuenta de terceros de %(provider)s se ha conectado a su cuenta.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Cuenta de terceros vinculada\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"La cuenta de terceros desde %(provider)s ha sido desvinculada de tu cuenta.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Cuenta de terceros desconectada\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Conectar %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Se dispone a conectarse a una nueva cuenta externa de %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Inicio de sesión mediante %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Se dispone a iniciar sesión usando una cuenta externa desde %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Inicio de sesión cancelado\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Ha decidido cancelar el inicio de sesión en nuestro sitio usando una de sus \"\n\"cuentas. Si ha sido un error, por favor <a href=\\\"%(login_url)s\\\">inicie \"\n\"sesión</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"La cuenta externa ha sido conectada.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"La cuenta externa ha sido desconectada.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Se dispone a usar su cuenta de %(provider_name)s para acceder a \"\n\"%(site_name)s.\\n\"\n\"Como paso final, por favor complete el siguiente formulario:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"O use una cuenta de terceros\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Se han cerrado todas las demás sesiones.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Iniciada el\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"Dirección IP\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Navegador\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Visto por última vez\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Actual\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Cerrar las demás sesiones\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Sesiones de usuario\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"clave de sesión\"\n\n#~ msgid \"Account Connection\"\n#~ msgstr \"Conexiones de la cuenta\"\n\n#~ msgid \"Use security key or device\"\n#~ msgstr \"Usar clave o dispositivo de seguridad\"\n\n#~ msgid \"Add Security Key or Device\"\n#~ msgstr \"Agregar clave de seguridad o dispositivo\"\n\n#~ msgid \"Add key or device\"\n#~ msgstr \"Agregar clave o dispositivo\"\n\n#~ msgid \"Security Keys and Devices\"\n#~ msgstr \"Dispositivos y claves de seguridad\"\n\n#~ msgid \"You have not added any security keys/devices.\"\n#~ msgstr \"No ha agregado ninguna clave/dispositivo de seguridad.\"\n\n#~ msgid \"Edit Security Key or Device\"\n#~ msgstr \"Editar clave o dispositivo de seguridad\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"La contraseña necesita al menos {0} caracteres.\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Está recibiendo este correo electrónico porque usted u otra persona ha \"\n#~ \"solicitado una\\n\"\n#~ \"contraseña para su cuenta de usuario. Sin embargo, no tenemos ningún \"\n#~ \"registro de un usuario\\n\"\n#~ \"con email %(email)s en nuestra base de datos.\\n\"\n#~ \"\\n\"\n#~ \"Este correo puede ser ignorado con seguridad si usted no solicitó un \"\n#~ \"restablecimiento de contraseña.\\n\"\n#~ \"\\n\"\n#~ \"Si has sido tú, puedes registrarte para obtener una cuenta utilizando el \"\n#~ \"siguiente enlace.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"\"\n#~ \"Las siguientes direcciones de correo electrónico están asociadas a su \"\n#~ \"cuenta:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Confirmar dirección de correo electrónico\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Por favor, inicie sesión con una\\n\"\n#~ \"cuenta de otra red social. O %(link)sregístrese%(end_link)s \\n\"\n#~ \"como usuario de %(site_name)s e inicie sesión a continuación:\"\n\n#~ msgid \"or\"\n#~ msgstr \"o\"\n\n#~ msgid \"change password\"\n#~ msgstr \"cambiar la contraseña\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Iniciar sesión con OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Este correo electrónico ya está asociado con otra cuenta.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Le hemos enviado un correo electrónico. Por favor contáctenos si no lo \"\n#~ \"recibe en unos minutos.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"\"\n#~ \"El correo electrónico/usuario y/o la contraseña que especificó no son \"\n#~ \"correctos.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"\"\n#~ \"Los nombres de usuarios pueden contener solamente letras, números, y @/./\"\n#~ \"+/-/_.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"Este usuario ya está en uso. Por favor elije otro.\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"Has confirmado que <a href=\\\"mailto:%(email)s\\\">%(email)s</a> es una \"\n#~ \"dirección de correo electrónico del usuario %(user_display)s.\"\n\n#~ msgid \"Thanks for using our site!\"\n#~ msgstr \"¡Gracias por utilizar nuestro sitio!\"\n\n#~ msgid \"Confirmation email sent to %(email)s\"\n#~ msgstr \"Correo de confirmación enviado a %(email)s\"\n\n#~ msgid \"Delete Password\"\n#~ msgstr \"Eliminar Contraseña\"\n\n#~ msgid \"\"\n#~ \"You may delete your password since you are currently logged in using \"\n#~ \"OpenID.\"\n#~ msgstr \"Puedes eliminar tu contraseña ya que ingresaste con OpenID.\"\n\n#~ msgid \"delete my password\"\n#~ msgstr \"eliminar mi contraseña\"\n\n#~ msgid \"Password Deleted\"\n#~ msgstr \"Contraseña Eliminada\"\n"
  },
  {
    "path": "allauth/locale/et/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2024-04-20 21:55+0200\\n\"\n\"Last-Translator: Gregor Grigorjan <gregor@grigorjan.net>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\"Language: Estonian\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"See konto on parajasti mitteaktiivne.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Primaarset e-posti aadressi ei saa eemaldada.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"See e-posti aadress on juba selle kontoga seostatud.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Sisestatud e-posti aadress või salasõna ei ole õige.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Sisestatud telefoninumber või salasõna ei ole õige.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Selle e-posti aadressiga on juba kasutaja registreeritud.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Palun sisesta oma praegune salasõna.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Vale kood.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Vale salasõna.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Vale või aegunud võti.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Vale sisselogimine.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Salasõna taasseadmise tooken oli vale.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Sa ei tohi lisada enam kui %d e-posti aadressi.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Selle telefoninumbriga on juba kasutaja registreeritud.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Liiga palju nurjunud sisse logimise katseid. Proovi hiljem uuesti.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"See e-posti aadress pole määratud ühelegi kasutajakontole.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"See telefoninumber pole määratud ühelegi kasutajakontole.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Su primaarne e-posti aadress peab olema kinnitatud.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Kasutajanime pole lubatud kasutada. Palun kasuta muud kasutajanime.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Sisestatud kasutajanimi või salasõna ei ole õige.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Palun valige ainult üks.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Uus väärtus peab erinema praegusest.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Palun ole kannatlik, sa saadad liiga palju päringuid.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Kasuta oma salasõna\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Kasuta autentimisrakendust või koodi\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Kasuta turvavõtit\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} on märgitud kinnitatuks.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"{email} kinnituks märkimine ebaõnnestus.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Märgi valitud e-posti aadressid kinnitatuks\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Kontod\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-post\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"E-posti aadress\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Sisesta telefoninumber koos riigikoodiga (nt +1 USA jaoks).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Pead sisestama sama salasõna iga kord.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Salasõna\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Jäta mind meelde\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Kasutajanimi\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Logi sisse\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Kasutajanimi, e-post või telefon\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Kasutajanimi või e-post\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Kasutajanimi või telefon\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-post või telefon\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Unustasid salasõna?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-post (uuesti)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"E-posti aadress\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-post (valikuline)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Kasutajanimi (valikuline)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Pead sisetama sama e-posti aadressi iga kord.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Salasõna (uuesti)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Praegune salasõna\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Uus salasõna\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Uus salasõna (uuesti)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kood\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"kasutaja\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"e-posti aadress\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"kinnitatud\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"primaarne\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"e-posti aadressid\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"loodud\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"saadetud\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"võti\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"kinnitus e-posti kaudu\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"kinnitused e-posti kaudu\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Peata\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Vaata oma kasutaja ID-d\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Vaata oma e-posti aadressi\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Vaata oma profiili põhiandmeid\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Anna õigused\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"Metamärgid pole lubatud, kui 'Luba URI metamärgid' pole aktiveeritud.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' sisaldab rohkem kui ühte metamärki (*). Ühe URI kohta on lubatud \"\n\"ainult üks metamärk.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Metamärgid on lubatud ainult URI hostinime osas.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Autoriseerimiskood\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Seadmekood\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Kliendi volitused\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Värskendustooken\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Konfidentsiaalne\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Avalik\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Ulatused, mida kliendil on lubatud taotleda. Sisesta üks väärtus rea kohta, \"\n\"nt: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Kui klient ei määra ühtegi ulatust, kasutatakse neid vaikeulatusi. Sisesta \"\n\"üks väärtus rea kohta, nt: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Lubatud volituste tüüpide loend. Sisesta üks väärtus rea kohta, nt: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"Lubatud päritolu loend ristpäritoluga päringute jaoks, üks rea kohta.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Luba metamärgid (*) ümbersuunamise URI-des ja CORS-i päritoludes. Kui \"\n\"aktiveeritud, võivad URI-d sisaldada ühte tärni alamdomeenide sobitamiseks.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Lubatud vastuse tüüpide loend. Sisesta üks väärtus rea kohta, nt: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"klient\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"kliendid\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Sa ei saa kaheastmelise autentimisega turvatud kontole lisada e-posti \"\n\"aadressi.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Sa ei saa kaheastmelist autentimist välja lülitada.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"Sa ei saa luua varukoode ilma kaheastmilise autentimiseta.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Sa ei saa välja lülitada kaheastmelist autentimist kuni sa oled oma e-posti \"\n\"aadressi kinnitanud.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Põhivõti\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Varuvõti\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Võti nr. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"Mitmeastmeline autentimine\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Varukoodid\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"Paroolikell\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Autentimiskood\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Paroolivaba\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Paroolivaba režiimi lubamine võimaldab sisse logida ainult selle võtmega, \"\n\"kuid kehtestab lisanõuded, nagu biomeetria või PIN-kaitse.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Selle e-posti aadressiga konto on juba olemas. Palun logi esmalt sellesse \"\n\"kontosse sisse, siis ühenda oma %s konto.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Vale tooken.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Su kontol pole salasõna määratud.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Su kontol pole kinnitatud e-posti aadresse.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Sa ei saa oma viimast kolmanda osapoole kontot lahti ühendada.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"See kolmanda osapoole konto on juba mõne teise kontoga ühendatud.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Sotsiaalkontod\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"tarnija\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"tarnija ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"nimi\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"kliendi id\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"Rakenduse ID, või tarnija id\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"salavõti\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API salajane võti, kliendi salajane võti, või tarnija salajane võti\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Võti\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"sotsiaalrakendus\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"sotsiaalrakendused\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"viimane sisse logimine\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"liitumise kuupäev\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"lisaandmed\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"sotsiaalkonto\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"sotsiaalkontod\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"tooken\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) või juurdepääsutooken (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"tookeni salavõti\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) või värskendustooken (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"aegub\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"sotsiaalrakenduse tooken\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"sotsiaalrakenduse tookenid\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Valed profiiliandmed\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Logi sisse\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Tühista\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"Väär vastus päringutookenit tarnijalt \\\"%s\\\" hankides. Vastus oli: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Väär vastus pääsutookenit tarnijalt \\\"%s\\\" hankides.\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Päringutookenit pole salvestatud \\\"%s\\\" jaoks.\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Pääsutookenit pole salvestatud \\\"%s\\\" jaoks.\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Puudub ligipääs \\\"%s\\\" privaatressurssidele.\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Väär vastus tarnijalt \\\"%s\\\" pääsutookenit hankides.\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Konto mitteaktiivne\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"See konto on mitteaktiivne.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Saatsime koodi aadressile %(recipient)s. Kood aegub varsti, seega sisesta \"\n\"see kiiresti.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Kinnita\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Taotle uut koodi\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Kinnita ligipääs\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Palun tuvasta end uuesti, et turvata oma kontot.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Muud valikud\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"E-posti kinnitamine\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Sisesta e-posti kinnituskood\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Kasuta teist e-posti aadressi\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Logi sisse\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Sisesta sisselogimiskood\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Salasõna taasseadmine\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Sisesta salasõna taasseadmise kood\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Telefoninumbri kinnitamine\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Sisesta telefoninumbri kinnituskood\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Kasuta teist telefoninumbrit\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"E-posti aadressid\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Sinu kontoga on seostatud järgnevad e-posti aadressid:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Kinnitatud\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Kinnitamata\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Primaarne\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Muuda primaarseks\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Saada kinnitus uuesti\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Eemalda\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Lisa e-posti aadress\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Lisa e-post\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Oled kindel, et soovid valitud e-posti aadressi eemaldada?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Te saite selle kirja kuna kas Teie või keegi teine proovis luua konto\\n\"\n\"kasutades teie e-posti aadressi:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Selle e-posti aadressiga konto on juba olemas. Juhul, kui Te olite selle\\n\"\n\"unustanud, siis palun kasutage ununenud salasõna protseduuri, et saada ligi\\n\"\n\"oma kontole:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Konto on juba olemas\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"%(site_name)s tervitab!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Täname, et kasutate teenust %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"Te saite selle kirja, kuna Teie kontoga tehti järgnev muudatus:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Kui Te ei tunnista seda muudatust, siis turvake oma kontot kohe. Muudatus \"\n\"kontole tuli järgnevast allikast:\\n\"\n\"\\n\"\n\"- IP aadress: %(ip)s\\n\"\n\"- Veebilehitseja: %(user_agent)s\\n\"\n\"- Kuupäev: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"\"\n\"Teie e-posti aadress muudeti. Vana e-posti aadress: %(from_email)s. Uus e-\"\n\"posti aadress: %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"E-post muudetud\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Teie e-posti aadress on kinnitatud.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"E-posti kinnitus\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Te saite selle kirja, kuna kasutaja %(user_display)s sisestas teie e-posti \"\n\"aadressi, et registreerida konto lehel %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Teie e-posti kinnituskood on alljärgnevalt esitatud. Palun sisestage see oma \"\n\"veebilehitseja avatud aknas.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Kinnitamaks, et see on õige, mine aadressile %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Palun kinnitage oma e-posti aadress\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"E-posti aadress %(deleted_email)s on Teie kontolt eemaldatud.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"E-post eemaldatud\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Teie sisselogimiskood on alljärgnevalt esitatud. Palun sisestage see oma \"\n\"veebilehitseja avatud aknas.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"Seda kirja võib eirata, kui Te ise seda toimingut ei algatanud.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Sisselogimiskood\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Teie salasõna muudeti.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Salasõna muudetud\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Teie salasõna taasseadmise kood on alljärgnevalt esitatud. Palun sisestage \"\n\"see oma veebilehitseja avatud aknas.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Salasõna taasseadmise kood\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Te saite selle kirja kuna Teie või keegi teine algatas Teie kontol parooli \"\n\"taasseadmise.\\n\"\n\"Te võite seda kirja ignoreerida, kui Teie seda ei algatanud. Klõpsake \"\n\"alljärgneval lingil, et taasseada oma salasõna.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Juhuks, kui unstasite, Teie kasutajanimi on %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Salasõna taasseadmine\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Teie salasõna on taasseatud.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Teie salasõna on seatud.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Salasõna seatud\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Te saite selle kirja kuna Teie, või keegi teine, proovis pääseda ligi Teie \"\n\"kontole e-posti aadressiga %(email)s. Ent meil pole ühtegi kirjet sellise e-\"\n\"posti aadressiga kontost andmebaasis.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Kui see olite Teie, siis saate registreerida konto kasutades alljärgnevat \"\n\"linki.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Tundmatu konto\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"E-posti aadress\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Praegune e-post\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Muudatus\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Su e-posti aadress on endiselt kinnitamata.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Tühista muudatus\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Uus e-post\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Muuda e-posti\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Kinnita e-posti aadress\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Palun kinnita, et <a href=\\\"mailto:%(email)s\\\">%(email)s</a> on konto \"\n\"%(user_display)s e-posti aadress.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Ei saa kinnitada aadressi %(email)s kuna see on juba teise kontoga \"\n\"kinnitatud.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"See e-posti aadressi kinnituslink aegus või on vale. Palun <a \"\n\"href=\\\"%(email_url)s\\\">taotlege uus e-posti aadressi kinnitamine</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Kui sa pole veel kontot loonud, siis palun esmalt \"\n\"%(link)sregistreeruge%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Logi sisse pääsuvõtmega\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Saada mulle sisselogimiskood\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Logi välja\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Oled kindel, et soovid välja logida?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Primaarset e-posti aadressi (%(email)s) ei saa eemaldada.\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Kinnituskiri saadeti aadressile %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Sa kinnitasid e-posti aadressi %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"E-posti aadress %(email)s eemaldatud.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Logisid edukalt sisse kasutajana %(name)s\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Sa logisid välja.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Sisselogimiskood saadeti aadressile %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Salasõna muudeti edukalt.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Salasõna seati edukalt.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Kinnituskood saadeti numbrile %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Oled kinnitanud telefoninumbri %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Primaarne e-posti aadress on nüüd seatud.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Muuda salasõna\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Unustasid salasõna?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Unustasid oma salasõna? Sisesta allpool oma e-posti aadress, ning me saadame \"\n\"sulle kirja, mille abil saad selle taasseada.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Taassea minu salasõna\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Palun võta meiega ühendust, kui näed vaeva oma salasõna taasseadmisega.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Saatsime teile e-kirja. Kui sa pole seda kätte saanud, siis vaata rämpsposti \"\n\"kausta. Muul juhul, võta meiega ühendust kui sa ei saa seda mõne minuti \"\n\"jooksul kätte.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Vale tooken\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Salasõna taasseadmise link oli vale. On võimalik, et seda oli juba \"\n\"kasutatud. Palun taotle <a href=\\\"%(passwd_reset_url)s\\\">uus salasõna \"\n\"taasseadmine</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Su salasõna on nüüd muudetud.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Sea salasõna\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Muuda telefoni\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Praegune telefon\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Teie telefoninumber on endiselt kinnitamata.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Muuda telefoni\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Sisesta oma salasõna:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Sa saad spetsiaalse koodi paroolivabaks sisselogimiseks.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Taotle koodi\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Muud sisse logimise võimalused\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Registreerimine\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Registreeri\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Konto juba olemas? Palun %(link)slogi sisse%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Registreeru pääsuvõtmega\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Pääsuvõtmega registreerumine\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Muud valikud\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Sisselogimine peatatud\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Sisselogimine on parajasti peatatud. Palume vabandust!\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Teavitus\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Sa oled juba sisse logitud kasutajana %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Hoiatus:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Su kontol pole parajasti ühtegi e-posti aadressi. Soovitame kindlasti seada \"\n\"e-posti aadressi, et sa saaksid saada teavitusi, taasseada salasõna jne.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Kinnita oma e-posti aadress\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Saatsime sulle kinnituseks e-kirja. Järgi kirjas olevat linki, et lõpetada \"\n\"registreerimine. Kui sa ei näe kinnituskirja postkastis, kontrolli \"\n\"rämpsposti kausta. Palun võta meiega ühendust, kui sa ei saa kinnituskirja \"\n\"mõne minuti jooksul.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"See osa lehest nõuab, et me kinnitaksime sinu sisestatud andmeid. Selle \"\n\"tarbeks nõuame kinnitust, et\\n\"\n\"oled oma e-posti aadressi omanik. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Saatsime teile kinnituseks e-kirja. Palun klõpsa kirja sees olevale lingile. \"\n\"Kui sa ei näe kinnituskirja oma postkastis, siis vaata rämpsposti kausta. \"\n\"Vastasel juhul,\\n\"\n\"võta meiega ühendust kui sa ei saa kirja mõne minuti jooksul.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Märkus:</strong> saad ikka oma <a href=\\\"%(email_url)s\\\">e-posti \"\n\"aadressi muuta</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Sõnumid\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menüü:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Konto sidemed\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Kaheastmeline autentimine\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sessioonid\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autoriseeri\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s soovib ligipääsu teie %(site_name)s kontole.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Sisesta seadmekood\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Sisesta oma seadmel kuvatav kood.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Jätka\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Kinnita seade\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Palun kinnitage oma %(client_name)s kuvatav kood selle seadme \"\n\"autoriseerimiseks.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Keeldu\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Seade autoriseeritud\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Autoriseerisite edukalt oma %(client_name)s seadme.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Seade keelatud\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Teie %(client_name)s seadme autoriseerimine on keelatud.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Viga\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Jää sisselogituks\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Su konto on turvatud kaheastmelise autentimisega. Palun sisesta \"\n\"autentimiskood:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"Uus hulk kaheastmelise autentimise varukoode on loodud.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Uued varukoodid loodud\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Autentimisrakendus seadistatud\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Autentimisrakendus seadistatud\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Autentimisrakendus eemaldatud\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Autentimisrakendus eemaldatud\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Uus turvavõti on lisatud.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Turvavõti lisatud\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Turvavõti on eemaldatud.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Turvavõti eemaldatud\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Autentimisrakendus\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Autentimine kasutades autentimisrakendust on seadistatud.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Ühtegi autentimisrakendust pole seadistatud.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Eemalda\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Seadista\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Turvavõtmed\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Olete lisanud %(count)s turvavõtme.\"\nmsgstr[1] \"Olete lisanud %(count)s turvavõtit.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Ühtegi turvavõtit pole lisatud.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Halda\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Lisa\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Varukoodid\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"Saadaval on %(unused_count)s taastamiskoodi %(total_count)s-st.\"\nmsgstr[1] \"Saadaval on %(unused_count)s taastamiskoodi %(total_count)s-st.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Varukoode pole seadistatud\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Vaata\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Lae alla\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Loo\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Uus hulk varukoode on loodud.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Turvavõti lisatud.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Turvavõti eemaldatud.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Sisesta autentimisrakenduse kood:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Järgnevalt loote uue hulga varukoode oma kontole.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"See tegevus muudab olemasolevad varukoodid kehtetuks.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Oled kindel?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Kasutamata varukoodid\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Lae varukoodid alla\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Loo uued varukoodid\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Seadista autentimisrakendus\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Et turvata oma kontot kaheastmelise autentimisega, skänni alljärgnev QR-kood \"\n\"oma autentimisrakendusega. Seejärel, sisesta rakenduse loodud kinnituskood \"\n\"all olevasse lahtrisse.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Autentimisrakenduse saladus\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Hoiustades selle saladuse saad seda kasutada, et taaspaigaldada oma \"\n\"autentimisrakendust tulevikus.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Eemalda autentimisrakendus\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Järgneva tegevusega eemaldad autentimisrakendusega seotud autentimise. Kas \"\n\"oled kindel?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Usalda seda brauserit?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Kui otsustad seda brauserit usaldada, ei küsita sinult järgmisel \"\n\"sisselogimisel kinnituskoodi.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Usalda %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Ära usalda\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Lisa turvavõti\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Eemalda turvavõti\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Oled kindel, et soovid selle turvavõtme eemaldada?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Kasutus\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Pääsuvõti\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Turvavõti\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"See võti ei näita, kas tegemist on pääsuvõtmega.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Määramata\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Lisatud %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Viimati kasutatud %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Muuda\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Muuda turvavõtit\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Salvesta\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Loo pääsuvõti\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Oled loomas pääsuvõtit oma kontole. Kuna saad hiljem lisada täiendavaid \"\n\"võtmeid, võid kasutada kirjeldavat nime, et neid eristada.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Loo\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"See funktsioon nõuab JavaScripti.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Kolmanda osapoolega sisse logimine nurjus\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"Kolmanda osapoole konto kaudu sisse logimise ajal tekkis viga.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Saad sisse logida oma kontosse kasutades mistahes järgnevatest kolmanda \"\n\"osapoole kontodest:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Su kontoga pole parajasti seotud ühtegi kolmanda osapoole kontot.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Lisa kolmanda osapoole konto\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Kolmanda osapoole %(provider)s konto on Teie kontoga ühendatud.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Kolmanda osapoole konto ühendatud\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"Seos kolmanda osapoole %(provider)s konto ja Teie konto vahel on eemaldatud.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Kolmanda osapoole konto eemaldatud\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Ühenda %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Järgneva tegevusega ühendate uue kolmanda osapoole konto pakkujalt \"\n\"%(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Logi sisse %(provider)s kaudu\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Järgneva tegevusega logite sisse kasutades kolmanda osapoole %(provider)s \"\n\"kontot.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Sisse logimine tühistatud\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Otsustasid meie lehte sisse logimise tühistada.Kui see oli eksimus, palun \"\n\"mine <a href=\\\"%(login_url)s\\\">sisse logima</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Kolmanda osapoole konto on ühendatud.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Seos kolmanda osapoole kontoga eemaldati.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Järgneva tegevusega kasutate pakkuja %(provider_name)s kontot sisse \"\n\"logimiseks lehele\\n\"\n\"%(site_name)s. Viimase sammuna, palun täitke ankeet:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Või kasuta kolmandat osapoolt\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Kõigist teistest sessioonidest välja logitud.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Alustati\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP aadress\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Veebilehitseja\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Viimati nähtud\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Praegune\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Logi teistest sessioonidest välja\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Kasutajasessioonid\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"sessioonivõti\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Konto sidemed\"\n"
  },
  {
    "path": "allauth/locale/eu/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: django-allauth\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2024-10-31 18:31+0000\\n\"\n\"Last-Translator: Alain EIguren <alaineigurenzu@proton.me>\\n\"\n\"Language-Team: Basque <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/eu/>\\n\"\n\"Language: eu\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 5.8.2-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Kontu hau ez dago aktibo une honetan.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Ezin duzu zure helbide elektroniko nagusia ezabatu.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Helbide elektroniko hau dagoeneko kontu honi lotuta dago.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Sartutako helbide elektronikoa eta/edo pasahitza ez dira zuzenak.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Sartutako telefono-zenbakia eta/edo pasahitza ez dira zuzenak.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"\"\n\"Erabiltzaile batek kontu bat sortu du jada helbide elektroniko honekin.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Mesedez idatzi zure oraingo pasahitza.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Kode okerra.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Pasahitz okerra.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Gako baliogabea edo iraungitakoa.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Saio-hasiera baliogabea.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Pasahitza berrezartzeko \\\"token\\\"-a baliogabea da.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Ezin dituzu %d email helbide baino gehiago erabili.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Erabiltzaile batek kontu bat sortu du jada telefono-zenbaki honekin.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Huts egite gehiegi saioa hasterakoan. Saiatu berriro beranduago.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Helbide elektronikoa ez dago erabiltzaile-kontu bati esleituta.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Telefono-zenbakia ez dago erabiltzaile-kontu bati esleituta.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Zure email nagusiak egiaztatuta egon behar du.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"Erabiltzaile izen hau ezin da erabili. Aukeratu beste erabiltzaile izen bat.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Sartutako erabiltzailea eta/edo pasahitza ez dira zuzenak.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Mesedez, hautatu bakarra.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Balio berriak oraingotik desberdina izan behar du.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Izan pazientzia, eskaera gehiegi bidaltzen ari zara.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Erabili zure pasahitza\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Erabili autentifikazio-aplikazioa edo kodea\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Erabili segurtasun-gako bat\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} egiaztatu bezala markatu da.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Ezin izan da {email} egiaztatu bezala markatu.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Markatu hautatutako helbide elektronikoak egiaztatu bezala\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Kontuak\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"Emaila\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Helbide elektronikoa\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Sartu telefono-zenbaki bat herrialde-kodearekin (adib. +34 Espainia).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefonoa\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Pasahitz berdina idatzi behar duzu aldi bakoitzean.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Pasahitza\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Gogora nazazue\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Erabiltzailea\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Saioa hasi\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Erabiltzailea, emaila edo telefonoa\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Erabiltzailea edo emaila\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Erabiltzailea edo telefonoa\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Emaila edo telefonoa\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Pasahitza ahaztu duzu?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"Emaila (berriro)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Helbide elektronikoaren egiaztapena\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"Emaila (hautazkoa)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Erabiltzailea (hautazkoa)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Email berdina idatzi behar duzu aldi bakoitzean.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Pasahitza (berriro)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Oraingo pasahitza\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Pasahitz berria\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Pasahitz berria (berriro)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kodea\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"erabiltzailea\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"helbide elektronikoa\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"egiaztatuta\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"nagusia\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"helbide elektronikoak\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"sortuta\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"bidalita\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"giltza\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"email egiaztapena\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"email egiaztapenak\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Ikusi zure erabiltzaile-IDa\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Ikusi zure helbide elektronikoa\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Ikusi zure oinarrizko profileko informazioa\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Baimenak eman\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Komodinak (*) ez daude baimenduta 'Baimendu URI komodinak' aktibatuta ez \"\n\"badago.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"'{}' URIak komodin (*) bat baino gehiago dauka. URI bakoitzeko komodin \"\n\"bakarra onartzen da.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Komodinak URIaren ostalari-izenaren zatian soilik onartzen dira.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Baimen-kodea\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Gailu-kodea\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Bezeroaren kredentzialak\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Berritzeko tokena\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Konfidentziala\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Publikoa\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Bezeroak eskatu ditzakeen esparruak. Eman balio bat lerro bakoitzeko, adib.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Bezeroak esparrurik zehazten ez badu, esparru lehenetsi hauek erabiltzen \"\n\"dira. Eman balio bat lerro bakoitzeko, adib.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Baimendutako baimen-moten zerrenda. Eman balio bat lerro bakoitzeko, adib.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Jatorri gurutzatuko eskaeren baimendutako jatorrien zerrenda, bat lerro \"\n\"bakoitzeko.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Baimendu komodinak (*) birbideratze-URIetan eta CORS jatorrietan. Aktibatuta \"\n\"dagoenean, URIek izartxo bakarra eduki dezakete azpidomeinuekin bat \"\n\"etortzeko.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Baimendutako erantzun-moten zerrenda. Eman balio bat lerro bakoitzeko, \"\n\"adib.: code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"bezeroa\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"bezeroak\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Ezin duzu helbide elektroniko bat gehitu bi faktoreko autentifikazioarekin \"\n\"babestutako kontu batean.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Ezin duzu bi faktoreko autentifikazioa desaktibatu.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Ezin dituzu berreskuratze-kodeak sortu bi faktoreko autentifikazioa \"\n\"aktibatuta izan gabe.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Ezin duzu bi faktoreko autentifikazioa aktibatu zure helbide elektronikoa \"\n\"egiaztatu arte.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Gako nagusia\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Babeskopia-gakoa\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"{number}. gakoa\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Berreskuratze-kodeak\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP autentifikatzailea\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Autentifikazio-kodea\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Pasahitzarik gabe\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Pasahitzarik gabeko funtzionamendua aktibatzeak gako honekin soilik saioa \"\n\"hastea ahalbidetzen dizu, baina baldintza gehigarriak ezartzen ditu, hala \"\n\"nola biometria edo PIN bidezko babesa.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Kontu bat existitzen da jada helbide elektroniko honekin. Mesedez, hasi \"\n\"saioa kontu horretan lehenik, eta gero lotu zure %s kontua.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Token baliogabea.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Zure kontuak ez du pasahitzik zehaztuta.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Zure kontuak ez du egiaztatutako emailik.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Ezin duzu zure azken hirugarrenen kontua deskonektatu.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Hirugarrenen kontua dagoeneko beste kontu bati lotuta dago.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Sare sozial kontuak\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"zerbitzua\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"hornitzailearen IDa\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"izena\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"client id\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"Aplikazioaren ID-a, edo \\\"consumer key\\\"-a\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"\\\"secret key\\\"-a\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"\\\"API secret\\\"-a, \\\"client secret\\\"-a edo \\\"consumer secret\\\"-a\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Giltza\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"aplikazio soziala\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"aplikazio sozialak\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"azken logina\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"erregistro eguna\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"datu gehigarriak\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"sare sozial kontua\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"sare sozial kontuak\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"\\\"token\\\"-a\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\"-a (OAuth1) edo \\\"access token\\\"-a (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"\\\"token secret\\\"-a\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\"-a (OAuth1) edo \\\"refresh token\\\"-a (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"iraungitze data\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"aplikazio sozial \\\"token\\\"-a\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"aplikazio sozial \\\"token\\\"-ak\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Profil datu baliogabeak\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Saioa hasi\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Utzi\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Erantzun baliogabea \\\"%s\\\"-(e)tik eskaera-tokena eskuratzean. Erantzuna hau \"\n\"izan zen: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Erantzun baliogabea \\\"%s\\\"-tik \\\"access token\\\"-a eskuratzean.\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Ez dago \\\"request token\\\"-ik gordeta \\\"%s\\\"-entzat.\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Ez dago \\\"access token\\\"-ik gordeta \\\"%s\\\"-entzat.\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Ez duzu baliabide pribatuetara sarbiderik: \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Erantzun baliogabea \\\"%s\\\"-tik \\\"request token\\\"-a eskuratzean.\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Kontu ez aktiboa\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Kontu hau ez dago aktiboa.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Kode bat bidali dugu %(recipient)s helbidera. Kodea laster iraungiko da, \"\n\"beraz, sartu ahalik eta lasterren.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Egiaztatu\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Kode berria eskatu\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Sarbidea baieztatu\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Mesedez, berriz autentifikatu zure kontua babesteko.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Beste aukera batzuk\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Email egiaztapena\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Sartu emailaren egiaztapen-kodea\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Erabili beste helbide elektroniko bat\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Saioa hasi\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Sartu saio-hasierako kodea\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Pasahitza berrezarri\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Sartu pasahitza berrezartzeko kodea\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Telefono egiaztapena\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Sartu telefonoaren egiaztapen-kodea\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Erabili beste telefono-zenbaki bat\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Helbide elektronikoak\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Helbide elektroniko hauek zure kontuari lotuta daude:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Egiaztatuta\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Egiaztatu gabe\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Nagusia\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Nagusia egin\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Egiaztapen emaila berbidali\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Ezabatu\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Helbide elektronikoa gehitu\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Emaila gehitu\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Ziur al zaude aukeratutako helbide elektronikoa ezabatu nahi duzula?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Email hau jaso duzu zuk edo beste norbaitek kontu bat sortzeko saiakera egin \"\n\"duelako\\n\"\n\"helbide elektroniko honekin:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Hala ere, helbide elektroniko hori erabiltzen duen kontu bat dagoeneko \"\n\"existitzen da. Hau\\n\"\n\"ahaztu baduzu, erabili pasahitza berreskuratzeko prozedura zure kontua\\n\"\n\"berreskuratzeko:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Kontua dagoeneko existitzen da\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Kaixo %(site_name)s webgunetik!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Mila esker %(site_name)s webgunea erabiltzeagatik!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"Mezu hau jaso duzu zure kontuan honako aldaketa egin delako:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Aldaketa hau ezagutzen ez baduzu, hartu berehala segurtasun-neurriak. Zure \"\n\"kontuaren aldaketa hemendik dator:\\n\"\n\"\\n\"\n\"- IP helbidea: %(ip)s\\n\"\n\"- Nabigatzailea: %(user_agent)s\\n\"\n\"- Data: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Zure emaila %(from_email)s-tik %(to_email)s-era aldatu da.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Emaila aldatu da\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Zure emaila baieztatu da.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Email baieztapena\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Email hau jaso duzu %(user_display)s erabiltzaileak zure helbide \"\n\"elektronikoa eman duelako %(site_domain)s orrialdean kontu bat \"\n\"erregistratzeko.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Zure emailaren egiaztapen-kodea behean agertzen da. Mesedez, sartu zure \"\n\"nabigatzaileko leiho irekian.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Hau zuzena dela baieztatzeko, joan %(activate_url)s helbidera.\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Mesedez egiaztatu zure helbide elektronikoa\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"%(deleted_email)s helbide elektronikoa zure kontutik kendu da.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Emaila kendu da\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Zure saio-hasierako kodea behean agertzen da. Mesedez, sartu zure \"\n\"nabigatzaileko leiho irekian.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"Mezu hau alde batera utzi dezakezu ekintza hau zuk hasi ez baduzu.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Saio-hasierako kodea\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Zure pasahitza aldatu da.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Pasahitza aldatu da\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Zure pasahitza berrezartzeko kodea behean agertzen da. Mesedez, sartu zure \"\n\"nabigatzaileko leiho irekian.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Pasahitza berrezartzeko kodea\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Email hau jaso duzu zuk edo beste norbaitek pasahitza berrezartzeko eskaera \"\n\"egin duelako zure kontuarentzat.\\n\"\n\"Eskaera zuk egin ez baduzu, mezu hau alde batera utzi dezakezu. Egin klik \"\n\"beheko estekan zure pasahitza berrezartzeko.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Ahaztu baduzu, zure erabiltzaile izena %(username)s da.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Pasahitza berrezartzeko emaila\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Zure pasahitza berrezarri da.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Zure pasahitza ezarri da.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Pasahitza ezarri da\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Email hau jaso duzu zuk, edo beste norbaitek, %(email)s emailarekin kontu \"\n\"bat atzitzen saiatu delako. Hala ere, ez dugu kontu horren erregistrorik \"\n\"gure datu-basean.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"Zuk izan bazara, kontu bat sortu dezakezu beheko esteka erabiliz.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Kontu ezezaguna\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Helbide elektronikoa\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Oraingo emaila\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Aldatzen\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Zure helbide elektronikoa oraindik egiaztatzeko dago.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Aldaketa bertan behera utzi\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Aldatu hona\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Emaila aldatu\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Helbide elektronikoa egiaztatu\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Mesedez, baieztatu <a href=\\\"mailto:%(email)s\\\">%(email)s</a> \"\n\"%(user_display)s erabiltzailearen helbide elektronikoa dela.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Ezin da %(email)s baieztatu, dagoeneko beste kontu batek baieztatu duelako.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Email baieztapen-esteka hau iraungi da edo baliogabea da. Mesedez, eskatu <a \"\n\"href=\\\"%(email_url)s\\\">email baieztapen-eskaera berri bat</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Oraindik kontu bat sortu ez baduzu, mesedez %(link)ssortu kontu \"\n\"bat%(end_link)s lehenik.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Hasi saioa pasahitz-gako batekin\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Bidali saio-hasierako kode bat\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Saioa amaitu\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Ziur al zaude saioa amaitu nahi duzula?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Ezin duzu zure helbide elektroniko nagusia ezabatu (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Egiaztapen emaila bidali da %(email)s helbidera.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"%(email)s emaila egiaztatu duzu.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"%(email)s helbide elektronikoa ezabatu da.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"%(name)s bezala hasi duzu saioa.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Saioa amaitu duzu.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Saio-hasierako kode bat bidali da %(recipient)s helbidera.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Pasahitza behar bezala aldatu da.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Pasahitza behar bezala zehaztu da.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Egiaztapen-kode bat bidali da %(phone)s zenbakira.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"%(phone)s telefono-zenbakia egiaztatu duzu.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Helbide elektroniko nagusia zehaztu da.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Pasahitza aldatu\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Pasahitza ahaztu duzu?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Zure pasahitza ahaztu al duzu? Idatzi zure helbide elektronikoa behean eta \"\n\"pasahitza berrezartzeko aukera emango dizun email bat bidaliko dizugu.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Nire pasahitza berrezarri\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Mesedez jarri gurekin kontaktuan zure pasahitza berrezartzeko arazorik \"\n\"baduzu.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Email bat bidali dizugu. Jaso ez baduzu, egiaztatu zure spam karpeta. \"\n\"Bestela, jarri gurekin harremanetan minutu batzuetan jasotzen ez baduzu.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Token baliogabea\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Pasahitza berrezartzeko esteka baliogabea da, beharbada lehendik ere erabili \"\n\"delako. Mesedez eskatu <a href=\\\"%(passwd_reset_url)s\\\">pasahitza \"\n\"berrezartzeko email berri bat</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Zure pasahitza aldatuta dago orain.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Pasahitza zehaztu\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Telefonoa aldatu\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Oraingo telefonoa\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Zure telefono-zenbakia oraindik egiaztatzeko dago.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Telefonoa aldatu\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Sartu zure pasahitza:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Kode berezi bat jasoko duzu pasahitzarik gabeko saio-hasierarako.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Kodea eskatu\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Saio-hasierako beste aukera batzuk\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Kontua sortu\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Kontua sortu\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Lehendik kontu bat sortua duzu? %(link)sSaioa hasi%(end_link)s orduan.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Erregistratu pasahitz-gako bat erabiliz\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Pasahitz-gakoaren bidez kontua sortu\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Beste aukera batzuk\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Ezin da konturik sortu iada\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Sentitzen dugu baina ezin da kontu berririk sortu.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Oharra\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Dagoeneko saioa hasita duzu %(user_display)s bezala.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Adi:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Oraingoz ez duzu helbide elektronikorik ezarri. Helbide elektroniko bat \"\n\"gehitu beharko zenuke jakinarazpenak jaso ahal izateko, pasahitza \"\n\"berrezartzeko, etab.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Zure helbide elektronikoa egiaztatu\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Email bat bidali dizugu egiaztapenerako. Jarraitu emandako esteka \"\n\"erregistratzeko prozesua amaitzeko. Egiaztapen-emaila zure sarrera-ontzi \"\n\"nagusian ikusten ez baduzu, egiaztatu spam karpeta. Mesedez, jarri gurekin \"\n\"harremanetan minutu batzuetan egiaztapen-emaila jasotzen ez baduzu.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Webguneko atal honek zuk diozuna zarela egiaztatzea\\n\"\n\"eskatzen digu. Honetarako, zure helbide elektronikoaren\\n\"\n\"jabetza egiaztatzea beharrezkoa da. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Email bat bidali dizugu\\n\"\n\"egiaztapenerako. Mesedez, egin klik emailean dagoen estekan. Egiaztapen-\"\n\"emaila zure sarrera-ontzi nagusian ikusten ez baduzu, egiaztatu spam \"\n\"karpeta. Bestela,\\n\"\n\"jarri gurekin harremanetan minutu batzuetan jasotzen ez baduzu.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Oharra:</strong> oraindik zure <a href=\\\"%(email_url)s\\\">helbide \"\n\"elektronikoa aldatu</a> dezakezu.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Mezuak:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menua:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Lotutako kontuak\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Bi faktoreko autentifikazioa\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Saioak\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Baimendu\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s-ek zure %(site_name)s kontua atzitu nahi du.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Sartu gailuaren kodea\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Sartu zure gailuan agertzen den kodea.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Jarraitu\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Gailua baieztatu\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Mesedez, baieztatu zure %(client_name)s-en agertzen den kodea gailu hau \"\n\"baimentzeko.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Ukatu\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Gailua baimenduta\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Zure %(client_name)s gailua behar bezala baimendu duzu.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Gailua ukatua\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Zure %(client_name)s gailuaren baimena ukatu da.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Errorea\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Saioa hasita mantendu\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Zure kontua bi faktoreko autentifikazioarekin babestuta dago. Mesedez, sartu \"\n\"autentifikazio-kode bat:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Bi faktoreko autentifikazioaren berreskuratze-kode sorta berri bat sortu da.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Berreskuratze-kode berriak sortu dira\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Autentifikazio-aplikazioa aktibatu da.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Autentifikazio-aplikazioa aktibatu da\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Autentifikazio-aplikazioa desaktibatu da.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Autentifikazio-aplikazioa desaktibatu da\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Segurtasun-gako berri bat gehitu da.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Segurtasun-gakoa gehitu da\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Segurtasun-gako bat kendu da.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Segurtasun-gakoa kendu da\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Autentifikazio-aplikazioa\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Autentifikazio-aplikazioaren bidezko autentifikazioa aktibatuta dago.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Autentifikazio-aplikazioa ez dago aktibo.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Desaktibatu\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktibatu\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Segurtasun-gakoak\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"%(count)s segurtasun-gako gehitu duzu.\"\nmsgstr[1] \"%(count)s segurtasun-gako gehitu dituzu.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Ez da segurtasun-gakorik gehitu.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Kudeatu\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Gehitu\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Berreskuratze-kodeak\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"%(total_count)s berreskuratze-kodetik %(unused_count)s dago erabilgarri.\"\nmsgstr[1] \"\"\n\"%(total_count)s berreskuratze-kodetik %(unused_count)s daude erabilgarri.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Ez da berreskuratze-koderik ezarri.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Ikusi\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Deskargatu\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Sortu\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Berreskuratze-kode sorta berri bat sortu da.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Segurtasun-gakoa gehitu da.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Segurtasun-gakoa kendu da.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Sartu autentifikazio-kode bat:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Zure konturako berreskuratze-kode sorta berri bat sortzear zaude.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Ekintza honek zure oraingo kodeak baliogabetuko ditu.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Ziur al zaude?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Erabili gabeko kodeak\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Kodeak deskargatu\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Kode berriak sortu\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Autentifikazio-aplikazioa aktibatu\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Zure kontua bi faktoreko autentifikazioarekin babesteko, eskaneatu beheko QR \"\n\"kodea zure autentifikazio-aplikazioarekin. Ondoren, sartu aplikazioak \"\n\"sortutako egiaztapen-kodea behean.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Autentifikatzailearen sekretua\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Sekretu hau gorde dezakezu eta geroago zure autentifikazio-aplikazioa \"\n\"berrinstalatzeko erabili.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Autentifikazio-aplikazioa desaktibatu\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Autentifikazio-aplikazioan oinarritutako autentifikazioa desaktibatzear \"\n\"zaude. Ziur al zaude?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Nabigatzaile honetan fidatu?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Nabigatzaile honetan fidatzea aukeratzen baduzu, ez zaizu egiaztapen-koderik \"\n\"eskatuko hurrengo saioa hasten duzunean.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Fidatu %(period)s-rako\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Ez fidatu\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Segurtasun-gakoa gehitu\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Segurtasun-gakoa kendu\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Ziur al zaude segurtasun-gako hau kendu nahi duzula?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Erabilera\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Pasahitz-gakoa\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Segurtasun-gakoa\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Gako honek ez du adierazten pasahitz-gakoa den ala ez.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Zehaztu gabea\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"%(created_at)s-en gehitua\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Azkenekoz %(last_used)s-en erabilia\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Editatu\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Segurtasun-gakoa editatu\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Gorde\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Pasahitz-gakoa sortu\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Zure konturako pasahitz-gako bat sortzear zaude. Geroago gako gehiago gehi \"\n\"ditzakezunez, izen deskribatzaile bat erabil dezakezu gakoak bereizteko.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Sortu\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Funtzionalitate honek JavaScript behar du.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Hirugarrenen bidezko saio-hasieraren errorea\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Errore bat gertatu da zure hirugarrenen kontua erabiliz saioa hasteko \"\n\"ahaleginean.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Ondorengo hirugarrenen kontu hauetako edozein erabili dezakezu zure kontuan \"\n\"sartzeko:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Oraingoz ez duzu hirugarrenen konturik lotu kontu honekin.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Hirugarrenen kontu bat gehitu\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"%(provider)s-eko hirugarrenen kontu bat zure kontuarekin konektatu da.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Hirugarrenen kontua konektatu da\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"%(provider)s-eko hirugarrenen kontu bat zure kontutik deskonektatu da.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Hirugarrenen kontua deskonektatu da\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"%(provider)s konektatu\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"%(provider)s-eko hirugarrenen kontu berri bat konektatzear zaude.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"%(provider)s bidez saioa hasi\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"%(provider)s-eko hirugarrenen kontu bat erabiliz saioa hastear zaude.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Baliogabetutako logina\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Lotutako kontu batekin saioa hasteko saiakera bertan behera utzi duzu. \"\n\"Oharkabean gertatu bada, mesedez <a href=\\\"%(login_url)s\\\">saioa hasi</a> \"\n\"berriro.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Hirugarrenen kontua konektatu da.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Hirugarrenen kontua deskonektatu da.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Zure %(provider_name)s kontua erabiltzear zaude %(site_name)s\\n\"\n\"webgunean saioa hasteko. Azken pausu bezala, mesedez osa ezazu\\n\"\n\"formulario hau:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Edo erabili hirugarren bat\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Beste saio guztietatik irten da.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Hasiera-data\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP helbidea\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Nabigatzailea\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Azkenekoz ikusita\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Oraingoa\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Beste saioetatik irten\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Erabiltzailearen saioak\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"saio-gakoa\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Lotutako kontuak\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Pasahitzak gutxienez {0} karaktere izan behar ditu.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Email hau jaso duzu zuk edo beste norbaitek pasahitza berrezartzeko \"\n#~ \"eskaera egin duelako zure kontuarentzat.\\n\"\n#~ \"Eskaera zuk egin ez baduzu mezu hau alde batera utzi dezakezu. Edo egin \"\n#~ \"klik ondorengo estekan zure pasahitza berrezartzeko.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Helbide elektroniko hauek zure kontuari lotuta daude:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Helbide elektronikoa egiaztatu\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Mesedez hasi saioa lotutako sare sozial kontu bat\\n\"\n#~ \"erabiliz, edo %(link)ssortu kontu bat%(end_link)s\\n\"\n#~ \"%(site_name)s webgunean eta saioa hasi hemen:\"\n\n#~ msgid \"or\"\n#~ msgstr \"edo\"\n\n#~ msgid \"change password\"\n#~ msgstr \"pasahitza aldatu\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"OpenID-rekin sartu\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Helbide elektroniko hau dagoeneko beste kontu bati lotuta dago.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Email bat bidali dizugu. Mesedez jarri gurekin kontaktuan hurrengo \"\n#~ \"minutuetan jasotzen ez baduzu.\"\n"
  },
  {
    "path": "allauth/locale/fa/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-10-22 13:02+0000\\n\"\n\"Last-Translator: eddipa <eddipa@users.noreply.hosted.weblate.org>\\n\"\n\"Language-Team: Persian <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/fa/>\\n\"\n\"Language: fa\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 5.14-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"اکنون این حساب غیرفعال است.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"امکان حذف نشانه ایمیل اصلی (%(email)s) مقدور نمی باشد.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"این نشانی ایمیل ازقبل به این حساب وصل شده.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"نشانی ایمیل یا گذرواژه نادرست است.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"شماره تلفن و/یا گذرواژه وارد شده نادرست است.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"یک کاربر ازقبل با این نشانی ایمیل ثبت شده است.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"لطفا گذرواژه کنونی‌‌ات را وارد کن.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"کد اشتباه است.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"رمز عبور اشتباه است.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"کلید نامعتبر است یا منقضی شده است.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"اطلاعات ورود نادرست است.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"توکن بازنشانی گذرواژه نامعتبر است.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"نمی توانید بیش از %d تعداد آدرس ایمیل اضافه کنید.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"یک کاربر ازقبل با این شماره تلفن ثبت شده است.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"تعداد تلاش های ناموفق بیش از حد مجاز شده است. لطفا بعدا تلاش کنید.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"این نشانی ایمیل به هیچ حساب کاربری‌ای متصل نشده است.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"این شماره تلفن به هیچ حساب کاربری‌ای متصل نشده است.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"نشانی ایمیل اصلی‌ شما باید تایید شده باشد.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"نام‌کاربری قابل استفاده نیست. لطفا از نام‌کاربری دیگری استفاده کنید.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"نام‌کاربری یا گذرواژه وارد شده نادرست است.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"لطفا یکی را انتخواب کنید\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"عبارت تازه بایستی با عبارت حاضر متفاوت باشد.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"لطفا صبور باشید، تعداد درخواست های شما بیش از حد مجاز است.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"از گذرواژه خود استفاده کنید\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"از برنامه تایید دومرحله ای یا کد استفاده کنید\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"از کلید امنیتی استفاده کنید\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"ایمیل {email} به عنوان تایید شده نشانه گذاری شد.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"علامت‌گذاری {email} به عنوان تایید شده ناموفق بود.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"استفاده از ایمیل های انتخابی به عنوان آدرس های تایید شده\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"حساب‌ها\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"ایمیل\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"نشانی ایمیل\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"یک شماره تلفن شامل کد کشور وارد کنید (مثلا +1 برای آمریکا).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"تلفن\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"هربار باید گذرواژه‌ی یکسانی را وارد کنی.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"گذرواژه\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"مرا به خاطر بسپار\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"نام‌کاربری\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"ورود\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"نام‌کاربری، ایمیل یا تلفن\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"نام‌کاربری یا ایمیل\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"نام‌کاربری یا تلفن\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"ایمیل یا تلفن\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"گذرواژه‌ات را فراموش کرده‌ای؟\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"ایمیل (دوباره)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"تاییدیه‌ی نشانی ایمیل\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"ایمیل (اختیاری)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"نام‌کاربری (اختیاری)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"هربار باید ایمیل یکسانی را وارد کنید.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"گذرواژه (دوباره)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"گذرواژه کنونی\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"گذرواژه جدید\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"گذرواژه جدید (دوباره)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"کد\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"کاربر\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"نشانی ایمیل\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"تاییدشده\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"اصلی\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"نشانی‌های ایمیل\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"ایجاد‌شده\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"ارسال شد\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"کلید\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"تاییدیه‌ی ایمیل\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"تاییدیه‌های ایمیل\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"بدون رابط کاربری\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"مشاهده شناسه کاربری شما\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"مشاهده آدرس ایمیل شما\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"مشاهده اطلاعات اولیه نمایه شما\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"اعطای مجوزها\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"استفاده از نویسه‌های عام (*) مجاز نیست مگر اینکه 'اجازه نویسه‌های عام در URI' \"\n\"فعال باشد.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' بیش از یک نویسه عام (*) دارد. فقط یک نویسه عام در هر URI مجاز است.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"نویسه‌های عام (*) فقط در بخش نام میزبان URI مجاز هستند.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"کد مجوز\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"کد دستگاه\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"اعتبارنامه کلاینت\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"توکن تازه‌سازی\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"محرمانه\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"عمومی\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"محدوده‌(های) مجاز برای درخواست کلاینت. هر مقدار را در یک خط وارد کنید، مثلا: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"در صورتی که کلاینت هیچ محدوده‌ای مشخص نکند، این محدوده‌های پیش‌فرض استفاده \"\n\"می‌شوند. هر مقدار را در یک خط وارد کنید، مثلا: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"فهرست انواع مجوزهای مجاز. هر مقدار را در یک خط وارد کنید، مثلا: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"فهرست مبداهای مجاز برای درخواست‌های بین‌دامنه‌ای، هر کدام در یک خط.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"اجازه استفاده از نویسه‌های عام (*) در URIهای تغییرمسیر و مبداهای CORS. هنگام \"\n\"فعال بودن، URIها می‌توانند شامل یک ستاره برای تطبیق زیردامنه‌ها باشند.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"فهرست انواع پاسخ‌های مجاز. هر مقدار را در یک خط وارد کنید، مثلا: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"کلاینت\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"کلاینت‌ها\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"امکان افزودن آدرس ایمیل به حسابی که توسط تایید دومرحله ای محافظت می شود وجود \"\n\"ندارد.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"امکان غیرفعالسازی تایید دومرحله ای مقدور نمی باشد.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"بدون فعال بودن احراز هویت دومرحله‌ای امکان تولید کدهای بازیابی وجود ندارد.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"تا زمانی که آدرس ایمیل خود را تایید نکرده‌اید، امکان فعال‌سازی احراز هویت \"\n\"دومرحله‌ای وجود ندارد.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"کلید اصلی\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"کلید پشتیبان\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"کلید شماره {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"احراز هویت چندعاملی\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"کدهای بازیابی\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"احراز هویت TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"کد احراز هویت\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"بدون گذرواژه\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"فعال کردن ورود بدون گذرواژه به شما امکان می‌دهد فقط با این کلید وارد شوید، \"\n\"اما نیازمندی‌های اضافی مانند بیومتریک یا محافظت با PIN را اعمال می‌کند.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"یک حساب کاربری با این آدرس ایمیل از قبل وجود دارد. لطفا ابتدا وارد آن حساب \"\n\"شوید، سپس حساب %s خود را به آن متصل کنید.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"توکن نامعتبر است.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"هیچ گذرواژه‌ای برای حساب‌ات نهاده نشده.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"حساب‌ات هیچ رایانامه‌ي تایید‌شده‌ای ندارد.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"امکان قطع اتصال آخرین حساب شخص ثالث شما وجود ندارد.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"حساب شخص ثالث از قبل به یک حساب دیگر متصل شده است.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"حساب‌های شخص ثالث\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"فراهم‌کننده\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"شناسه ارائه‌دهنده\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"نام\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"شناسه مشتری\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"شناسه اپ، یا کلید مصرف‌کننده\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"کلید محرمانه\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"رمز رابک (رابط برنامه‌ی کاربردی API)، رمز مشتری، یا رمز مصرف‌کننده\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"کلید\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"اپلیکیشن اجتماعی\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"اپلیکیشن‌های اجتماعی\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"شناسه‌کاربری\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"آخرین ورود\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"تاریخ پیوست‌شده\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"داده اضافی\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"حساب اجتماعی\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"حساب‌های اجتماعی\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"توکن\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) یا توکن دسترسی (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"رمز توکن\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) یا توکن تازه‌سازی (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"انقضا\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"توکن اپلیکشن اجتماعی\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"توکن‌های اپلیکیشن اجتماعی\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"داده نامعتبر نمایه\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"ورود\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"انصراف\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"پاسخ نامعتبر هنگام دریافت توکن درخواست از \\\"%s\\\". پاسخ: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"پاسخ نامعتبر هنگام دریافت توکن دسترسی از \\\"%s\\\"\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"توکن درخواست‌ْای برای \\\"%s\\\" ذخیره نشده.\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"توکن دسترسی‌ای برای \\\"%s\\\" ذخیره نشده.\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"دسترسی به منابع خصوصی \\\"%s\\\" وجود ندارد.\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"پاسخ نامعتبر هنگام دریافت توکن درخواست از \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"حساب غیرفعال\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"این حساب‌کاربری غیرفعال است.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"ما یک کد به %(recipient)s ارسال کرده‌ایم. این کد به زودی منقضی می‌شود، لطفا \"\n\"سریعا آن را وارد کنید.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"تایید\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"درخواست کد جدید\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"تایید دسترسی\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"لطفا برای حفاظت از حساب خود مجددا احراز هویت کنید.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"گزینه‌های جایگزین\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"تایید ایمیل\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"کد تایید ایمیل را وارد کنید\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"استفاده از آدرس ایمیل دیگر\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"ورود\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"کد ورود را وارد کنید\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"بازنشانی گذرواژه\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"کد بازنشانی گذرواژه را وارد کنید\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"تایید شماره تلفن\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"کد تایید تلفن را وارد کنید\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"استفاده از شماره تلفن دیگر\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"نشانی‌های رایانامه\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"نشانی‌های رایانامه زیر به حساب‌ات متصل شده‌اند:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"تایید‌شده\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"تایید‌نشده\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"اصلی\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"اصلی کردن\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"بازارسال تاییدیه\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"حذف\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"افزودن نشانی رایانامه\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"افزودن رایانامه\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"واقعا می‌خواهی نشانی رایانامه‌ی انتخاب‌شده را حذف کنی؟\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"شما این ایمیل را دریافت کرده‌اید زیرا شما یا شخص دیگری سعی کرده‌اید با آدرس \"\n\"ایمیل زیر حساب کاربری ایجاد کنید:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"اما حسابی با این آدرس ایمیل از قبل وجود دارد. اگر آن را فراموش کرده‌اید، لطفا \"\n\"از روش بازیابی گذرواژه برای دسترسی مجدد به حساب خود استفاده کنید:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"حساب کاربری از قبل وجود دارد\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"سلام از طرف %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"سپاس‌گزاریم برای استفاده از %(site_name)s.\\n\"\n\"‏%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"شما این ایمیل را دریافت کرده‌اید زیرا تغییر زیر در حساب شما اعمال شده است:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"اگر این تغییر را تشخیص نمی‌دهید، لطفا فورا اقدامات امنیتی لازم را انجام دهید. \"\n\"تغییر در حساب شما از منبع زیر انجام شده است:\\n\"\n\"\\n\"\n\"- آدرس IP: %(ip)s\\n\"\n\"- مرورگر: %(user_agent)s\\n\"\n\"- تاریخ: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"ایمیل شما از %(from_email)s به %(to_email)s تغییر کرده است.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"ایمیل تغییر کرد\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"ایمیل شما تایید شده است.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"تاییدیه ایمیل\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"شما این ایمیل را دریافت کرده‌اید زیرا کاربر %(user_display)s آدرس ایمیل شما \"\n\"را برای ثبت حساب کاربری در %(site_domain)s وارد کرده است.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"کد تایید ایمیل شما در زیر آمده است. لطفا آن را در پنجره مرورگر باز خود وارد \"\n\"کنید.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"برای تایید صحت این مورد، به %(activate_url)s بروید.\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"لطفا آدرس ایمیل خود را تایید کنید\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"آدرس ایمیل %(deleted_email)s از حساب شما حذف شده است.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"ایمیل حذف شد\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"کد ورود شما در زیر آمده است. لطفا آن را در پنجره مرورگر باز خود وارد کنید.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"اگر شما این اقدام را انجام نداده‌اید، می‌توانید با خیال راحت این ایمیل را \"\n\"نادیده بگیرید.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"کد ورود\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"گذرواژه شما تغییر کرده است.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"گذرواژه تغییر کرد\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"کد بازنشانی گذرواژه شما در زیر آمده است. لطفا آن را در پنجره مرورگر باز خود \"\n\"وارد کنید.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"کد بازنشانی گذرواژه\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"شما این ایمیل را دریافت کرده‌اید زیرا شما یا شخص دیگری درخواست بازنشانی \"\n\"گذرواژه حساب کاربری شما را داده است.\\n\"\n\"اگر شما این درخواست را نداده‌اید، می‌توانید با خیال راحت این ایمیل را نادیده \"\n\"بگیرید. برای بازنشانی گذرواژه، روی پیوند زیر کلیک کنید.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"در صورت فراموشی، نام‌کاربری‌ات %(username)s است.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"رایانامه‌ی بازنشانی گذرواژه\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"گذرواژه شما بازنشانی شده است.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"گذرواژه شما تنظیم شده است.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"تنظیم گذرواژه\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"شما این ایمیل را دریافت کرده‌اید زیرا شما یا شخص دیگری سعی کرده‌اید به حسابی \"\n\"با ایمیل %(email)s دسترسی پیدا کنید. اما هیچ سابقه‌ای از چنین حسابی در پایگاه \"\n\"داده ما وجود ندارد.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"اگر شما بوده‌اید، می‌توانید با استفاده از پیوند زیر یک حساب کاربری ایجاد کنید.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"حساب ناشناخته\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"آدرس ایمیل\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"ایمیل فعلی\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"در حال تغییر به\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"آدرس ایمیل شما هنوز در انتظار تایید است.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"لغو تغییر\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"تغییر به\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"تغییر ایمیل\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"تایید نشانی رایانامه\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"لطفا تایید کنید که <a href=\\\"mailto:%(email)s\\\">%(email)s</a> یک آدرس ایمیل \"\n\"برای کاربر %(user_display)s است.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"تایید %(email)s امکان‌پذیر نیست زیرا از قبل توسط حساب دیگری تایید شده است.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"این پیوند تایید ایمیل منقضی شده یا نامعتبر است. لطفا <a \"\n\"href=\\\"%(email_url)s\\\">درخواست تایید ایمیل جدید</a> ارسال کنید.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"اگر هنوز یه حساب نساختی، پس لطفا نخست %(link)sثبت‌نام%(end_link)s کن.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"ورود با کلید عبور\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"ارسال کد ورود برای من\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"خروج\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"مطمئنی می‌خواهی خارج شوی؟\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"نمی‌توانی نشانی رایانامه‌ی اصلی‌ات (%(email)s) را حذف کنی.\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"رایانامه‌ی تاییدیه به %(email)s فرستاده شد.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"نشانی رایانامه‌ %(email)s را تایید کرده‌ای.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"نشانی رایانامه %(email)s حذف شد.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"با %(name)s باموفقیت وارد شدی.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"خارج شده‌ای.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"کد ورود به %(recipient)s ارسال شد.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"گذرواژه باموفقیت تغییر کرد.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"گذرواژه باموفقیت نهاده شد.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"کد تایید به %(phone)s ارسال شد.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"شما شماره تلفن %(phone)s را تایید کرده‌اید.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"نشانی رانامه اصلی نهاده شد.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"تغییر گذرواژه\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"گذرواژه‌ات را فراموش کرده‌ای؟\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"گذرواژه خود را فراموش کرده‌اید؟ آدرس ایمیل خود را در زیر وارد کنید تا ایمیلی \"\n\"برای بازنشانی آن برایتان ارسال کنیم.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"درخواست بازنشانی\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"اگر مشکلی در بازنشانی گذرواژه‌ات داری، لطفا با ما تماس بگیر.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"ما یک ایمیل برای شما ارسال کرده‌ایم. اگر آن را دریافت نکرده‌اید لطفا پوشه \"\n\"هرزنامه خود را بررسی کنید. در غیر این صورت اگر تا چند دقیقه دیگر دریافت \"\n\"نکردید با ما تماس بگیرید.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"توکن نادرست\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"پیوند بازنشانی گذرواژه نامعتبر است، احتمالا به این دلیل که قبلا استفاده شده \"\n\"است. لطفا <a href=\\\"%(passwd_reset_url)s\\\">بازنشانی گذرواژه جدید</a> درخواست \"\n\"کنید.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"گذرواژه‌ات اکنون تغییر کرد.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"نهادن گذرواژه\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"تغییر تلفن\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"تلفن فعلی\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"شماره تلفن شما هنوز در انتظار تایید است.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"تغییر تلفن\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"گذرواژه خود را وارد کنید:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"شما یک کد ویژه برای ورود بدون گذرواژه دریافت خواهید کرد.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"درخواست کد\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"سایر روش‌های ورود\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"ثبت‌نام\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"ثبت نام\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"ازقبل یه حساب داری؟ پس لطفا %(link)sورود%(end_link)s کن.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"ثبت نام با کلید عبور\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"ثبت نام با کلید عبور\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"گزینه‌های دیگر\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"توقف ثبت‌نام\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"متاسفیم، ولی اکنون ثبت‌نام متوقف شده.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"توجه\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"شما در حال حاضر با %(user_display)s وارد شده‌اید.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"هشدار:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"در حال حاضر هیچ آدرس ایمیلی تنظیم نکرده‌اید. بهتر است یک آدرس ایمیل اضافه \"\n\"کنید تا بتوانید اعلان‌ها را دریافت کنید، گذرواژه خود را بازنشانی کنید و غیره.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"تایید نشانی رایانامه\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"ما یک ایمیل تایید برای شما ارسال کرده‌ایم. پیوند ارائه شده را دنبال کنید تا \"\n\"فرایند ثبت نام تکمیل شود. اگر ایمیل تایید را در صندوق ورودی اصلی خود \"\n\"نمی‌بینید، پوشه هرزنامه خود را بررسی کنید. اگر تا چند دقیقه دیگر ایمیل تایید \"\n\"را دریافت نکردید لطفا با ما تماس بگیرید.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"این بخش از سایت نیاز دارد که هویت شما تایید شود. برای این منظور، لازم است \"\n\"مالکیت آدرس ایمیل خود را تایید کنید. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"ما یک ایمیل تایید برای شما ارسال کرده‌ایم. لطفا روی پیوند داخل آن ایمیل کلیک \"\n\"کنید. اگر ایمیل تایید را در صندوق ورودی اصلی خود نمی‌بینید، پوشه هرزنامه خود \"\n\"را بررسی کنید. در غیر این صورت اگر تا چند دقیقه دیگر دریافت نکردید با ما \"\n\"تماس بگیرید.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>توجه:</strong> هنوز می‌توانید <a href=\\\"%(email_url)s\\\">آدرس ایمیل \"\n\"خود را تغییر دهید</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"پیام‌ها:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"منو:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"اتصال‌های حساب\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"احراز هویت دومرحله‌ای\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"نشست‌ها\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"مجوز دادن\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s می‌خواهد به حساب %(site_name)s شما دسترسی داشته باشد.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"کد دستگاه را وارد کنید\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"کدی که روی دستگاه شما نمایش داده شده را وارد کنید.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"ادامه\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"تایید دستگاه\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"لطفا کد نمایش داده شده در %(client_name)s خود را برای مجوز دادن به این \"\n\"دستگاه تایید کنید.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"رد کردن\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"دستگاه مجاز شد\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"شما با موفقیت دستگاه %(client_name)s خود را مجاز کردید.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"دستگاه رد شد\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"مجوز دستگاه %(client_name)s شما رد شده است.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"خطا\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"وارد بمانید\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"حساب شما با احراز هویت دومرحله‌ای محافظت می‌شود. لطفا کد احراز هویت را وارد \"\n\"کنید:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"مجموعه جدیدی از کدهای بازیابی احراز هویت دومرحله‌ای تولید شده است.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"کدهای بازیابی جدید تولید شد\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"برنامه احراز هویت فعال شد.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"برنامه احراز هویت فعال شد\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"برنامه احراز هویت غیرفعال شد.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"برنامه احراز هویت غیرفعال شد\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"یک کلید امنیتی جدید اضافه شده است.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"کلید امنیتی اضافه شد\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"یک کلید امنیتی حذف شده است.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"کلید امنیتی حذف شد\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"برنامه احراز هویت\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"احراز هویت با استفاده از برنامه احراز هویت فعال است.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"برنامه احراز هویت فعال نیست.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"غیرفعال کردن\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"فعال کردن\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"کلیدهای امنیتی\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"شما %(count)s کلید امنیتی اضافه کرده‌اید.\"\nmsgstr[1] \"شما %(count)s کلید امنیتی اضافه کرده‌اید.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"هیچ کلید امنیتی اضافه نشده است.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"مدیریت\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"افزودن\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"کدهای بازیابی\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"%(unused_count)s از %(total_count)s کد بازیابی موجود است.\"\nmsgstr[1] \"%(unused_count)s از %(total_count)s کد بازیابی موجود است.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"هیچ کد بازیابی تنظیم نشده است.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"مشاهده\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"دانلود\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"تولید\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"مجموعه جدیدی از کدهای بازیابی تولید شده است.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"کلید امنیتی اضافه شد.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"کلید امنیتی حذف شد.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"کد احراز هویت را وارد کنید:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"شما در حال تولید مجموعه جدیدی از کدهای بازیابی برای حساب خود هستید.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"این عمل کدهای موجود شما را باطل خواهد کرد.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"آیا مطمئن هستید؟\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"کدهای استفاده نشده\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"دانلود کدها\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"تولید کدهای جدید\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"فعال‌سازی برنامه احراز هویت\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"برای محافظت از حساب خود با احراز هویت دومرحله‌ای، کد QR زیر را با برنامه \"\n\"احراز هویت خود اسکن کنید. سپس کد تایید تولید شده توسط برنامه را در زیر وارد \"\n\"کنید.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"رمز برنامه احراز هویت\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"می‌توانید این رمز را ذخیره کنید و بعدا برای نصب مجدد برنامه احراز هویت خود از \"\n\"آن استفاده کنید.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"غیرفعال‌سازی برنامه احراز هویت\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"شما در حال غیرفعال کردن احراز هویت مبتنی بر برنامه احراز هویت هستید. آیا \"\n\"مطمئن هستید؟\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"به این مرورگر اعتماد می‌کنید؟\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"اگر به این مرورگر اعتماد کنید، دفعه بعد که وارد شوید از شما کد تایید خواسته \"\n\"نخواهد شد.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"اعتماد برای %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"اعتماد نکن\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"افزودن کلید امنیتی\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"حذف کلید امنیتی\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"آیا مطمئن هستید که می‌خواهید این کلید امنیتی را حذف کنید؟\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"استفاده\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"کلید عبور\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"کلید امنیتی\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"این کلید مشخص نمی‌کند که آیا یک کلید عبور است یا خیر.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"نامشخص\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"اضافه شده در %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"آخرین استفاده %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"ویرایش\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"ویرایش کلید امنیتی\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"ذخیره\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"ایجاد کلید عبور\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"شما در حال ایجاد یک کلید عبور برای حساب خود هستید. از آنجا که می‌توانید بعدا \"\n\"کلیدهای بیشتری اضافه کنید، می‌توانید از یک نام توصیفی برای تمایز کلیدها \"\n\"استفاده کنید.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"ایجاد\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"این قابلیت نیازمند جاوااسکریپت است.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"خطا در ورود با حساب شخص ثالث\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"هنگام تلاش برای ورود با حساب شخص ثالث شما خطایی رخ داد.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"می‌توانید با هر یک از حساب‌های شخص ثالث زیر وارد حساب خود شوید:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"در حال حاضر هیچ حساب شخص ثالثی به این حساب متصل نشده است.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"افزودن یک حساب شخص ثالث\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"یک حساب شخص ثالث از %(provider)s به حساب شما متصل شده است.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"حساب شخص ثالث متصل شد\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"یک حساب شخص ثالث از %(provider)s از حساب شما قطع شده است.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"حساب شخص ثالث قطع شد\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"اتصال %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"شما در حال اتصال یک حساب شخص ثالث جدید از %(provider)s هستید.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"ورود از طریق %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"شما در حال ورود با استفاده از یک حساب شخص ثالث از %(provider)s هستید.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"لغو ورود\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"ورودت به سایت‌مان با یکی از حساب‌هایت را لغو کردی. اگر اشتباهی شده، لطفا اقدام \"\n\"به <a href=\\\"%(login_url)s\\\">ورود</a> کن.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"حساب شخص ثالث متصل شد.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"حساب شخص ثالث قطع شد.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"چند قدمی ورود به %(site_name)s با حساب‌ات %(provider_name)s هستی. در گام آخر، \"\n\"لطفا فرم زیر را کامل کن:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"یا از حساب شخص ثالث استفاده کنید\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"از تمام نشست‌های دیگر خارج شدید.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"شروع شده در\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"آدرس IP\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"مرورگر\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"آخرین مشاهده در\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"فعلی\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"خروج از سایر نشست‌ها\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"نشست‌های کاربر\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"کلید نشست\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"اتصال‌های حساب\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"گذرواژه باید حداقل {0} کاراکتر باشد.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"سلام،\\n\"\n#~ \"\\n\"\n#~ \"این رایانامه را دریافت کرده‌ای چون برای حساب کاربری‌ات در %(site_name)s،  \"\n#~ \"از جانب خودت یا کسی دیگر، یه گذرواژه درخواست شده.\\n\"\n#~ \"برای بازنشانی گذرواژه پیوند زیر را دنبال کن. وگرنه چشم‌پوشی از این هنگامی \"\n#~ \"که خودت هم درخواست نکردی می‌تواند امن باشد.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"نشانی‌های رایانامه زیر به حساب‌ات متصل شده‌اند:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"تایید نشانی رایانامه\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"لطفا با یکی از حساب‌های شخص سوم موجودت وارد شو. یا در %(site_name)s<a \"\n#~ \"href=\\\"%(signup_url)s\\\">ثبت‌نام</a> کن و از زیر وارد شو:\"\n\n#~ msgid \"or\"\n#~ msgstr \"یا\"\n\n#~ msgid \"change password\"\n#~ msgstr \"تغییر گذرواژه\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"ورودبا OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"این نشانی رایانامه ازقبل به حساب دیگری وصل شده.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"بهت یه رایانامه فرستادیم. اگر تا چند دقیقه‌ی دیگر دریافتش نکردی باهامون \"\n#~ \"تماس بگیر.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"اطلاعات داده شده درست نیست.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"نام‌کاربری تنها می‌تواند شامل حروف، اعداد، و  @/./+/-/_. باشد\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"این نام‌کاربری قبلا گرفته شده. لطفا یکی دیگر انتخاب کن.\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"تایید کرده‌ای که <a href=\\\"mailto:%(email)s\\\">%(email)s</a> یه نشانی \"\n#~ \"رایانامه برای کاربر %(user_display)s است.\"\n"
  },
  {
    "path": "allauth/locale/fi/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: django-allauth\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-07-25 20:25+0200\\n\"\n\"Last-Translator: Juho Enala <juho.enala@gmail.com>\\n\"\n\"Language-Team: Finnish <fi@li.org>\\n\"\n\"Language: fi\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Translated-Using: django-rosetta 0.7.6\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Tämä tili on poistettu käytöstä.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Et voi poistaa ensisijaista sähköpostiosoitettasi.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Sähköpostiosoite on jo liitetty tähän tilliin.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Annettu sähköposti tai salasana ei ole oikein.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Antamasi puhelinnumero ja/tai salasana ei ole oikein.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Tämä sähköpostiosoite on jo käytössä.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Ole hyvä ja anna nykyinen salasanasi.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Virheellinen koodi.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Virheellinen salasana.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Virheellinen tai vanhentunut avain.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Virheellinen kirjautuminen.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Salasanan uusimistarkiste ei kelpaa.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Et voi lisätä enempää kuin %d sähköpostiosoitetta.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Tämä puhelinnumero on jo käytössä.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"\"\n\"Liian monta virheellistä kirjautumisyritystä. Yritä myöhemmin uudelleen.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Sähköpostiosoite ei ole liitetty mihinkään käyttäjätiliin.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Puhelinnumero ei ole liitetty mihinkään käyttäjätiliin.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Ensisijaisen sähköpostiosoiteen tulee olla vahvistettu.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Käyttäjänimeä ei voi käyttää. Valitse toinen käyttäjänimi.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Annettu käyttäjänimi tai salasana ei ole oikein.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Valitse vain yksi.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Uuden arvon täytyy olla eri kuin nykyinen.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Ole kärsivällinen, lähetät liian monta pyyntöä.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Käytä salasanaasi\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Käytä tunnistussovellusta tai koodia\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Käytä turva-avainta\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Merkitty {email} vahvistetuksi.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Osoitteen {email} merkitseminen vahvistetuksi epäonnistui.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Merkitse valitut sähköpostiosoitteet vahvistetuiksi\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Tili\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"Sähköposti\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Sähköpostiosoite\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Anna puhelinnumero maakoodilla (esim. +358 Suomelle).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Puhelin\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Salasanojen tulee olla samat.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Salasana\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Muista minut\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Käyttäjänimi\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Käyttäjätunnus\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Käyttäjänimi, sähköposti tai puhelin\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Käyttäjänimi tai sähköposti\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Käyttäjänimi tai puhelin\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Sähköposti tai puhelin\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Unohditko salasanasi?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"Sähköposti (uudestaan)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Sähköpostiosoitteen vahvistus\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"Sähköpostiosoite (valinnainen)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Käyttäjänimi (valinnainen)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Sinun täytyy kirjoittaa sama sähköposti joka kerta.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Salasana (uudestaan)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Nykyinen salasana\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Uusi salasana\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Uusi salasana (uudestaan)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Koodi\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"käyttäjä\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"sähköpostiosoite\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"vahvistettu\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"ensisijainen\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"sähköpostiosoitteet\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"luotu\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"lähetetty\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"avain\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"sähköpostivarmistus\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"sähköpostivarmistukset\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Näytä käyttäjätunnuksesi\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Näytä sähköpostiosoitteesi\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Näytä perusprofiilin tiedot\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Myönnä käyttöoikeudet\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Jokerimerkkejä ei sallita, ellei 'Salli URI-jokerimerkit' ole käytössä.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' sisältää useamman kuin yhden jokerimerkin (*). Vain yksi \"\n\"jokerimerkki per URI on sallittu.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Jokerimerkit ovat sallittuja vain URI:n isäntänimi-osassa.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Valtuutuskoodi\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Laitekoodi\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Asiakastunnukset\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Virkistysmerkki\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Luottamuksellinen\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Julkinen\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Käyttöalueet, joita asiakas voi pyytää. Anna yksi arvo per rivi, esim.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Jos asiakas ei määritä käyttöaluetta, käytetään näitä oletusarvoja. Anna \"\n\"yksi arvo per rivi, esim.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Luettelo sallituista valtuutustyypeistä. Anna yksi arvo per rivi, esim.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Luettelo sallituista alkuperistä toimialuerajat ylittäville pyynnöille, yksi \"\n\"per rivi.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Salli jokerimerkit (*) uudelleenohjaus-URI:issa ja CORS-lähteissä. Kun \"\n\"käytössä, URI:t voivat sisältää yhden tähtimerkin aliverkkotunnusten \"\n\"vastaamiseen.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Luettelo sallituista vastaustyypeistä. Anna yksi arvo per rivi, esim.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"asiakas\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"asiakkaat\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Et voi lisätä sähköpostiosoitetta tiliin, joka on suojattu kaksivaiheisella \"\n\"tunnistuksella.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Et voi poistaa kaksivaiheista tunnistusta käytöstä.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Et voi luoda palautuskoodeja ilman, että kaksivaiheinen tunnistus on \"\n\"käytössä.Et voi luoda palautuskoodeja ilman kaksivaiheisen tunnistuksen \"\n\"käyttöönottoa.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Et voi ottaa kaksivaiheista tunnistusta käyttöön ennen kuin olet vahvistanut \"\n\"sähköpostiosoitteesi.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Pääavain\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Varmuuskopiointinavain\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Avain nro. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Palautuskoodit\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP-tunnistin\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Tunnistinkoodi\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Salasanaton\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Salasanattoman toiminnan käyttöönotto mahdollistaa kirjautumisen pelkällä \"\n\"avaimella, mutta vaatii lisätoimenpiteitä kuten biometrista tunnistusta tai \"\n\"PIN-koodia.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Sähköpostiosoite on jo liitetty olemassaolevaan tiliin. Kirjaudu ensin \"\n\"kyseiseen tiliin ja liitä %s-tilisi vasta sitten.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Virheellinen tunniste.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Tilillesi ei ole asetettu salasanaa.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Tiliisi ei ole liitetty vahvistettua sähköpostiosoitetta.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Et voi irrottaa viimeistä jäljellä olevaa kolmannen osapuolen tiliäsi.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Kolmannen osapuolen tili on jo liitetty toiseen tiliin.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Sosiaalisen median tilit\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"tarjoaja\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"tarjoajan ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"nimi\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"asiakas id\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"Sovellus ID tai kuluttajan avain\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"salainen avain\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API:n, asiakkaan tai kuluttajan salaisuus\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Avain\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"sosiaalinen applikaatio\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"sosiaaliset applikaatiot\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"viimeisin sisäänkirjautuminen\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"liittymispäivämäärä\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"lisätiedot\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"sosiaalisen median tili\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"sosiaalisen median tilit\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"tunniste\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) tai käyttöoikeustunniste (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"tunnisteen salaisuus\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) tai virkistysmerkki (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"vanhenee\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"sosiaalisen sovelluksen tunniste\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"sosiaalisen sovelluksen tunnisteet\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Virheelliset profiilin tiedot\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Kirjaudu sisään\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Peruuta\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Virheellinen vastaus palvelusta \\\"%s\\\" pyyntötunnistetta haettaessa. Vastaus \"\n\"oli: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Virhe hankittaessa käyttöoikeustunnistetta palvelusta \\\"%s\\\"\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Pyyntötunnistetta ei ole tallennettu palvelulle \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Käyttöoikeustunnistetta ei ole tallennettu palvelulle \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Ei pääsyä yksityisiin resursseihin palvelussa \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Virheellinen vastaus palvelusta \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Tili poissa käytöstä\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Tämä tili ei ole käytössä.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Lähetimme koodin osoitteeseen %(recipient)s. Koodi vanhenee pian, joten \"\n\"syötä se mahdollisimman pian.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Vahvista\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Pyydä uusi koodi\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Vahvista pääsy\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Tunnistaudu uudelleen tilisi suojaamiseksi.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Vaihtoehtoiset toiminnot\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Sähköpostin vahvistus\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Anna sähköpostin vahvistuskoodi\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Käytä eri sähköpostiosoitetta\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Kirjaudu sisään\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Anna sisäänkirjautumiskoodi\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Salasanan uusiminen\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Anna salasanan palautuskoodi\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Puhelinnumeron vahvistus\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Anna puhelinnumeron vahvistuskoodi\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Käytä eri puhelinnumeroa\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Sähköpostiosoitteet\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Seuraavat sähköpostiosoitteet on liitetty tiliisi:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Vahvistettu\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Vahvistamaton\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Ensisijainen\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Aseta ensisijaiseksi\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Lähetä vahvistus uudelleen\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Poista\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Lisää sähköpostiosoite\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Lisää sähköposti\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Haluatko varmasti poistaa valitun sähköpostiosoitteen?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Saat tämän sähköpostin, koska sinä tai joku muu yritti rekisteröityä\\n\"\n\"käyttäen sähköpostiosoitetta:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Tällä sähköpostiosoitteella on kuitenkin jo tili. Jos olet unohtanut tämän,\\n\"\n\"käytä unohtunut salasana -toimintoa tilisi palauttamiseksi:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Tili on jo olemassa\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Terve palvelusta %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Kiitos, kun käytät %(site_name)s palvelua!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"Saat tämän sähköpostin, koska tilillesi tehtiin seuraava muutos:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Jos et tunnista tätä muutosta, ryhdy välittömästi asianmukaisiin \"\n\"turvatoimenpiteisiin. Tilisi muutos on peräisin seuraavasta:\\n\"\n\"\\n\"\n\"- IP-osoite: %(ip)s\\n\"\n\"- Selain: %(user_agent)s\\n\"\n\"- Päivämäärä: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"\"\n\"Sähköpostiosoitteesi on vaihdettu osoitteesta %(from_email)s osoitteeseen \"\n\"%(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Sähköpostiosoite vaihdettu\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Sähköpostiosoitteesi on vahvistettu.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Sähköpostin vahvistus\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Saat tämän sähköpostin, koska käyttäjä %(user_display)s on antanut \"\n\"sähköpostiosoitteesi rekisteröidäkseen tilin palvelussa %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Sähköpostin vahvistuskoodisi on listattu alla. Syötä se avoimessa \"\n\"selainikkunassasi.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"\"\n\"Vahvistaaksesi tietojen oikeellisuuden, mene osoitteeseen %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Vahvista sähköpostiosoitteesi\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"Sähköpostiosoite %(deleted_email)s on poistettu tililtäsi.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Sähköpostiosoite poistettu\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Sisäänkirjautumiskoodisi on listattu alla. Syötä se avoimessa \"\n\"selainikkunassasi.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Tämä sähköposti voidaan turvallisesti jättää huomiotta, jos et aloittanut \"\n\"tätä toimintoa.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Sisäänkirjautumiskoodi\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Salasanasi on vaihdettu.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Salasana vaihdettu\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Salasanan palautuskoodisi on listattu alla. Syötä se avoimessa \"\n\"selainikkunassasi.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Salasanan palautuskoodi\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Saat tämän sähköpostin, koska sinä tai joku muu on pyytänyt salasanan \"\n\"palautusta käyttäjätilillesi.\\n\"\n\"Tämä viesti voidaan turvallisesti jättää huomiotta, jos et pyytänyt \"\n\"salasanan palautusta. Klikkaa alla olevaa linkkiä palauttaaksesi salasanasi.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Muistathan, että käyttäjätunnuksesi on %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Salasanan uusimissähköposti\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Salasanasi on palautettu.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Salasanasi on asetettu.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Salasana asetettu\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Saat tämän sähköpostin, koska sinä tai joku muu yritti käyttää tiliä \"\n\"sähköpostiosoitteella %(email)s. Meillä ei kuitenkaan ole tietoa tällaisesta \"\n\"tilistä tietokannassamme.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Jos se olit sinä, voit rekisteröityä tilille alla olevan linkin kautta.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Tuntematon tili\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Sähköpostiosoite\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Nykyinen sähköposti\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Vaihtamassa kohteeseen\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Sähköpostiosoitteesi vahvistus on vielä kesken.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Peruuta muutos\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Vaihda kohteeseen\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Vaihda sähköposti\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Vahvista sähköpostiosoite\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Vahvista, että <a href=\\\"mailto:%(email)s\\\">%(email)s</a> on käyttäjän \"\n\"%(user_display)s sähköpostiosoite.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"%(email)s-osoitetta ei voi vahvistaa, koska se on jo vahvistettu toiselle \"\n\"tilille.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Tämä sähköpostiosoitteen vahvistuslinkki on vanhentunut tai muuten \"\n\"käyttökelvoton. Voit kuitenkin <a href=\\\"%(email_url)s\\\">pyytää uuden \"\n\"vahvistuslinkin sähköpostiosoitteellesi</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Jos et ole luonut vielä tiliä, niin %(link)srekisteröidy%(end_link)s ensin.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Kirjaudu passkey-avaimella\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Lähetä minulle sisäänkirjautumiskoodi\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Kirjaudu ulos\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Haluatko varmasti kirjautua ulos?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Et voi poistaa ensisijaista sähköpostiosoitettasi (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Vahvistusviesti on lähetetty osoitteeseen %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Sähköpostiosoite %(email)s on vahvistettu.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Poistettiin sähköpostiosoite %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Kirjauduttiin sisään käyttäjänä %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Kirjauduit ulos.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Sisäänkirjautumiskoodi on lähetetty osoitteeseen %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Salasana vaihto onnistui.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Salasana asetettiin.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Vahvistuskoodi on lähetetty numeroon %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Vahvistit puhelinnumeron %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Ensisijainen sähköpostiosoite asetettiin.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Vaihda salasana\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Salasana unohtunut?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Unohditko salasanasi? Anna sähköpostiosoitteesi alle, niin lähetämme sinulle \"\n\"sähköpostin, jonka avulla voit palauttaa sen.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Salasanan uusiminen\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"Ota meihin yhteyttä, jos sinulla on ongelmia salasanasi uusimisessa.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Lähetimme sinulle sähköpostin. Jos et saanut sitä, tarkista \"\n\"roskapostikansiosi. Jos et silti saa sitä muutamassa minuutissa, ota meihin \"\n\"yhteyttä.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Virheellinen tunniste\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Salasanan uusimislinkki ei toiminut. Tämä voi tapahtua, jos linkki on jo \"\n\"käytetty. Voit kuitenkin <a href=\\\"%(passwd_reset_url)s\\\">uusia salasanan \"\n\"uusimisen</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Salasanasi on nyt vaihdettu.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Aseta salasana\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Vaihda puhelinnumero\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Nykyinen puhelin\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Puhelinnumerosi vahvistus on vielä kesken.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Vaihda puhelinnumero\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Anna salasanasi:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Saat erikoiskoodin salasanatonta sisäänkirjautumista varten.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Pyydä koodi\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Muut sisäänkirjautumisvaihtoehdot\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Rekisteröidy\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Rekisteröidy\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Onko sinulla jo tili? %(link)sKirjaudu sisään%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Rekisteröidy passkey-avaimella\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Passkey-rekisteröityminen\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Muut vaihtoehdot\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Rekisteröityminen on poissa käytöstä.\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Valitettavasti rekisteröityminen on pois käytöstä.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Huomio\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Olet jo kirjautunut käyttäjänä %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Varoitus:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Et ole asettanut sähköpostiosoitetta. Tämä tulisi tehdä, jotta voit saada \"\n\"ilmoituksia, uusia salasanasi jne.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Vahvista sähköpostiosoitteesi\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Lähetimme sinulle vahvistusviestin sähköpostitse. Klikkaa sähköpostissa \"\n\"olevaa linkkiä viimeistelläksesi rekisteröitymisprosessin. Jos et näe \"\n\"vahvistusviestiä saapuneet-kansiossasi, tarkista roskapostikansiosi. Ota \"\n\"meihin yhteyttä, jos et saa vahvistusviestiä muutaman minuutin sisällä.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Tämä osa palvelua vaatii, että tiedämme kuka olet. Tämän takia sinun pitää \"\n\"vahvistaa omistavasi ilmoittamasi sähköpostiosoite.\"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Olemme lähettäneet sinulle sähköpostivahvistuksen. Klikkaa sähköpostissa \"\n\"olevaa linkkiä vahvistaaksesi sähköpostiosoitteesi. Jos et näe \"\n\"vahvistusviestiä pääpostilaatikossasi, tarkista roskapostikansiosi. Muussa \"\n\"tapauksessa ota meihin yhteyttä, jos et saa viestiä muutaman minuutin \"\n\"sisällä.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Huomio:</strong> voit edelleen <a href=\\\"%(email_url)s\\\">vaihtaa \"\n\"sähköpostiosoitteesi</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Viestit:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Valikko:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Liitetyt tilit\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Kaksivaiheinen tunnistus\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Istunnot\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Valtuuta\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s haluaa käyttää %(site_name)s -tiliäsi.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Anna laitekoodi\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Anna laitteessasi näkyvä koodi.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Jatka\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Vahvista laite\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Vahvista %(client_name)s-sovelluksessasi näkyvä koodi valtuuttaaksesi tämän \"\n\"laitteen.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Hylkää\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Laite valtuutettu\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Olet onnistuneesti valtuuttanut %(client_name)s-laitteesi.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Laite hylätty\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"%(client_name)s-laitteesi valtuutus on hylätty.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Virhe\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Pysy kirjautuneena\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Tilisi on suojattu kaksivaiheisella tunnistuksella. Anna tunnistinkoodi:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"Uusi kaksivaiheisen tunnistuksen palautuskoodien sarja on luotu.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Uudet palautuskoodit luotu\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Tunnistinsovellus aktivoitu.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Tunnistinsovellus aktivoitu\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Tunnistinsovellus poistettu käytöstä.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Tunnistinsovellus poistettu käytöstä\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Uusi turva-avain on lisätty.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Turva-avain lisätty\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Turva-avain on poistettu.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Turva-avain poistettu\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Tunnistinsovellus\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Tunnistinsovelluksella tunnistautuminen on käytössä.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Tunnistinsovellus ei ole käytössä.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Poista käytöstä\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktivoi\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Turva-avaimet\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Olet lisännyt %(count)s turva-avaimen.\"\nmsgstr[1] \"Olet lisännyt %(count)s turva-avainta.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Turva-avaimia ei ole lisätty.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Hallinnoi\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Lisää\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Palautuskoodit\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"On olemassa %(unused_count)s / %(total_count)s palautuskoodista \"\n\"käytettävissä.\"\nmsgstr[1] \"\"\n\"On olemassa %(unused_count)s / %(total_count)s palautuskoodista \"\n\"käytettävissä.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Palautuskoodeja ei ole määritetty.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Näytä\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Lataa\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Luo\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Uudet palautuskoodit on luotu.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Turva-avain lisätty.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Turva-avain poistettu.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Anna tunnistinsovelluksen koodi:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Olet aikeissa luoda uudet palautuskoodit tilillesi.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Tämä toiminto mitätöi nykyiset koodisi.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Oletko varma?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Käyttämättömät koodit\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Lataa koodit\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Luo uudet koodit\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Aktivoi tunnistinsovellus\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Suojataksesi tilisi kaksivaiheisella tunnistuksella, skannaa alla oleva QR-\"\n\"koodi tunnistinsovelluksellasi. Syötä sen jälkeen sovelluksen luoma \"\n\"vahvistuskoodi alla.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Tunnistinsovelluksen salainen avain\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Voit tallentaa tämän salaisen avaimen ja käyttää sitä tunnistinsovelluksesi \"\n\"uudelleenasennuksessa myöhemmin.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Poista tunnistinsovellus käytöstä\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Olet aikeissa poistaa tunnistinsovelluspohjaisen tunnistuksen käytöstä. \"\n\"Oletko varma?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Luotatko tähän selaimeen?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Jos päätät luottaa tähän selaimeen, sinulta ei kysytä vahvistuskoodia \"\n\"seuraavan kerran kirjautuessasi sisään.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Luota %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Älä luota\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Lisää turva-avain\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Poista turva-avain\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Haluatko varmasti poistaa tämän turva-avaimen?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Käyttö\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Pääsyavain\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Turva-avain\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Tämä avain ei ilmaise, onko se pääsyavain.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Määrittelemätön\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Lisätty %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Viimeksi käytetty %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Muokkaa\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Muokkaa turva-avainta\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Tallenna\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Luo pääsyavain\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Olet aikeissa luoda pääsyavaimen tilillesi. Koska voit lisätä muita avaimia \"\n\"myöhemmin, voit käyttää kuvaavaa nimeä erottaaksesi avaimet toisistaan.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Luo\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Tämä toiminto vaatii JavaScriptin.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Kolmannen osapuolen kirjautumisvirhe\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Tapahtui virhe yritettäessä kirjautua kolmannen osapuolen tilin kautta.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Voit kirjautua tilillesi käyttäen mitä tahansa seuraavista kolmannen \"\n\"osapuolen tileistä:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Tiliisi ei ole tällä hetkellä liitetty kolmannen osapuolen tilejä.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Lisää kolmannen osapuolen tili\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"\"\n\"Kolmannen osapuolen tili palvelusta %(provider)s on liitetty tilillesi.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Kolmannen osapuolen tili liitetty\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"Kolmannen osapuolen tili palvelusta %(provider)s on erotettu tililtäsi.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Kolmannen osapuolen tili erotettu\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Yhdistä %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Olet aikeissa yhdistää uuden kolmannen osapuolen tilin palvelusta \"\n\"%(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Kirjaudu sisään %(provider)s:n kautta\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Olet aikeissa kirjautua sisään käyttäen kolmannen osapuolen tiliä palvelusta \"\n\"%(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Sisäänkirjautuminen keskeytettiin\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Keskeytit sisäänkirjautumisen olemassaolevalle tilillesi. Jos tämä oli \"\n\"vahinko niin <a href=\\\"%(login_url)s\\\">kirjaudu sisään</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Kolmannen osapuolen tili on liitetty.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Kolmannen osapuolen tili on erotettu.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Olet aikeissa käyttää %(provider_name)s-tiliäsi kirjautuaksesi palveluun\\n\"\n\"%(site_name)s. Täytä vielä seuraava lomake:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Tai käytä kolmannen osapuolen palvelua\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Kirjauduttu ulos kaikista muista istunnoista.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Aloitettu\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP-osoite\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Selain\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Viimeksi nähty\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Nykyinen\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Kirjaudu ulos muista istunnoista\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Käyttäjäistunnot\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"istuntoavain\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Liitetyt tilit\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Salasanan tulee olla vähintään {0} merkkiä pitkä.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Sait tämän sähköpostin, koska sinä tai joku muu on pyytänyt salasasi \"\n#~ \"uusimista palvelussa %(site_domain)s.\\n\"\n#~ \"Tämän viestin voi jättää huomiotta, jos et pyytänyt salasanan uusimista. \"\n#~ \"Klikkaa alla olevaa linkkiä uusiaksesi salasanasi.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Seuraavat sähköpostiosoitteet on liitetty tiliisi:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Vahvista sähköpostiosoite\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Kirjaudu sisään käyttäen kirjautumispalvelua tai <a \"\n#~ \"href=\\\"%(signup_url)s\\\">rekisteröi</a> %(site_name)s-tili ja kirjaudu \"\n#~ \"sisään alla olevalla lomakkeella:\"\n\n#~ msgid \"or\"\n#~ msgstr \"tai\"\n\n#~ msgid \"change password\"\n#~ msgstr \"vaihda salasanaa\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"OpenID kirjautuminen\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Sähköpostiosoite on jo liitetty toiseen tiliin.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Olemme lähettäneet sinulle sähköpostia. Ota meihin yhteyttä, jos et saa \"\n#~ \"sitä muutaman minuutin sisällä.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"Kirjautumistiedot eivät ole oikein.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"\"\n#~ \"Käyttäjänimi saa sisältää vain kirjaimia, numeroita ja erikoismerkkejä \"\n#~ \"@/./+/-/_.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"Käyttäjänimi on käytössä. Valitse toinen käyttäjänimi.\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"Olet vahvistanut, että <a href=\\\"mailto:%(email)s\\\">%(email)s</a> on \"\n#~ \"sähköpostiosoite käyttäjälle %(user_display)s.\"\n"
  },
  {
    "path": "allauth/locale/fr/LC_MESSAGES/django.po",
    "content": "# DJANGO-ALLAUTH.\n# Copyright (C) 2016\n# This file is distributed under the same license as the django-allauth package.\n#\n# Translators:\n# Steve Kossouho <steve.kossouho@yahoo.fr>, 2016.\n# Gilou <contact+dev@gilouweb.com>, 2019\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: django-allauth\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-09-09 09:01+0000\\n\"\n\"Last-Translator: \\\"David D.\\\" <dadu042@users.noreply.hosted.weblate.org>\\n\"\n\"Language-Team: French <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/fr/>\\n\"\n\"Language: fr\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 5.14-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Ce compte est actuellement désactivé.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Vous ne pouvez pas retirer votre adresse e-mail principale.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"L'adresse e-mail est déjà associée à votre compte.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"L’adresse e-mail ou le mot de passe sont incorrects.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"\"\n\"Le numéro de téléphone et/ou le mot de passe que vous avez spécifié ne sont \"\n\"pas corrects.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Un autre utilisateur utilise déjà cette adresse e-mail.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Merci d'indiquer votre mot de passe actuel.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Code incorrect.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Mot de passe incorrect.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Clé invalide ou expirée.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Identifiant invalide.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Le jeton de réinitialisation de mot de passe est invalide.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Vous ne pouvez pas ajouter plus de %d adresses e-mail.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Un autre utilisateur utilise déjà ce numéro de téléphone.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"\"\n\"Trop de tentatives de connexion échouées. Veuillez réessayer ultérieurement.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Cette adresse e-mail n'est pas associée à un compte utilisateur.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Le numéro de téléphone n'est associé à aucun compte utilisateur.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Votre adresse e-mail principale doit être vérifiée.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Ce pseudonyme ne peut pas être utilisé. Veuillez en choisir un autre.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Le pseudo et/ou le mot de passe sont incorrects.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Veuillez en sélectionner un seul.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"La nouvelle valeur doit être différente de l'actuelle.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Soyez patient, vous envoyez trop de requêtes.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Utilisez votre mot de passe\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Utilisez une application d'authentification ou un code\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Utilisez une clé secrète\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} marquée comme vérifiée.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Échec à marquer {email} comme vérifiée.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Marquer les adresses e-mail sélectionnées comme vérifiées\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Comptes\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Adresse e-mail\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Entrez un numéro de téléphone avec l'indicatif du pays (par exemple, +33 \"\n\"pour la France).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Téléphone\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Vous devez saisir deux fois le même mot de passe.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Mot de passe\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Se souvenir de moi\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Nom d'utilisateur\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Identifiant\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Nom d'utilisateur, email ou téléphone\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Nom d'utilisateur ou e-mail\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Nom d'utilisateur ou téléphone\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Email ou téléphone\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Mot de passe oublié ?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-mail (confirmation)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Confirmation d'adresse e-mail\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-mail (facultatif)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Nom d'utilisateur (facultatif)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Vous devez saisir deux fois le même e-mail.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Mot de passe (confirmation)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Mot de passe actuel\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Nouveau mot de passe\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Nouveau mot de passe (confirmation)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Code\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"utilisateur\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"adresse e-mail\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"vérifiée\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"principale\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"adresses e-mail\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"créé\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"envoyé\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"clé\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"confirmation par e-mail\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"confirmations par e-mail\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Voir votre identifiant utilisateur\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Voir votre adresse e-mail\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Voir les informations basiques de votre profil\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Donner les permissions\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Les caractères génériques ne sont pas autorisés sauf si 'Autoriser les \"\n\"caractères génériques dans les URI' est activé.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"L'URI '{}' contient plus d'un caractère générique (*). Un seul caractère \"\n\"générique par URI est autorisé.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"\"\n\"Les caractères génériques ne sont autorisés que dans la partie nom d'hôte de \"\n\"l'URI.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Code d'autorisation\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Code de l'appareil\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Identifiants client\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Jeton d'actualisation\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Confidentiel\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Public\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Le(s) domaine(s) d’application que le client est autorisé à demander. \"\n\"Fournissez une valeur par ligne, par exemple : \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Si le client ne spécifie aucune portée, ces portées par défaut sont \"\n\"utilisées. Fournissez une valeur par ligne, par ex. : \"\n\"openid(ENTRÉE)profile(ENTRÉE)email(ENTRÉE)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Une liste des types d'autorisation autorisés. Fournissez une valeur par \"\n\"ligne, par ex. : \"\n\"authorization_code(ENTRÉE)client_credentials(ENTRÉE)refresh_token(ENTRÉE)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Une liste des origines autorisées pour les demandes d’origine croisée, une \"\n\"par ligne.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Autoriser les caractères génériques (*) dans les URI de redirection et les \"\n\"origines CORS. Lorsque cette option est activée, les URI peuvent contenir un \"\n\"seul astérisque pour correspondre aux sous-domaines.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Une liste des types de réponse autorisés. Fournissez une valeur par ligne, \"\n\"par exemple : code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"client\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"clients\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Vous ne pouvez pas ajouter une adresse e-mail à un compte protégé par \"\n\"l'authentification à deux facteurs.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Vous ne pouvez pas désactiver l'authentification à deux facteurs.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Vous ne pouvez pas générer de codes de récupération sans avoir activé \"\n\"l'authentification à deux facteurs.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Vous ne pouvez pas activer l'authentification à deux facteurs tant que vous \"\n\"n'avez pas vérifié votre adresse e-mail.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Clé principale\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Clé de secours\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Clé n°{number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Codes de récupération\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"Authentificateur TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Code de l'authentificateur\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Sans mot de passe\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"L'activation des opérations sans mot de passe vous permet de vous connecter \"\n\"en utilisant seulement cette clé/appareil, mais demande des exigences plus \"\n\"élevées comme les informations biométriques ou un code PIN.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Un compte existe déjà avec cette adresse e-mail. Merci de vous connecter au \"\n\"préalable avec ce compte, et ensuite connecter votre compte %s.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Mauvais jeton d'identification.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Vous devez d'abord définir le mot de passe de votre compte.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Vous devez d'abord associer une adresse e-mail à votre compte.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Vous ne pouvez pas déconnecter votre dernier compte tiers restant.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Ce compte social est déjà connecté à un autre compte.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Comptes sociaux\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"fournisseur\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ID du fournisseur\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"nom\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"id client\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"ID de l'app ou clé de l'utilisateur\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"clé secrète\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"Secret de l'API, secret du client, ou secret de l'utilisateur\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Clé\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"application sociale\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"applications sociales\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"dernière connexion\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"date d'inscription\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"données supplémentaires\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"compte social\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"comptes sociaux\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"jeton\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) ou jeton d'accès (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"jeton secret\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) ou jeton d'actualisation (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"expire le\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"jeton de l'application sociale\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"jetons de l'application sociale\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Données de profil incorrectes\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Identifiant\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Réponse invalide lors de l'obtention du jeton de requête de \\\"%s\\\". La \"\n\"réponse était : %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Réponse invalide lors de l'obtention du jeton d'accès depuis \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Aucun jeton de requête sauvegardé pour \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Aucun jeton d'accès sauvegardé pour \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Impossible d'accéder aux ressources privées de \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Réponse invalide lors de l'obtention du jeton de requête de \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Compte inactif\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Ce compte est inactif.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Nous avons envoyé un code à %(recipient)s. Le code expirera bientôt, \"\n\"veuillez donc l'entrer rapidement.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Confirmer\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Demander nouveau code\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Confirmer l'accès\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Veuillez vous réauthentifier pour protéger votre compte.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Options alternatives\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Vérification par e-mail\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Saisissez le code de vérification reçu par mail\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Utiliser une adresse e-mail différente\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Connexion\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Entrez le code de connexion\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Réinitialisation du mot de passe\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Entrez le code de réinitialisation du mot de passe\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Vérification du téléphone\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Entrez le code de vérification du téléphone\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Utiliser un numéro de téléphone différent\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Adresses e-mail\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Les adresses e-mail suivantes sont associées à votre compte :\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Vérifiée\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Non vérifiée\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Principale\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Rendre principale\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Renvoyer le message de vérification\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Retirer\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Ajouter une adresse e-mail\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Ajouter un e-mail\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Voulez-vous vraiment retirer cette adresse e-mail ?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Vous recevez cet email car vous ou quelqu'un d'autre a demandé à créer\\n\"\n\"un compte en utilisant cette adresse e-mail :\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Cependant, un compte utilisant cette adresse existe déjà. Au cas où vous \"\n\"auriez\\n\"\n\"oublié, merci d'utiliser la fonction de récupération de mot de passe pour\\n\"\n\"récupérer votre compte :\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Ce compte existe déjà\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Bonjour, c'est %(site_name)s !\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Merci d'utiliser %(site_name)s !\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Vous recevez cet e-mail car la modification suivante a été apportée à votre \"\n\"compte :\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Si vous ne reconnaissez pas ce changement, veuillez prendre immédiatement \"\n\"les mesures de sécurité qui s'imposent. La modification de votre compte \"\n\"provient de :\\n\"\n\"\\n\"\n\"- L'adresse IP : %(ip)s\\n\"\n\"- Navigateur : %(user_agent)s\\n\"\n\"- Date : %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Votre adresse e-mail a été modifiée de %(from_email)s à %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"E-mail modifié\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Votre e-mail a été confirmé.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Confirmation par e-mail\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Vous recevez cet e-mail car l'utilisateur %(user_display)s a indiqué votre \"\n\"adresse pour se connecter à son compte sur %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Votre code de connexion est indiqué ci-dessous. Veuillez le saisir dans la \"\n\"fenêtre ouverte de votre navigateur.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Pour confirmer que cela est correct, allez sur %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Confirmez votre adresse e-mail\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"L'adresse e-mail %(deleted_email)s a été retirée de votre compte.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"E-mail retiré\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Votre code de connexion est indiqué ci-dessous. Veuillez l'entrer dans votre \"\n\"navigateur.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"Cet email peut être ignoré si vous n'avez rien effectué.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Code de connexion\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Votre mot de passe a été modifié.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Mot de passe modifié\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Votre code de réinitialisation du mot de passe est indiqué ci-dessous. \"\n\"Veuillez l'entrer dans la fenêtre de votre navigateur ouverte.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Code de réinitialisation du mot de passe\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Vous recevez cet e-mail car vous ou quelqu'un d'autre a demandé une \"\n\"réinitialisation de mot de passe pour votre compte utilisateur.\\n\"\n\"Vous pouvez simplement ignorer ce message si vous n'êtes pas à l'origine de \"\n\"cette demande. Sinon, cliquez sur le lien ci-dessous pour réinitialiser \"\n\"votre mot de passe.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"\"\n\"Au cas où vous l'auriez oublié, votre nom d'utilisateur est %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"E-mail de réinitialisation de mot de passe\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Votre mot de passe a été réinitialisé.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Votre mot de passe a été défini.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Définition du mot de passe\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Vous recevez cet email car vous, ou quelqu'un d'autre, a essayé d'accéder à \"\n\"un compte avec l'email %(email)s. Cependant, nous ne disposons pas de ce \"\n\"compte dans nos bases de données.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Si c'était vous, vous pouvez vous inscrire en utilisant le lien ci-dessous.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Compte inconnu\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Adresse e-mail\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"E-mail actuel\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Changer pour\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Votre adresse e-mail est toujours en attente de vérification.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Annuler la modification\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Changer pour\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Changer d'e-mail\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Confirmer l'adresse e-mail\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Merci de confirmer que <a href=\\\"mailto:%(email)s\\\">%(email)s</a> est \"\n\"l'adresse e-mail de %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Impossible de confirmer %(email)s car il est déjà confirmé par un autre \"\n\"compte.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Ce lien de confirmation d'adresse e-mail a expiré ou n'est pas valide. \"\n\"Veuillez lancer <a href=\\\"%(email_url)s\\\">une nouvelle demande de \"\n\"confirmation</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Si vous n'avez pas encore créé de compte, merci de vous \"\n\"%(link)senregistrer%(end_link)s au préalable.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Se connecter avec une clé d'accès\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Envoyez-moi un code de connexion\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Se déconnecter\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Êtes-vous sûr(e) de vouloir vous déconnecter ?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"\"\n\"Vous ne pouvez pas retirer votre adresse e-mail principale (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"E-mail de confirmation envoyé à %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Vous avez confirmé %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Adresse e-mail %(email)s retirée.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Connexion avec %(name)s réussie.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Vous êtes déconnecté(e).\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Un code de connexion a été envoyé à %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Mot de passe modifié avec succès.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Mot de passe défini avec succès.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Un code de vérification a été envoyé à %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Vous avez vérifié le numéro de téléphone %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Adresse e-mail principale enregistrée.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Modifier le mot de passe\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Mot de passe oublié ?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Mot de passe oublié ? Indiquez votre adresse e-mail ci-dessous et nous vous \"\n\"enverrons un e-mail pour le réinitialiser.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Réinitialiser mon mot de passe\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Merci de nous contacter si vous ne parvenez pas à réinitialiser votre mot de \"\n\"passe.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Nous vous avons envoyé un e-mail. Si vous ne l'avez pas reçu, veuillez \"\n\"vérifier votre dossier de spam. Sinon, contactez-nous si vous ne le recevez \"\n\"pas dans quelques minutes.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Mauvais jeton d'identification\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Le lien de réinitialisation du mot de passe est invalide. Il a peut être \"\n\"déjà été utilisé. Veuillez faire une nouvelle <a \"\n\"href=\\\"%(passwd_reset_url)s\\\">demande de réinitialisation de mot de passe</\"\n\"a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Votre mot de passe a été modifié.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Définir un mot de passe\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Changer de numéro de téléphone\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Numéro de téléphone actuel\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Votre numéro de téléphone est toujours en attente de vérification.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Changer de numéro de téléphone\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Saisissez votre mot de passe :\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Vous recevrez un code spécial pour une connexion sans mot de passe.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Demander un code\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Autres options de connexion\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Inscription\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Création de compte\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"\"\n\"Vous avez déjà un compte ? Vous pouvez donc %(link)svous \"\n\"connecter%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"S'inscrire avec une clé d'accès\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Création de compte avec clé de sécurité\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Autres options\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Inscriptions fermées\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Nous sommes désolés, mais les inscriptions sont actuellement fermées.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Remarque\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Vous êtes déjà connecté en tant que %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Attention :\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Vous n'avez aucune adresse e-mail associée à votre compte. Vous devriez \"\n\"ajouter une adresse e-mail pour pouvoir recevoir des notifications, \"\n\"réinitialiser votre mot de passe, etc.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Vérifiez votre adresse e-mail\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Nous vous avons envoyé un e-mail pour validation. Cliquez sur le lien fourni \"\n\"dans l'e-mail pour terminer l'inscription. Si vous ne voyez pas l'e-mail de \"\n\"vérification dans votre boîte de réception, vérifiez votre dossier spam. \"\n\"Merci de nous contacter si vous ne le recevez pas d'ici quelques minutes.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Pour accéder à cette partie du site, il faut d'abord que\\n\"\n\"nous ayons vérifié qui vous indiquez être. Pour cela, vous devez prouver\\n\"\n\"que vous êtes bien le propriétaire de l'adresse e-mail que vous nous avez \"\n\"indiquée. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Nous vous avons envoyé un e-mail de vérification.\\n\"\n\"Merci de cliquer sur le lien inclus dans ce courriel. Si vous ne voyez pas \"\n\"l'e-mail de vérification dans votre boîte de réception, vérifiez votre \"\n\"dossier spam.\\n\"\n\"Contactez-nous si vous ne l'avez pas reçu d'ici quelques minutes.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Remarque :</strong> vous pouvez toujours <a \"\n\"href=\\\"%(email_url)s\\\">changer votre adresse e-mail</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Messages :\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menu :\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Comptes associés\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Authentification à deux facteurs\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sessions\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autoriser\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s veut accéder à votre compte %(site_name)s.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Entrer code d’appareil\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Entrez le code affiché sur votre appareil.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Continuer\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Confirmer l'appareil\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Veuillez confirmer le code affiché sur votre %(client_name)s pour autoriser \"\n\"cet appareil.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Renier\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Appareil autorisé\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Vous avez autorisé avec succès votre appareil %(client_name)s.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Appareil refusé\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"L’autorisation pour votre appareil %(client_name)s a été refusée.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Erreur\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Rester connecté\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Votre compte est protégé par l'authentification à deux facteurs. Veuillez \"\n\"saisir un code d'authentification :\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Un nouveau jeu de codes de récupération pour l'authentification à deux \"\n\"facteurs a été généré.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Nouveaux codes de récupération générés\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Application d'authentification activée.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Application d'authentification activée\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Application d'authentification désactivée.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Application d'authentification désactivée\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Une nouvelle clé de sécurité a été ajoutée.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Clé de sécurité ajoutée\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Une clé de sécurité a été retirée.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Clé de sécurité retirée\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Application d'authentification\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"\"\n\"L'authentification à l'aide d'une application d'authentification est active.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Aucune application d'authentification active.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Désactiver\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Activer\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Clés de sécurité\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Vous avez ajouté %(count)s clé de sécurité.\"\nmsgstr[1] \"Vous avez ajouté %(count)s clés de sécurité.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Aucune clé de sécurité n'a été ajoutée.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Gérer\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Ajouter\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Codes de récupération\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Il y a %(unused_count)s code de récupération disponible sur %(total_count)s.\"\nmsgstr[1] \"\"\n\"Il y a %(unused_count)s codes de récupération disponibles sur \"\n\"%(total_count)s.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Aucun code de récupération défini.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Afficher\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Télécharger\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Générer\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Un nouveau jeu de codes de récupération a été généré.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Clé de sécurité ajoutée.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Clé de sécurité enlevée.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Saisissez un code d'authentification :\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\"Vous êtes sur le point de générer un nouveau jeu de codes de récupération \"\n\"pour votre compte.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Cette action invalidera vos codes existants.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Êtes-vous sûr(e) ?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Codes inutilisés\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Télécharger les codes\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Générer de nouveaux codes\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Activer l'application d'authentification\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Pour protéger votre compte avec l'authentification à deux facteurs, scannez \"\n\"le code QR ci-dessous avec votre application d'authentification. Ensuite, \"\n\"saisissez le code de vérification généré par l'application ci-dessous.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Secret d'authentification\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Vous pouvez stocker ce secret et l'utiliser pour réinstaller votre \"\n\"application d'authentification ultérieurement.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Désactiver l'application d'authentification\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Vous êtes sur le point de désactiver l'authentification basée sur \"\n\"l'application d'authentification. Êtes-vous sûr(e) ?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Faire confiance à ce navigateur ?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Si vous choisissez de faire confiance à ce navigateur, aucun code de \"\n\"vérification ne vous sera demandé lors de votre prochaine connexion.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Faire confiance pendant %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Ne pas faire confiance\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Ajouter une clé de sécurité\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Enlever une clé de sécurité\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Êtes-vous sûr de vouloir supprimer cette clé de sécurité ?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Utilisation\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Clé de sécurité\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"clé de sécurité\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Cette clé n'indique pas si c'est une clé de sécurité.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Non spécifiée\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Ajoutée à %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Dernière utilisation à %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Modifier\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Modifier la clé de sécurité\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Enregistrer\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Créer une clé de sécurité\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Vous allez créer une clé de sécurité pour votre compte. Étant donne que vous \"\n\"pourrez en ajouter d'autres plus tard, vous pouvez utiliser un nom \"\n\"descriptif pour différencier les clés.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Créer\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Cette fonctionnalité nécessite JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Échec de la connexion via réseau social\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Une erreur est survenue lors de la tentative de connexion à votre compte de \"\n\"réseau social.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Vous pouvez vous connecter à votre compte en utilisant l'un des comptes \"\n\"tiers suivants :\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Aucun compte social n'est actuellement associé à ce compte.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Ajouter un compte tiers\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Un compte tiers de %(provider)s a été associé à votre compte.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Compte tiers ajouté\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"Un compte tiers de %(provider)s a été dissocié de votre compte.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Compte tiers dissocié\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Connecter %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Vous êtes sur le point de connecter un nouveau compte tiers de %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Connexion via %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Vous êtes sur le point de vous connecter en utilisant un compte tiers de \"\n\"%(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Connexion annulée\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Vous avez annulé la connexion à notre site depuis l'un de vos comptes de \"\n\"réseau social. S'il s'agit d'une erreur, merci de vous <a \"\n\"href=\\\"%(login_url)s\\\">reconnecter</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Le compte social a bien été connecté.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Le compte social a été déconnecté.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Vous êtes sur le point de vous connecter via votre compte %(provider_name)s\\n\"\n\"au site %(site_name)s. Merci de compléter le formulaire suivant pour \"\n\"confirmer la connexion :\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Ou utilisez un service tiers\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Déconnecté de toutes les autres sessions.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Commencé à\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"Adresse IP\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Navigateur\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Vu pour la dernière fois à\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Actuel\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Déconnecter les autres sessions\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Sessions utilisateur\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"Clé de session\"\n\n#~ msgid \"Account Connection\"\n#~ msgstr \"Connexion au compte\"\n\n#, fuzzy\n#~ msgid \"Use security key or device\"\n#~ msgstr \"Utilisez votre clé de sécurité ou appareil\"\n\n#, fuzzy\n#~ msgid \"Add Security Key or Device\"\n#~ msgstr \"Ajouter une clé de sécurité ou un appareil\"\n\n#~ msgid \"Add key or device\"\n#~ msgstr \"Ajouter une clé ou un appareil\"\n\n#, fuzzy\n#~ msgid \"Security Keys and Devices\"\n#~ msgstr \"Clés de sécurité et appareils\"\n\n#, fuzzy\n#~ msgid \"You have not added any security keys/devices.\"\n#~ msgstr \"Vous n'avez pas ajouté de clés de sécurité ou d'appareils.\"\n\n#, fuzzy\n#~ msgid \"Edit Security Key or Device\"\n#~ msgstr \"Modifier la clé de sécurité ou l'appareil\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Le mot de passe doit contenir au minimum {0} caractères.\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"\\\"Vous recevez cet e-mail parce que vous ou quelqu'un d'autre a demandé \"\n#~ \"un mot de\\n\"\n#~ \"passe pour votre compte utilisateur. Cependant, nous n'avons aucun\\n\"\n#~ \"enregistrement d'un utilisateur avec l'e-mail %(email)s dans notre base \"\n#~ \"de\\n\"\n#~ \"données.\\n\"\n#~ \"\\n\"\n#~ \"Vous pouvez ignorer en toute sécurité cet e-mail si vous n'avez pas \"\n#~ \"demandé de\\n\"\n#~ \"réinitialisation de mot de passe.\\n\"\n#~ \"\\n\"\n#~ \"Si c'était vous, vous pouvez vous inscrire pour un compte en utilisant le \"\n#~ \"lien\\n\"\n#~ \"ci-dessous.\"\n\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Les adresses email suivantes sont associées à votre compte :\"\n\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Changer l'adresse e-mail\"\n\n#~ msgid \"\"\n#~ \"To safeguard the security of your account, please enter your password:\"\n#~ msgstr \"\"\n#~ \"Pour garantir la sécurité de votre compte, veuillez entrer votre mot de \"\n#~ \"passe:\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Merci d'ouvrir une session avec l'un de vos comptes sociaux. Vous pouvez \"\n#~ \"aussi %(link)souvrir un compte%(end_link)s %(site_name)s puis vous \"\n#~ \"connecter ci-dessous :\"\n\n#~ msgid \"or\"\n#~ msgstr \"ou\"\n\n#~ msgid \"change password\"\n#~ msgstr \"modifier le mot de passe\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Connexion OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"L'adresse e-mail est déjà associée à un autre compte.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Nous vous avons envoyé un e-mail. Merci de nous contacter si vous ne le \"\n#~ \"recevez pas d'ici quelques minutes.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"L'identifiant ou le mot de passe sont incorrects.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"\"\n#~ \"Un pseudonyme ne peut contenir que des lettres, des chiffres, ainsi que \"\n#~ \"@/./+/-/_.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"Ce pseudonyme est déjà utilisé, merci d'en choisir un autre.\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"Vous avez confirmé que l'adresse e-mail de l'utilsateur %(user_display)s \"\n#~ \"est <a href=\\\"mailto:%(email)s\\\">%(email)s</a>.\"\n\n#~ msgid \"Thanks for using our site!\"\n#~ msgstr \"Merci d'utiliser notre site !\"\n"
  },
  {
    "path": "allauth/locale/he/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: 0.1\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2024-06-15 10:09+0000\\n\"\n\"Last-Translator: Eyal Cherevatsky <5116133+eyalch@users.noreply.github.com>\\n\"\n\"Language-Team: Hebrew <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/he/>\\n\"\n\"Language: he\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Generator: Weblate 5.6-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"חשבון זה אינו פעיל כעת.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"לא ניתן להסיר את כתובת האימייל הראשית שלך.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"כתובת אימייל זו כבר משויכת לחשבון זה.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"כתובת האימייל ו/או הסיסמה אינם נכונים.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"מספר הטלפון ו/או הסיסמה אינם נכונים.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"משתמש אחר כבר רשום עם כתובת אימייל זו.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"אנא הזן את הסיסמה הנוכחית.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"קוד שגוי.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"סיסמה שגויה.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"מפתח פגום או פג תוקף.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"כניסה לא חוקית.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"אסימון איפוס הסיסמה אינו תקין.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"לא ניתן להוסיף יותר מ-%d כתובות אימייל.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"משתמש אחר כבר רשום עם מספר טלפון זה.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"יותר מדי ניסיונות התחברות כושלים. אנא נסה שוב מאוחר יותר.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"כתובת האימייל אינה משויכת לאף חשבון משתמש.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"מספר הטלפון אינו משויך לאף חשבון משתמש.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"עליך לאמת את כתובת האימייל הראשית שלך.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"לא ניתן להשתמש בשם משתמש זה. אנא בחר שם משתמש אחר.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"שם המשתמש ו/או הסיסמה אינם נכונים.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"אנא בחר/י אחד בלבד.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"הערך החדש חייב להיות שונה מהערך הנוכחי.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"אנא המתן/י, את/ה שולח/ת יותר מדי בקשות.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"להשתמש בסיסמה\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"השתמש ביישומון אימות או קוד\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"השתמש במפתח אבטחה\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} סומן כמאומת.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"סימון {email} כמאומת נכשל.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"סמן את כתובות האימייל שנבחרו כמאומתות.\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"חשבונות\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"אימייל\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"כתובת אימייל\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"הזן/י מספר טלפון כולל קידומת מדינה (למשל +972 לישראל).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"טלפון\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"יש להזין את אותה הסיסמה פעמיים.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"סיסמה\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"זכור אותי\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"שם משתמש\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"כניסה\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"שם משתמש, אימייל או טלפון\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"שם משתמש או אימייל\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"שם משתמש או טלפון\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"אימייל או טלפון\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"שכחת את סיסמתך?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"אימייל (שוב)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"אישור כתובת אימייל\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"אימייל (לא חובה)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"שם משתמש (לא חובה)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"יש להזין את אותו האימייל פעמיים.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"סיסמה (שוב)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"סיסמה נוכחית\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"סיסמה חדשה\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"סיסמה חדשה (שוב)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"קוד\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"משתמש\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"כתובת אימייל\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"מאומת\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"ראשי\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"כתובות אימייל\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"נוצר\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"נשלח\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"מפתח\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"אישור באימייל\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"אישורים בדואל\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"צפה במזהה המשתמש שלך\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"צפה בכתובת האימייל שלך\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"צפה בפרטי הפרופיל הבסיסיים שלך\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"הענק הרשאות\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"תווי כוכבית אינם מותרים אלא אם 'אפשר תווי כוכבית ב-URI' מופעל.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"URI '{}' מכיל יותר מתו כוכבית (*) אחד. מותר רק תו כוכבית אחד לכל URI.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"תווי כוכבית מותרים רק בחלק שם המארח של ה-URI.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"קוד הרשאה\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"קוד מכשיר\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"פרטי זיהוי לקוח\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"אסימון רענון\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"חסוי\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"ציבורי\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"היקף ההרשאות שהלקוח רשאי לבקש. ספק ערך אחד לכל שורה, למשל: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"במקרה שהלקוח לא מציין היקף הרשאות, היקפי ברירת המחדל הבאים ישמשו. ספק ערך \"\n\"אחד לכל שורה, למשל: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"רשימת סוגי הרשאה מותרים. ספק ערך אחד לכל שורה, למשל: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"רשימת מקורות מותרים לבקשות חוצות-מקור, אחד לכל שורה.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"אפשר תווי כוכבית (*) ב-URI של הפניות ומקורות CORS. כאשר מופעל, URIs יכולים \"\n\"להכיל כוכבית בודדת להתאמת תת-דומיינים.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"רשימת סוגי תגובה מותרים. ספק ערך אחד לכל שורה, למשל: code(ENTER)id_token \"\n\"token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"לקוח\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"לקוחות\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"לא ניתן להוסיף כתובת אימייל לחשבון שמוגן באימות דו-שלבי.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"לא ניתן לבטל אימות דו-שלבי.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"לא ניתן ליצור קודי שחזור מבלי שאימות דו-שלבי יהיה מופעל.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"לא ניתן להפעיל אימות דו-שלבי לפני שאימתת את כתובת האימייל.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"מפתח ראשי\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"מפתח גיבוי\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"מפתח מס' {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"אימות רב-שלבי\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"קודי שחזור\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"מאמת TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"קוד אימות\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"ללא סיסמה\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"הפעלת מצב ללא סיסמה מאפשרת לך להיכנס באמצעות מפתח זה בלבד, אך מחייבת דרישות \"\n\"נוספות כגון זיהוי ביומטרי או הגנת PIN.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"קיים כבר חשבון עם כתובת אימייל זו. אנא התחבר לחשבון זה, ואז קשר את חשבון %s \"\n\"שלך.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"אסימון פגום.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"לא נבחרה סיסמה לחשבונך.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"לא נמצאו כתובות אימייל מאומתות לחשבונך.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"לא ניתן לנתק את חשבון הצד-השלישי האחרון שנשאר.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"חשבון צד שלישי זה כבר מקושר לחשבון אחר.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"חשבונות חברתיים\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"ספק\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"מזהה ספק\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"שם\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"מזהה לקוח\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"מזהה יישום, או מפתח צרכן\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"מפתח סודי\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"סוד API, סוד לקוח או סוד צרכן\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"מפתח\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"יישום חברתי\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"יישומים חברתיים\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"מזהה ייחודי\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"התחברות אחרונה\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"תאריך הצטרפות\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"מידע נוסף\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"חשבון חברתי\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"חשבונות חברתיים\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"אסימון\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) או אסימון גישה (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"סוד אסימון\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) או אסימון רענון (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"פג תוקף בתאריך\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"אסימון יישום חברתי\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"אסימוני יישום חברתי\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"מידע פרופיל שגוי\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"כניסה\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"ביטול\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"תגובה לא חוקית בעת קבלת אסימון בקשה מ-\\\"%s\\\". התגובה הייתה: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"תגובה לא חוקית בעת קבלת אסימון גישה מ-\\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"אין אסימון בקשה שמור עבור \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"אין אסימון גישה שמור עבור \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"אין גישה למשאב פרטי ב-\\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"תגובה לא חוקית בעת קבלת אסימון בקשה מ-\\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"חשבון לא פעיל\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"חשבון זה אינו פעיל.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"שלחנו קוד ל-%(recipient)s. הקוד יפוג בקרוב, אז נא להזין אותו בהקדם.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"אמת\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"בקש קוד חדש\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"אימות גישה\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"אנא הזדהה מחדש כדי להגן על חשבונך.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"אפשרויות חלופיות\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"אימות אימייל\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"הזן קוד אימות אימייל\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"השתמש בכתובת אימייל אחרת\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"כניסה\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"הזן קוד כניסה\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"איפוס סיסמה\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"הזן קוד איפוס סיסמה\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"אימות טלפון\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"הזן קוד אימות טלפון\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"השתמש במספר טלפון אחר\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"כתובות אימייל\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"כתובות האימייל הבאות משויכות לחשבונך:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"מאומת\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"לא מאומת\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"ראשי\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"הפוך לראשי\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"שלח אימייל אימות מחדש\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"הסר\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"הוסף כתובת אימייל\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"הוסף אימייל\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"האם ברצונך להסיר את כתובות האימייל המסומנות?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"את/ה מקבל/ת מייל זה מכיוון שאת/ה או מישהו אחר ניסה להירשם\\n\"\n\"לחשבון באמצעות כתובת האימייל:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"עם זאת, חשבון עם כתובת אימייל זו כבר קיים. במקרה\\n\"\n\"ששכחת, אנא השתמש/י בתהליך שחזור סיסמה כדי לשחזר\\n\"\n\"את חשבונך:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"החשבון כבר קיים\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"שלום מ%(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"תודה שהשתמשת באתר %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"את/ה מקבל/ת אימייל עקב השינוי הבא שבוצע בחשבונך:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"אם אינך מזהה את השינוי הזה, נא לנקוט מיד באמצעי אבטחה נאותים. השינוי בחשבונך \"\n\"מקורו ב:\\n\"\n\"\\n\"\n\"- כתובת IP: %(ip)s\\n\"\n\"- דפדפן: %(user_agent)s\\n\"\n\"- תאריך: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"האימייל שלך השתנה מ-%(from_email)s ל-%(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"אימייל השתנה\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"האימייל שלך אושר.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"אישור באימייל\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"את/ה מקבל/ת מייל זה מכיוון שהמשתמש %(user_display)s השתמש בכתובת האימייל שלך \"\n\"כדי לרשום חשבון ב-%(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"קוד אימות האימייל שלך מופיע למטה. אנא הזן/י אותו בחלון הדפדפן שפתוח.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"כדי לאשר שזה נכון, עבור/י אל %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"אנא אמת את כתובת האימייל שלך\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"כתובת האימייל %(deleted_email)s הוסרה מחשבונך.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"אימייל הוסר\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"קוד הכניסה שלך מופיע למטה. אנא הזן/י אותו בחלון הדפדפן שפתוח.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"ניתן להתעלם בבטחה ממייל זה אם לא יזמת פעולה זו.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"קוד כניסה\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"סיסמתך שונתה.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"סיסמה שונתה\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"קוד איפוס הסיסמה שלך מופיע למטה. אנא הזן/י אותו בחלון הדפדפן שפתוח.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"קוד איפוס סיסמה\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"מייל זה נשלח אליך כיוון שאת/ה או מישהו אחר ביקש לאפס את הסיסמה לחשבונך.\\n\"\n\"במידה ולא ביקשת איפוס סיסמה ניתן להתעלם ממייל זה ללא חשש. לחץ על הקישור מטה \"\n\"לאיפוס סיסמתך.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"במידת ושכחת, שם המשתמש שלך הוא %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"מייל איפוס סיסמה\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"סיסמתך אופסה.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"סיסמתך הוגדרה.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"הגדרת סיסמה\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"הודעה זו נשלחה אליך כי את/ה, או מישהו אחר, ניסה לגשת לחשבון עם כתובת האימייל \"\n\"%(email)s. עם זאת, אין לנו רישום של חשבון כזה במסד הנתונים שלנו.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"אם זה היית את/ה, תוכל/י להירשם לחשבון באמצעות הקישור למטה.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"חשבון לא ידוע\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"כתובת אימייל\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"כתובת אימייל נוכחית\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"משתנה ל\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"כתובת האימייל שלך עדיין ממתינה לאימות.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"בטל שינוי\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"שנה ל\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"שנה אימייל\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"אימות כתובת אימייל\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"אנא אמת ש<a href=\\\"mailto:%(email)s\\\">%(email)s</a> היא כתובת האימייל של \"\n\"המשתמש %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"לא ניתן לאשר את %(email)s מכיוון שהיא כבר אושרה על ידי חשבון אחר.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"קישור זה לאימות כתובת אימייל פג תוקף או שאינו תקין. יש <a \"\n\"href=\\\"%(email_url)s\\\">להנפיק בקשה חדשה לאימות כתובת אימייל</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"אם לא נרשמת לחשבון בעבר, אנא %(link)sהרשם%(end_link)s תחילה.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"התחבר עם מפתח גישה\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"שלחו לי קוד כניסה\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"יציאה\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"האם אתה בטוח שברצונך לצאת?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"לא ניתן להסיר את כתובת האימייל הראשית שלך (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"מייל אימות נשלח ל %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"כתובת האימייל %(email)s אומתה בהצלחה.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"כתובת האימייל %(email)s הוסרה.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"מחובר בהצלחה כ %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"התנתקת מהחשבון.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"קוד כניסה נשלח ל-%(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"הסיסמה שונתה בהצלחה.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"הסיסמה נקבעה בהצלחה.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"קוד אימות נשלח ל-%(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"אימתת את מספר הטלפון %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"כתובת אימייל ראשית הוגדרה.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"החלפת סיסמה\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"שכחת סיסמה?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"שכחת את סיסמתך? הזן את כתובת האימייל שלך כאן, ונשלח לך מייל לאיפוס הסיסמה.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"אפס את הסיסמה\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"אנא צור איתנו קשר אם אתה מתקשה לאפס את הסיסמה.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"שלחנו לך מייל. אם לא קיבלת אותו, בדוק בתיקיית הספאם שלך. אחרת פנה אלינו אם \"\n\"לא תקבל אותו תוך מספר דקות.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"אסימון פגום\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"הקישור לאיפוס הסיסמה אינו תקין, כנראה מכיוון שכבר נעשה בו שימוש.  לחץ כאן \"\n\"לבקשת <a href=\\\"%(passwd_reset_url)s\\\">איפוס סיסמה</a> מחדש.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"סיסמתך שונתה.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"קביעת סיסמה\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"שנה טלפון\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"טלפון נוכחי\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"מספר הטלפון שלך עדיין ממתין לאימות.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"שנה טלפון\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"הזינו סיסמה:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"תקבל/י קוד מיוחד לכניסה ללא סיסמה.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"בקש קוד\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"אפשרויות כניסה אחרות\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"הרשמה\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"הרשמה\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"נרשמת בעבר? %(link)sכניסה למערכת%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"הירשם באמצעות מפתח גישה\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"הרשמה עם מפתח גישה\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"אפשרויות אחרות\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"ההרשמה סגורה\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"אנו מצטערים, אך ההרשמה סגורה כעת.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"הערה\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"הנך מחובר כבר כ%(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"אזהרה:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"טרם שייכת כתובת אימייל לחשבונך. מומלץ לשייך כתובת אימייל על מנת לקבל התראות, \"\n\"לאפס סיסמה וכו'.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"אשר את כתובת הדואל שלך\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"שלחנו לך אימייל לאימות. עקוב אחר הקישור שסופק כדי לסיים את תהליך ההרשמה. אם \"\n\"אינך רואה את דוא\\\"ל האימות בתיבת הדואר הנכנס הראשית שלך, בדוק את תיקיית \"\n\"הספאם. אנא צור איתנו קשר אם לא תקבל את הודעת האימות תוך מספר דקות.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"חלק זה באתר דורש מאיתנו לוודא כי הנך אכן מי שאתה טוען שאתה.\\n\"\n\"למטרה זו, אנו מבקשים כי תאמת בעלות על כתובת האימייל שלך. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"שלחנו אליך מייל למטרת אימות.\\n\"\n\"אנא לחץ/י על הקישור בתוך אימייל זה. אם אינך רואה את מייל האימות בתיבת הדואר \"\n\"הנכנס, בדוק/בדקי בתיקיית הספאם. אם לא\\n\"\n\"קיבלת את המייל תוך מספר דקות, אנא צור/צרי עמנו קשר.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>הערה:</strong> עדיין ניתן <a href=\\\"%(email_url)s\\\">לשנות את כתובת \"\n\"האימייל שלך</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"הודעות:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"תפריט:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"קישורים לחשבון\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"אימות דו-שלבי\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"הפעלות\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"אשר\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s מבקש גישה לחשבון %(site_name)s שלך.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"הזן קוד מכשיר\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"הזן/י את הקוד המוצג על המכשיר שלך.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"המשך\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"אשר מכשיר\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"אנא אשר/י את הקוד המוצג ב-%(client_name)s שלך כדי לאשר מכשיר זה.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"דחה\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"המכשיר אושר\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"אישרת בהצלחה את מכשיר ה-%(client_name)s שלך.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"המכשיר נדחה\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"ההרשאה למכשיר ה-%(client_name)s שלך נדחתה.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"שגיאה\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"הישאר מחובר\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"חשבונך מוגן באמצעות אימות דו-שלבי. אנא הזן/י קוד מאפליקציית האימות:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"סט חדש של קודי שחזור לאימות דו-שלבי נוצר.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"קודי שחזור חדשים נוצרו\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"אפליקציית האימות הופעלה.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"אפליקציית אימות הופעלה\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"אפליקציית האימות הושבתה.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"אפליקציית אימות הושבתה\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"מפתח אבטחה חדש נוסף.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"מפתח אבטחה נוסף\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"מפתח אבטחה הוסר.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"מפתח אבטחה הוסר\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"אפליקציית אימות\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"אימות באמצעות אפליקציית אימות פעיל.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"אפליקציית אימות אינה פעילה.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"השבת\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"הפעל\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"מפתחות אבטחה\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"הוספת %(count)s מפתח אבטחה.\"\nmsgstr[1] \"הוספת %(count)s מפתחות אבטחה.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"לא נוספו מפתחות אבטחה.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"נהל\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"הוסף\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"קודי שחזור\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"יש %(unused_count)s מתוך %(total_count)s קודי שחזור זמינים.\"\nmsgstr[1] \"יש %(unused_count)s מתוך %(total_count)s קודי שחזור זמינים.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"לא הוגדרו קודי שחזור.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"צפה\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"הורד\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"צור\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"סט חדש של קודי שחזור נוצר.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"מפתח אבטחה נוסף.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"מפתח אבטחה הוסר.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"הזן/י קוד מאפליקציית האימות:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"אתה עומד ליצור סט חדש של קודי שחזור לחשבונך.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"פעולה זו תבטל את הקודים הקיימים שלך.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"האם אתה בטוח?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"קודים שלא נוצלו\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"הורד קודים\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"צור קודים חדשים\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"הפעל אפליקציית אימות\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"כדי להגן על חשבונך באמצעות אימות דו-שלבי, סרוק/סרקי את קוד ה-QR למטה באמצעות \"\n\"אפליקציית האימות. לאחר מכן, הזן/י את קוד האימות שנוצר על ידי האפליקציה.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"סוד אפליקציית האימות\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"ניתן לשמור סוד זה ולהשתמש בו כדי להתקין מחדש את אפליקציית האימות בזמן מאוחר \"\n\"יותר.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"השבת אפליקציית אימות\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"אתה עומד להשבית אימות באמצעות אפליקציית אימות. האם אתה בטוח?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"לסמוך על דפדפן זה?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"אם תבחר/י לסמוך על דפדפן זה, לא תתבקש/י להזין קוד אימות בפעם הבאה שתיכנס/י.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"סמוך למשך %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"אל תסמוך\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"הוסף מפתח אבטחה\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"הסר מפתח אבטחה\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"האם אתה בטוח שברצונך להסיר מפתח אבטחה זה?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"שימוש\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"מפתח גישה\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"מפתח אבטחה\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"מפתח זה אינו מציין האם הוא מפתח גישה.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"לא צוין\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"נוסף ב-%(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"שימוש אחרון %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"ערוך\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"ערוך מפתח אבטחה\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"שמור\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"צור מפתח גישה\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"אתה עומד ליצור מפתח גישה לחשבונך. מכיוון שתוכל להוסיף מפתחות נוספים מאוחר \"\n\"יותר, תוכל להשתמש בשם תיאורי כדי להבחין בין המפתחות.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"צור\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"פונקציונליות זו דורשת JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"כשל בהתחברות דרך צד שלישי\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"אירעה שגיאה במהלך ניסיון ההתחברות באמצעות חשבון צד שלישי שלך.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"ניתן להתחבר לחשבונך באמצעות כל אחד מחשבונות צד שלישי הבאים:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"כרגע לא מקושרים חשבונות צד שלישי לחשבון זה.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"הוסף חשבון צד שלישי\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"חשבון צד שלישי מ-%(provider)s חובר לחשבונך.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"חשבון צד שלישי חובר\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"חשבון צד שלישי מ-%(provider)s נותק מחשבונך.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"חשבון צד שלישי נותק\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"חבר את %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"אתה עומד לחבר חשבון צד שלישי חדש מ-%(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"התחבר דרך %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"אתה עומד להתחבר באמצעות חשבון צד שלישי מ-%(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"התחברות בוטלה\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"ביקשת לבטל את ההתחברות לאתר זה באמצעות אחד מחשבונותיך הקיימים. במידה וטעית, \"\n\"אנא המשך ל<a href=\\\"%(login_url)s\\\">התחברות</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"חשבון צד שלישי חובר בהצלחה.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"חשבון צד שלישי נותק בהצלחה.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"אתה עומד להשתמש בחשבון %(provider_name)s שלך כדי\\n\"\n\"להתחבר ל%(site_name)s. לסיום, אנא מלא את הטופס הבא:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"או השתמש בצד שלישי\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"יצאת מכל ההפעלות האחרות.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"התחלה\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"כתובת IP\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"דפדפן\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"נראה לאחרונה ב\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"נוכחי\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"התנתק מהפעלות אחרות\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"הפעלות משתמש\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"מפתח הפעלה\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"קישורים לחשבון\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"הסיסמה חייבת להיות באורך של לפחות {0} תווים.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"שלום מ%(site_name)s!\\n\"\n#~ \"\\n\"\n#~ \"מייל זה נשלח אליך כיוון שאתה או מישהו אחר ביקש סיסמה עבור חשבונך ב \"\n#~ \"%(site_name)s.\\n\"\n#~ \"במידה ולא ביקשת איפוס סיסמה ניתן להתעלם ממייל זה ללא חשש. לחץ על הקישור \"\n#~ \"מטה לאיפוס סיסמתך.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"כתובות האימייל הבאות משויכות לחשבונך:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"אימות כתובת אימייל\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"אנא הכנס עם אחד מהחשבונות הקיימים שלך.\\n\"\n#~ \"או, %(link)sהרשם%(end_link)s לחשבון %(site_name)s והתחבר:\"\n\n#~ msgid \"or\"\n#~ msgstr \"או\"\n\n#~ msgid \"change password\"\n#~ msgstr \"החלפת סיסמה\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"כניסה באמצעות OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"כתובת אימייל זו כבר משויכת לחשבון אחר.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"המייל נשלח. אנא צור איתנו קשר אם הוא אינו מתקבל תוך מספר דקות.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"שם המשתמש ו/או הסיסמא אינם נכונים\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"שם משתמש זה כבר תפוס, אנא ציין שם אחר\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"אישרת בהצלחה כי <a href=\\\"mailto:%(email)s\\\">%(email)s</a> הנה כתובת דואר \"\n#~ \"אלקטרוני עבור המשתמש %(user_display)s.\"\n\n#~ msgid \"Confirmation email sent to %(email)s\"\n#~ msgstr \"דואל אישור נשלח אל %(email)s\"\n\n#~ msgid \"Delete Password\"\n#~ msgstr \"מחיקת סיסמא\"\n\n#~ msgid \"\"\n#~ \"You may delete your password since you are currently logged in using \"\n#~ \"OpenID.\"\n#~ msgstr \"אתה רשאי למחוק את סיסמאתך כיוון שהנך מחובר באמצעות OpenID\"\n\n#~ msgid \"delete my password\"\n#~ msgstr \"מחק סיסמא\"\n\n#~ msgid \"Password Deleted\"\n#~ msgstr \"הסיסמא נמחקה\"\n"
  },
  {
    "path": "allauth/locale/hr/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n# Bojan Mihelac <bmihelac@mihelac.org>, 2013-05-22\n# Mislav Cimperšak <mislav.cimpersak@gmail.com>. 2013-07-09\n# Goran Cetušić <mislav.cimpersak@gmail.com>. 2015-11-27\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2024-04-20 21:48+0200\\n\"\n\"Last-Translator: <goran.cetusic@gmail.com>\\n\"\n\"Language-Team: Bojan Mihelac <bmihelac@mihelac.org>\\n\"\n\"Language: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && \"\n\"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\\n\"\n\"X-Generator: Poedit 1.5.4\\n\"\n\"X-Translated-Using: django-rosetta 0.7.2\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Ovaj korisnički račun je privremeno neaktivan.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Nije moguće ukloniti vašu primarnu e-mail adresu.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"E-mail adresa je već registrirana s ovim korisničkim računom.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"E-mail adresa i/ili lozinka nisu ispravni.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Broj telefona i/ili lozinka nisu ispravni.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Već postoji korisnik registriran s ovom e-mail adresom.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Molimo unesite trenutnu lozinku.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Neispravan kôd.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Neispravna lozinka.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Neispravan ili istekao ključ.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Neispravna prijava.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Token za resetiranje lozinke je neispravan.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Ne možete dodati više od %d e-mail adresa.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Već postoji korisnik registriran s ovim brojem telefona.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Previše neuspjelih pokušaja prijave. Pokušajte ponovno kasnije.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"E-mail adresa nije dodijeljena niti jednom korisničkom računu.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Broj telefona nije dodijeljen niti jednom korisničkom računu.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Vaša primarna adresa more biti potvrđena.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Nije moguće koristiti upisano korisničko ime. Molimo odaberite drugo.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Korisničko ime i/ili lozinka nisu ispravni.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Molimo odaberite samo jedno.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Nova vrijednost mora biti različita od trenutne.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Budite strpljivi, šaljete previše zahtjeva.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Koristite svoju lozinku\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Koristite aplikaciju za autentifikaciju ili kôd\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Koristite sigurnosni ključ\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Adresa {email} označena kao potvrđena.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Nije uspjelo označiti {email} kao potvrđenu.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Označi odabrane e-mail adrese kao potvrđene\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Korisnički računi\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"E-mail adresa\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Unesite broj telefona uključujući pozivni broj države (npr. +385 za \"\n\"Hrvatsku).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Potrebno je upisati istu lozinku svaki put.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Lozinka\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Zapamti me\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Korisničko ime\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Prijava\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Korisničko ime, e-mail ili telefon\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Korisničko ime ili e-mail\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Korisničko ime ili telefon\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-mail ili telefon\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Zaboravili ste lozinku?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-mail (ponovno)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Potvrda e-mail adrese\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-mail (neobavezno)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Korisničko ime (neobavezno)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Potrebno je upisati istu e-mail adresu svaki put.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Lozinka (ponovno)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Trenutna lozinka\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Nova lozinka\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Nova lozinka (ponovno)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kôd\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"korisnik\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"e-mail adresa\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"potvrđena\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"primarna\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"E-mail adrese\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"stvoreno\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"poslano\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"ključ\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"E-mail potvrda\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"E-mail potvrde\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Pregledajte svoj korisnički ID\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Pregledajte svoju e-mail adresu\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Pregledajte osnovne podatke svog profila\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Dodijelite dozvole\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Zamjenski znakovi nisu dopušteni osim ako nije omogućena opcija 'Dopusti \"\n\"zamjenske znakove u URI-ju'.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' sadrži više od jednog zamjenskog znaka (*). Dopušten je samo jedan \"\n\"zamjenski znak po URI-ju.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"\"\n\"Zamjenski znakovi su dopušteni samo u dijelu URI-ja koji označava naziv \"\n\"poslužitelja.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Autorizacijski kôd\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Kôd uređaja\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Klijentske vjerodajnice\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Token za osvježavanje\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Povjerljivo\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Javno\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Opseg(i) koje klijent smije zatražiti. Unesite jednu vrijednost po retku, \"\n\"npr.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"U slučaju da klijent ne navede opseg, koriste se ovi zadani opsezi. Unesite \"\n\"jednu vrijednost po retku, npr.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Popis dopuštenih tipova odobrenja. Unesite jednu vrijednost po retku, npr.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"Popis dopuštenih izvora za zahtjeve između domena, jedan po retku.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Dopusti zamjenske znakove (*) u preusmjeravajućim URI-jima i CORS izvorima. \"\n\"Kada je omogućeno, URI-ji mogu sadržavati jednu zvjezdicu za podudaranje s \"\n\"poddomenama.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Popis dopuštenih tipova odgovora. Unesite jednu vrijednost po retku, npr.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"klijent\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"klijenti\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Ne možete dodati e-mail adresu na račun zaštićen dvofaktorskom \"\n\"autentifikacijom.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Ne možete deaktivirati dvofaktorsku autentifikaciju.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Ne možete generirati kodove za oporavak bez omogućene dvofaktorske \"\n\"autentifikacije.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Ne možete aktivirati dvofaktorsku autentifikaciju dok ne potvrdite svoju e-\"\n\"mail adresu.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Glavni ključ\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Rezervni ključ\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Ključ br. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Kodovi za oporavak\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP autentifikator\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Kôd autentifikatora\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Bez lozinke\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Omogućavanje rada bez lozinke omogućuje vam prijavu samo ovim ključem, ali \"\n\"nameće dodatne zahtjeve poput biometrije ili zaštite PIN-om.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Korisnički račun s ovom e-mail adresom već postoji. Molimo da se prvo \"\n\"prijavite pod tim korisničkim računom i zatim povežete svoj %s račun.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Neispravan token.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Vaš korisnički račun nema postavljenu lozinku.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Vaš korisnički račun nema potvrđenu e-mail adresu.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Ne možete odspojiti svoj zadnji preostali račun treće strane.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Račun treće strane je već povezan s drugim korisničkim računom.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Korisnički računi\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"pružatelj\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ID pružatelja\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"naziv\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"ID klijenta\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"ID aplikacije ili potrošački ključ\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"tajni ključ\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API tajna, tajna klijenta ili potrošačka tajna\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Ključ\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"društvena aplikacija\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"društvene aplikacije\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"zadnja prijava\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"datum pridruživanja\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"dodatni podaci\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"društveni račun\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"društveni računi\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) ili pristupni token (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"tajna tokena\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) ili token za osvježavanje (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"istječe u\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"token društvene aplikacije\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"tokeni društvenih aplikacija\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Neispravni podaci profila\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Prijava\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Odustani\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Neispravan odaziv pri dohvatu tokena zahtjeva od \\\"%s\\\". Odgovor je bio: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Neispravan odaziv pri dohvatu pristupnog tokena od \\\\\\\"%s\\\\\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Ne postoji pohranjeni token za \\\\\\\"%s\\\\\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Token za pristup za  \\\\\\\"%s\\\\\\\" nije pohranjen.\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Nemate pristup zaštičenim sadržajima na \\\\\\\"%s\\\\\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Neispravan odaziv pri dohvatu tokena zahtjeva od \\\\\\\"%s\\\\\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Račun je neaktivan\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Ovaj korisnički račun je neaktivan.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Poslali smo kôd na %(recipient)s. Kôd uskoro istječe, stoga ga unesite što \"\n\"prije.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Potvrda\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Zatraži novi kôd\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Potvrdite pristup\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Molimo ponovno se autentificirajte radi zaštite svog računa.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Alternativne mogućnosti\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Potvrda e-maila\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Unesite kôd za potvrdu e-maila\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Koristite drugu e-mail adresu\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Prijava\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Unesite kôd za prijavu\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Resetiranje lozinke\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Unesite kôd za resetiranje lozinke\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Potvrda telefona\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Unesite kôd za potvrdu telefona\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Koristite drugi broj telefona\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"E-mail adrese\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Slijedeće e-mail adrese su povezane sa vašim korisničkim računom\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Potvrđena\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Nepotvrđena\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Primarna\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Označi kao primarnu\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Ponovno pošalji e-mail za potvrdu\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Ukloni\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Dodaj e-mail adresu\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Dodaj e-mail\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Da li zaista želite ukloniti e-mail adresu?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Primili ste ovaj e-mail jer ste vi ili netko drugi pokušali registrirati\\n\"\n\"račun koristeći e-mail adresu:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Međutim, račun s tom e-mail adresom već postoji. U slučaju da ste\\n\"\n\"to zaboravili, koristite postupak za zaboravljenu lozinku kako biste \"\n\"obnovili\\n\"\n\"svoj račun:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Račun već postoji\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Pozdrav od %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Hvala što koristite %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Primili ste ovaj e-mail jer je sljedeća promjena izvršena na vašem računu:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Ako ne prepoznajete ovu promjenu, odmah poduzmite odgovarajuće sigurnosne \"\n\"mjere. Promjena na vašem računu potječe od:\\n\"\n\"\\n\"\n\"- IP adresa: %(ip)s\\n\"\n\"- Preglednik: %(user_agent)s\\n\"\n\"- Datum: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Vaš e-mail je promijenjen s %(from_email)s na %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"E-mail promijenjen\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Vaš e-mail je potvrđen.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Potvrda e-maila\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Primili ste ovaj e-mail jer je korisnik %(user_display)s upisao vašu e-mail \"\n\"adresu za registraciju računa na %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Vaš kôd za potvrdu e-maila naveden je u nastavku. Molimo unesite ga u \"\n\"otvoreni prozor preglednika.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Za potvrdu da je ovo ispravno, idite na %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Potvrdite vašu e-mail adresu\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"E-mail adresa %(deleted_email)s je uklonjena s vašeg računa.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"E-mail uklonjen\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Vaš kôd za prijavu naveden je u nastavku. Molimo unesite ga u otvoreni \"\n\"prozor preglednika.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"Ovaj e-mail možete slobodno zanemariti ako niste pokrenuli ovu radnju.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Kôd za prijavu\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Vaša lozinka je promijenjena.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Lozinka promijenjena\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Vaš kôd za resetiranje lozinke naveden je u nastavku. Molimo unesite ga u \"\n\"otvoreni prozor preglednika.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Kôd za resetiranje lozinke\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Primili ste ovaj e-mail jer ste vi ili netko drugi zatražili resetiranje \"\n\"lozinke za vaš korisnički račun.\\n\"\n\"Ako niste zatražili resetiranje lozinke, slobodno zanemarite ovaj e-mail. \"\n\"Kliknite na link u nastavku za resetiranje lozinke.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Za slučaj da ste zaboravili, vaše korisničko ime je %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"E-mail za resetiranje lozinke\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Vaša lozinka je resetirana.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Vaša lozinka je postavljena.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Lozinka postavljena\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Primili ste ovaj e-mail jer ste vi ili netko drugi pokušali pristupiti \"\n\"računu s e-mail adresom %(email)s. Međutim, nemamo nikakav zapis o takvom \"\n\"računu u našoj bazi podataka.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Ako ste to bili vi, možete se registrirati za račun koristeći link u \"\n\"nastavku.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Nepoznati račun\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"E-mail adresa\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Trenutni e-mail\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Promjena u\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Vaša e-mail adresa još čeka potvrdu.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Otkaži promjenu\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Promijeni u\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Promijeni e-mail\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Potvrdite vašu e-mail adresu\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Molimo potvrdite da je <a href=\\\"mailto:%(email)s\\\">%(email)s</a> e-mail \"\n\"adresa za korisnika %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Nije moguće potvrditi %(email)s jer je već potvrđena od strane drugog računa.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Ovaj link za potvrdu e-maila je istekao ili je neispravan. Molimo <a \"\n\"href=\\\"%(email_url)s\\\">zatražite novu potvrdu e-mail adrese</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Ukoliko još niste napravili korisnički račun, prvo se \"\n\"%(link)sregistrirajte%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Prijavite se pristupnim ključem\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Pošaljite mi kôd za prijavu\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Odjava\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Jeste li sigurni da se želite odjaviti?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Nije moguće ukloniti vašu primarnu e-mail adresu %(email)s \"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"E-mail s linkom za potvrdu registracije je poslan na %(email)s\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Potvrdili ste e-mail adresu %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Uklonjena e-mail adresa %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Uspješno ste prijavljeni kao %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Uspješno ste se odjavili.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Kôd za prijavu je poslan na %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Lozinka je uspješno promijenjena.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Lozinka je uspješno postavljena.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Verifikacijski kôd je poslan na %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Potvrdili ste broj telefona %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Primarna e-mail adresa je postavljena\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Promjena lozinke\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Zaboravili ste lozinku?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Zaboravili ste lozinku? Unesite svoju e-mail adresu u nastavku i poslat ćemo \"\n\"vam e-mail s uputama za resetiranje.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Resetiraj moju lozinku\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"Molimo konktaktirajte nas ukoliko imate problema pri promjeni lozinke.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Poslali smo vam e-mail. Ako ga niste primili, provjerite mapu s neželjenom \"\n\"poštom. Kontaktirajte nas ako ga ne primite u roku od nekoliko minuta.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Neispravan token\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Link za poništavanje lozinke je nevažeći, vjerojatno jer je već bio \"\n\"korišten. Molimo vas ponovite zahtjev za <a href=\\\"%(passwd_reset_url)s\\\"> \"\n\"resetiranje lozinke</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Lozinka je uspješno promjenjena.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Postavljanje lozinke\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Promijeni telefon\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Trenutni telefon\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Vaš broj telefona još čeka potvrdu.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Promijeni telefon\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Unesite svoju lozinku:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Primit ćete poseban kôd za prijavu bez lozinke.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Zatraži kôd\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Ostale mogućnosti prijave\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Registracija\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Registracija\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Već imate korisnički račun? %(link)sPrijavite se%(end_link)s!\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Registrirajte se pristupnim ključem\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Registracija pristupnim ključem\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Ostale mogućnosti\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Prijave zatvorene\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Na žalost, registracija je privremeno nedostupna.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Napomena\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Već ste prijavljeni kao %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Pažnja:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Trenutno nemate postavljenu niti jednu e-mail adresu. Postavite e-mail \"\n\"adresu kako biste mogli primati obavijesti, promijeniti lozinku i slično.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Potvrdite vašu e-mail adresu\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Poslali smo vam e-mail u svrhu potvrde. Slijedite dani link za završetak \"\n\"postupka registracije. Ako ne vidite e-mail za potvrdu u glavnom sandučiću, \"\n\"provjerite mapu s neželjenom poštom. Molimo kontaktirajte nas ukoliko ne \"\n\"primite e-mail za potvrdu unutar sljedećih nekoliko minuta.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Ovaj dio web stranice zahtijeva da potvrdimo da ste\\n\"\n\"onaj za koga se predstavljate. Zbog toga je nužno da\\n\"\n\"potvrdite vlasništvo nad svojom e-mail adresom. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Poslali smo vam e-mail u svrhu\\n\"\n\"potvrde. Molimo kliknite na link unutar tog e-maila. Ako ne vidite e-mail za \"\n\"potvrdu u glavnom sandučiću, provjerite mapu s neželjenom poštom. U \"\n\"suprotnom\\n\"\n\"nas kontaktirajte ako ga ne primite unutar nekoliko minuta.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Napomena:</strong> još uvijek možete <a \"\n\"href=\\\"%(email_url)s\\\">promijeniti svoju e-mail adresu</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Poruke:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Izbornik:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Povezani računi\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Dvofaktorska autentifikacija\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sesije\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autoriziraj\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s želi pristupiti vašem %(site_name)s računu.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Unesite kôd uređaja\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Unesite kôd prikazan na vašem uređaju.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Nastavi\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Potvrdite uređaj\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Molimo potvrdite kôd prikazan na vašem %(client_name)s kako biste \"\n\"autorizirali ovaj uređaj.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Odbij\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Uređaj autoriziran\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Uspješno ste autorizirali svoj %(client_name)s uređaj.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Uređaj odbijen\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Autorizacija za vaš %(client_name)s uređaj je odbijena.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Greška\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Ostani prijavljen\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Vaš račun je zaštićen dvofaktorskom autentifikacijom. Molimo unesite kôd \"\n\"autentifikatora:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Generiran je novi skup kodova za oporavak dvofaktorske autentifikacije.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Generirani novi kodovi za oporavak\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Aplikacija za autentifikaciju aktivirana.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Aplikacija za autentifikaciju aktivirana\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Aplikacija za autentifikaciju deaktivirana.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Aplikacija za autentifikaciju deaktivirana\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Dodan je novi sigurnosni ključ.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Sigurnosni ključ dodan\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Sigurnosni ključ je uklonjen.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Sigurnosni ključ uklonjen\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Aplikacija za autentifikaciju\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Autentifikacija putem aplikacije za autentifikaciju je aktivna.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Aplikacija za autentifikaciju nije aktivna.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Deaktiviraj\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktiviraj\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Sigurnosni ključevi\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Dodali ste %(count)s sigurnosni ključ.\"\nmsgstr[1] \"Dodali ste %(count)s sigurnosna ključa.\"\nmsgstr[2] \"Dodali ste %(count)s sigurnosnih ključeva.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Nema dodanih sigurnosnih ključeva.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Upravljaj\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Dodaj\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Kodovi za oporavak\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"Dostupno je %(unused_count)s od %(total_count)s kodova za oporavak.\"\nmsgstr[1] \"Dostupna su %(unused_count)s od %(total_count)s kodova za oporavak.\"\nmsgstr[2] \"Dostupno je %(unused_count)s od %(total_count)s kodova za oporavak.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Nema postavljenih kodova za oporavak.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Pregledaj\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Preuzmi\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Generiraj\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Generiran je novi skup kodova za oporavak.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Sigurnosni ključ dodan.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Sigurnosni ključ uklonjen.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Unesite kôd autentifikatora:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Upravo ćete generirati novi skup kodova za oporavak za svoj račun.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Ova radnja će poništiti vaše postojeće kodove.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Jeste li sigurni?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Neiskorišteni kodovi\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Preuzmi kodove\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Generiraj nove kodove\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Aktiviraj aplikaciju za autentifikaciju\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Za zaštitu svog računa dvofaktorskom autentifikacijom, skenirajte QR kôd u \"\n\"nastavku svojom aplikacijom za autentifikaciju. Zatim unesite verifikacijski \"\n\"kôd koji je generirala aplikacija.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Tajna autentifikatora\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Možete pohraniti ovu tajnu i koristiti je za ponovnu instalaciju aplikacije \"\n\"za autentifikaciju kasnije.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Deaktiviraj aplikaciju za autentifikaciju\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Upravo ćete deaktivirati autentifikaciju putem aplikacije. Jeste li sigurni?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Vjerovati ovom pregledniku?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Ako odaberete da vjerujete ovom pregledniku, nećete biti upitani za \"\n\"verifikacijski kôd pri sljedećoj prijavi.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Vjeruj %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Ne vjeruj\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Dodaj sigurnosni ključ\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Ukloni sigurnosni ključ\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Jeste li sigurni da želite ukloniti ovaj sigurnosni ključ?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Uporaba\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Pristupni ključ\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Sigurnosni ključ\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Ovaj ključ ne pokazuje je li pristupni ključ.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Neodređeno\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Dodano %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Zadnje korišteno %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Uredi\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Uredi sigurnosni ključ\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Spremi\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Stvori pristupni ključ\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Upravo ćete stvoriti pristupni ključ za svoj račun. Budući da možete dodati \"\n\"dodatne ključeve kasnije, možete koristiti opisni naziv za razlikovanje \"\n\"ključeva.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Stvori\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Ova funkcionalnost zahtijeva JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Neuspjela prijava putem treće strane\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Došlo je do greške pri pokušaju prijave putem vašeg računa treće strane.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Možete se prijaviti u svoj račun koristeći jedan od sljedećih računa treće \"\n\"strane:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"\"\n\"Trenutno nemate niti jedan račun treće strane povezan s ovim korisničkim \"\n\"računom.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Dodaj račun treće strane\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Račun treće strane od %(provider)s je povezan s vašim računom.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Račun treće strane povezan\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"Račun treće strane od %(provider)s je odspojen od vašeg računa.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Račun treće strane odspojen\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Poveži %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Upravo ćete povezati novi račun treće strane od %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Prijavite se putem %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Upravo ćete se prijaviti koristeći račun treće strane od %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Prijava otkazana\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Odlučili ste da se ne želite prijaviti na našu stranicu koristeći jedan od \"\n\"vaših postojećih računa s društvenih mreža. Ako je to bila greška, molimo \"\n\"kliknite i <a href=\\\\\\\"%(login_url)s\\\\\\\">prijavite se</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Račun treće strane je povezan.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Račun treće strane je odspojen.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Odabrali ste da ćete koristiti vaš %(provider_name)s račun za prijavu u \"\n\"stranicu %(site_name)s. Kao posljednji korak, molimo vas ispunite sljedeći \"\n\"obrazac:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Ili koristite račun treće strane\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Odjavljeni ste iz svih ostalih sesija.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Započeto u\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP adresa\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Preglednik\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Zadnje viđeno u\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Trenutna\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Odjavi ostale sesije\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Korisničke sesije\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"ključ sesije\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Povezani računi\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Lozinka treba imati najmanje {0} znakova.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Pozdravi od %(site_name)s!\\n\"\n#~ \"\\n\"\n#~ \"Primili ste ovaj e-mail jer ste vi ili netko drugi zatražili lozinku za \"\n#~ \"vaš korisnički račun na %(site_domain)s.\\n\"\n#~ \"Ako niste zatražili resetiranje lozinke, slobodno zanemarite ovaj e-mail. \"\n#~ \"Kliknite na sljedeći link za resetiranje lozinke.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Slijedeće e-mail adrese su povezane sa vašim korisničkim računom\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Potvrdite vašu e-mail adresu\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Molimo prijavite se s jednim od vaših postojećih računa društvenih mreža \"\n#~ \"ili se %(link)sregistrirajte%(end_link)s za korisnički račun na \"\n#~ \"%(site_name)s i prijavite se.\"\n\n#~ msgid \"or\"\n#~ msgstr \"ili\"\n\n#~ msgid \"change password\"\n#~ msgstr \"promjena lozinke\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Prijava s OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"E-mail adresa je već registrirana s drugim korisničkim računom.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Poslali smo vam e-mail. Molimo kontaktirajte nas ako ga ne primite unutar \"\n#~ \"nekoliko sljedećih minuta.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"Korisničko ime i/ili zaporka nisu ispravni.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"Korisničko ime može sadržavati samo slova, brojeve i @/./+/-/_.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"\"\n#~ \"Korisničko ime je već zauzeto. Molimo izaberite drugo korisničko ime.\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"Potvrdili ste da je <a href=\\\\\\\"mailto:%(email)s\\\\\\\">%(email)s</a> e-mail \"\n#~ \"adresa za korisnika %(user_display)s.\"\n"
  },
  {
    "path": "allauth/locale/ht/LC_MESSAGES/django.po",
    "content": "# DJANGO-ALLAUTH.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the django-allauth package.\n#\n# Translators:\n# Jean Patrick Prenis <patrickprenice@gmail.com>, 2025.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: django-allauth\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-08-19 12:00+0000\\n\"\n\"Last-Translator: Jean Patrick Prenis <patrickprenice@gmail.com>\\n\"\n\"Language-Team: kreyòl ayisyen\\n\"\n\"Language: ht\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n > 1);\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Kont sa a pa aktif kounye a.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Ou pa ka retire adrès imel prensipal ou.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Adrès imel sa a deja asosye ak kont sa a.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Adrès imel la/oswa modpas ou mete a pa kòrèk.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Nimewo telefòn lan/oswa modpas ou mete a pa kòrèk.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Gen yon itilizatè ki deja anrejistre ak adrès imel sa a.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Tanpri antre modpas ou genyen kounye a.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Kòd la pa kòrèk.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Modpas pa kòrèk.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Kle a pa valab oswa li ekspire.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Koneksyon pa valab.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Kòd pou renityalizasyon modpas la pa t valab.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Ou pa ka ajoute plis pase %d adrès imel.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Gen yon itilizatè ki deja anrejistre ak nimewo telefòn sa a.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Twòp tantativ koneksyon ki echwe. Eseye ankò pita.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Adrès imel la pa asosye ak okenn kont itilizatè.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Nimewo telefòn nan pa asosye ak okenn kont itilizatè.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Fòk ou verifye adrès imel prensipal ou.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Non itilizatè sa a pa ka itilize. Tanpri chwazi yon lòt non.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Non itilizatè sa/oswa modpas ou mete a pa kòrèk.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Tanpri chwazi sèlman youn.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Nouvo valè a dwe diferan de sa ki egziste kounye a.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Pran pasyans, ou ap voye twòp demann.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Sèvi ak modpas ou\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Sèvi ak aplikasyon oswa kòd otantifikasyon\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Sèvi ak yon kle sekirite\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Makee {email} ou kòm verifye.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Echwe pou make {email} ou a kòm verifye.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Make adrès imel ou chwazi yo kòm verifye\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Kont yo\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"Imel\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Adrès imel\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Antre yon nimewo telefòn ansanm ak kòd peyi a (egzanp: +1 pou US).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefòn\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Ou dwe antre menm modpas la chak fwa.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Modpas\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Sonje mwen\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Non itilizatè\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Konekte\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Non itilizatè, imel oswa telefòn\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Non itilizatè oswa imel\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Non itilizatè oswa telefòn\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Imel oswa telefòn\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Bliye modpas ou?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"Imel (ankò)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Konfimasyon adrès imel\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"Imel (opsyonèl)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Non itilizatè (opsyonèl)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Ou dwe antre menm imel la chak fwa.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Modpas (ankò)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Modpas aktyèl\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Nouvo modpas\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Nouvo modpas (ankò)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kòd\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"itilizatè\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"adrès imel\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"verifye\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"prensipal\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"adrès imel yo\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"kreye\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"voye\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"kle\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"konfimasyon imel\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"konfimasyon imel yo\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Gade ID itilizatè ou\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Gade adrès imel ou\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Gade enfòmasyon debaz pwofil ou\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Bay otorizasyon\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"Karaktè wildcard yo pa otorize sof si 'Pèmèt URI wildcard' aktive.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' gen plis pase yon wildcard (*). Yon sèl wildcard pou chak URI \"\n\"otorize.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Wildcard yo otorize sèlman nan pati non lòt la nan URI a.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Kòd otorizasyon\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Kòd aparèy\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Idantifikasyon kliyan\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Token renouvle\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Konfidansyèl\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Piblik\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Domèn kliyan an gen dwa mande yo. Mete yon valè pa liy, egzanp: \"\n\"openid(ANTRE)profile(ANTRE)email(ANTRE)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Si kliyan an pa presize okenn domèn, sistèm nan ap itilize domèn sa yo pa \"\n\"default. Mete yon valè pa liy, egzanp: \"\n\"openid(ANTRE)profile(ANTRE)email(ANTRE)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Yon lis kalite otorizasyon ki pèmèt yo. Mete yon valè pa liy, egzanp: \"\n\"authorization_code(ANTRE)client_credentials(ANTRE)refresh_token(ANTRE)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"Yon lis sous ki otorize pou demann atravè orijin, youn pa liy.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Pèmèt wildcard (*) nan URI redireksyon ak orijin CORS. Lè li aktive, URI yo \"\n\"ka gen yon sèl asterisk pou matche ak sou-domèn.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Yon lis kalite repons ki pèmèt yo. Mete yon valè pa liy, egzanp: \"\n\"code(ANTRE)id_token token(ANTRE)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"kliyan\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"kliyan yo\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Ou pa ka ajoute yon adrès imel nan yon kont ki pwoteje ak otantifikasyon de \"\n\"etap.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Ou pa ka dezaktive otantifikasyon de etap.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Ou pa ka jenere kòd rekiperasyon san ou pa aktive otantifikasyon de etap.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Ou pa ka aktive otantifikasyon de etap jiskaske ou verifye adrès imel ou.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Kle prensipal\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Kle sovgad\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Kle nimewo {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Kòd rekiperasyon\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"Otantifikatè TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Kòd otantifikatè\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"San modpas\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Lè ou aktive koneksyon san modpas, ou ka konekte sèlman ak kle sa a, men sa \"\n\"mande kondisyon siplemantè tankou biyometrik oswa pwoteksyon PIN.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Gen yon kont ki deja egziste ak adrès imel sa a. Tanpri konekte sou kont sa \"\n\"a an premye, epi apre sa konekte kont %s ou a.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Token pa valab.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Kont ou a pa gen okenn modpas ki konfigire.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Kont ou a pa gen okenn adrès imel ki verifye.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Ou pa ka dekonekte dènye kont twazyèm pati ki rete a.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Kont twazyèm pati a deja konekte ak yon lòt kont.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Kont Sosyal yo\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"founisè\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ID founisè\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"non\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"id kliyan\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"ID aplikasyon oswa kle konsomatè\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"kle sekrè\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"Sekrè API, sekrè kliyan, oswa sekrè konsomatè\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Kle\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"aplikasyon sosyal\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"aplikasyon sosyal yo\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"dènye koneksyon\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"dat enskripsyon\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"done siplemantè\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"kont sosyal\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"kont sosyal yo\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) oswa token aksè (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"token sekrè\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) oswa token rafrechisman (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"ekspire nan\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"token aplikasyon sosyal\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"token aplikasyon sosyal yo\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Done pwofil pa valab\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Konekte\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Anile\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Repons pa valab pandan w t ap jwenn token demann nan nan \\\"%s\\\". Repons lan \"\n\"te: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Repons pa valab pandan w t ap jwenn token aksè nan \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Pa gen okenn token demann ki sove pou \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Pa gen okenn token aksè ki sove pou \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Pa gen aksè ak resous prive nan \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Repons pa valab pandan w t ap jwenn token demann nan nan \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Kont Inaktif\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Kont sa a inaktif.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Nou voye yon kòd bay %(recipient)s. Kòd la ap ekspire byento, tanpri antre \"\n\"li rapid.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Konfime\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Mande yon nouvo kòd\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Konfime Aksè\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Tanpri reotantifye pou pwoteje kont ou.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Opsyon altènatif\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Verifikasyon Imel\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Antre Kòd Verifikasyon Imel\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Itilize yon lòt adrès imel\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Konekte\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Antre Kòd Koneksyon\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Reyajiste Modpas\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Antre Kòd Reyajisteman Modpas\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Verifikasyon Telefòn\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Antre Kòd Verifikasyon Telefòn\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Itilize yon lòt nimewo telefòn\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Adrès Imel yo\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Adrès imel sa yo asosye ak kont ou:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Verifye\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Pa verifye\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Prensipal\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Fè Prensipal\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Re-voye Verifikasyon\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Retire\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Ajoute Adrès Imel\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Ajoute Imel\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Èske ou vrèman vle retire adrès imel ou chwazi a?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Ou resevwa imel sa a paske ou oswa yon lòt moun te eseye kreye yon kont ak \"\n\"adrès imel:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\" Men, gen deja yon kont ki egziste ak adrès imel sa a. Si ou bliye sa, \"\n\"tanpri sèvi ak pwosedi modpas bliye a pou rekipere kont ou:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Kont la Deja Egziste\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Bonjou soti nan %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Mèsi paske w ap itilize %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"Ou resevwa mesaj sa a paske gen yon chanjman ki fèt nan kont ou:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Si ou pa rekonèt chanjman sa a, tanpri pran prekosyon sekirite nesesè yo \"\n\"touswit. Chanjman nan kont ou a sòti nan:\\n\"\n\"\\n\"\n\"- Adrès IP: %(ip)s\\n\"\n\"- Navigatè: %(user_agent)s\\n\"\n\"- Dat: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Adrès imel ou te chanje soti nan %(from_email)s pou vin %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Imel Chanje\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Imel ou konfime.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Konfimasyon Imel\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Ou resevwa imel sa a paske itilizatè %(user_display)s te bay adrès imel ou \"\n\"pou anrejistre yon kont sou %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Kòd verifikasyon imel ou an ekri anba a. Tanpri antre li nan fenèt navigatè \"\n\"ki ouvè a.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Pou konfime sa, ale sou %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Tanpri Konfime Adrès Imel Ou\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"Adrès imel %(deleted_email)s te retire nan kont ou.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Imel Retire\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Kòd koneksyon ou an ekri anba a. Tanpri antre li nan fenèt navigatè ki ouvè \"\n\"a.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Ou ka inyore imel sa a san pwoblèm si se pa ou ki te inisye aksyon sa a.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Kòd Koneksyon\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Modpas ou chanje.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Modpas Chanje\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Kòd re-inisyalizasyon modpas ou an ekri anba a. Tanpri antre li nan fenèt \"\n\"navigatè ki ouvè a.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Kòd Reyinisyalize Modpas\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Ou resevwa imel sa a paske ou oswa yon lòt moun te mande yon \"\n\"reyinisyalizasyon modpas pou kont ou.\\n\"\n\"Ou ka inyore mesaj sa a si ou pa t fè demann sa a. Klike sou lyen ki anba a \"\n\"pou reyinisyalize modpas ou.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Si ou bliye, non itilizatè ou se %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Imel Reyinisyalizasyon Modpas\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Yo reyinisyalize modpas ou.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Modpas ou defini.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Modpas Mete\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Ou resevwa imel sa a paske ou oswa yon lòt moun te eseye konekte nan yon \"\n\"kont ak imel %(email)s. Men, nou pa gen okenn dosye ki koresponn ak kont sa \"\n\"a nan baz done nou an.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"Si se ou menm, ou ka kreye yon kont avèk lyen ki anba a.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Kont Enkonu\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Adrès Imèl\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Imèl aktyèl\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Chanje pou\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Adrès imèl ou a toujou ap tann verifikasyon.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Anile Chanjman\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Chanje pou\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Chanje Imèl\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Konfime Adrès Imèl\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Tanpri konfime ke <a href=\\\"mailto:%(email)s\\\">%(email)s</a> se yon adrès \"\n\"imèl pou itilizatè %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"Nou pa ka konfime %(email)s paske li deja konfime pa yon lòt kont.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Lyen konfimasyon imèl sa a ekspire oswa li pa valab. Tanpri <a \"\n\"href=\\\"%(email_url)s\\\">fè yon nouvo demann konfimasyon imèl</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Si ou poko kreye yon kont, tanpri %(link)senskri%(end_link)s an premye.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Konekte ak yon kle pas\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Voye yon kòd koneksyon ban mwen\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Dekonekte\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Èske ou sèten ou vle dekonekte?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Ou pa ka retire adrès imèl prensipal ou a (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Yon imèl konfimasyon te voye bay %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Ou konfime %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Adrès imèl %(email)s te retire.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Ou konekte avèk siksè kòm %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Ou dekonekte.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Yon kòd koneksyon te voye bay %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Modpas chanje avèk siksè.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Modpas mete avèk siksè.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Yon kòd verifikasyon te voye bay %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Ou verifye nimewo telefòn %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Adrès imel prensipal la mete.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Chanje modpas\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Ou bliye modpas ou?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Ou bliye modpas ou? Mete adrès imel ou anba a, n ap voye yon imel pou ou pou \"\n\"w ka rekipere l.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Reyajiste modpas mwen\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"Tanpri kontakte nou si w rankontre pwoblèm pou reyajiste modpas ou.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Nou voye yon imel pou ou. Si ou poko resevwa li, tanpri gade nan dosye spam \"\n\"ou. Sinon kontakte nou si ou poko jwenn li apre kèk minit.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Move kòd\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Lyèn pou reyajiste modpas la pa valab, petèt paske li te deja itilize. \"\n\"Tanpri mande yon <a href=\\\"%(passwd_reset_url)s\\\">nouvo reyajistreman \"\n\"modpas</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Modpas ou chanje kounye a.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Mete modpas\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Chanje nimewo\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Nimewo aktyèl\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Nimewo telefòn ou toujou ap tann verifikasyon.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Chanje nimewo\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Antre modpas ou:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Ou pral resevwa yon kòd espesyal pou konekte san modpas.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Mande kòd\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Lòt opsyon pou konekte\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Enskri\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Enskri\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Ou deja gen yon kont? Tanpri %(link)skonekte%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Enskri ak yon kle dijital\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Enskripsyon ak kle dijital\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Lòt opsyon\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Enskripsyon Fèmen\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Nou regrèt, men enskripsyon yo fèmen kounye a.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Nòt\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Ou deja konekte kòm %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Avètisman :\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Ou poko mete okenn adrès imel. Ou ta dwe ajoute yon adrès imel pou resevwa \"\n\"notifikasyon, rekipere modpas ou, elatriye.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Verifye Adrès Imèl Ou\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Nou voye yon imel pou verifye. Swiv lyen ki ladan pou finalize enskripsyon \"\n\"an. Si ou pa jwenn imel la nan bwat prensipal ou, gade nan dosye spam la. \"\n\"Tanpri kontakte nou si ou pa jwenn imel la nan kèk minit.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Pati sa a nan sit la mande pou nou verifye ke ou se moun ou di ou ye a. Pou \"\n\"rezon sa a, nou mande pou ou verifye ke adrès imel ou se pou ou.\"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Nou voye yon imel ba ou pou verifye. Tanpri klike sou lyen ki ladan imel sa \"\n\"a. Si ou pa wè li nan bwat prensipal ou, gade nan dosye spam la. Sinon, \"\n\"kontakte nou si ou pa jwenn li nan kèk minit.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Nòt :</strong> ou toujou ka <a href=\\\"%(email_url)s\\\">chanje adrès \"\n\"imel ou</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Mesaj :\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Meni :\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Koneksyon Kont\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Otentifikasyon De Faktè\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sesyon\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Otorize\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s vle jwenn aksè nan kont %(site_name)s ou.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Antre Kòd Aparèy la\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Antre kòd ki parèt sou aparèy ou a.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Kontinye\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Konfime Aparèy\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Tanpri konfime kòd ki montre sou %(client_name)s ou a pou otorize aparèy sa \"\n\"a.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Refize\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Aparèy Ototorize\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Ou fin otorize aparèy %(client_name)s ou a avèk siksè.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Aparèy Refize\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Otorizasyon pou aparèy %(client_name)s ou a te refize.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Erè\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Rete konekte\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Kont ou pwoteje ak otantifikasyon de-faktè. Tanpri antre yon kòd \"\n\"otantifikatè:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Yo fin kreye yon nouvo seri kòd rekiperasyon pou Otantifikasyon De-Faktè.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Nouvo Kòd Rekiperasyon Kreye\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Aplikasyon otantifikatè aktive.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Aplikasyon Otantifikatè Aktive\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Aplikasyon otantifikatè dezaktive.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Aplikasyon Otantifikatè Dezaktive\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Yo te ajoute yon nouvo kle sekirite.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Kle Sekirite Ajoute\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Yo te retire yon kle sekirite.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Kle Sekirite Retire\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Aplikasyon Otantifikatè\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Otantifikasyon ak yon aplikasyon otantifikatè aktive.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Pa gen aplikasyon otantifikatè ki aktive.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Dezaktive\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktive\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Kle Sekirite\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Ou te ajoute %(count)s kle sekirite.\"\nmsgstr[1] \"Ou te ajoute %(count)s kle sekirite.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Pa gen okenn kle sekirite ki te ajoute.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Jere\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Ajoute\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Kòd Rekiperasyon\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Gen %(unused_count)s sou %(total_count)s kòd rekiperasyon ki disponib.\"\nmsgstr[1] \"\"\n\"Gen %(unused_count)s sou %(total_count)s kòd rekiperasyon ki disponib.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Pa gen kòd rekiperasyon ki mete.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Gade\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Telechaje\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Jenere\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Yo te jenere yon nouvo seri kòd rekiperasyon.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Kle sekirite ajoute.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Kle sekirite retire.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Antre yon kòd otantifikatè:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Ou pral jenere yon nouvo seri kòd rekiperasyon pou kont ou.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Aksyon sa a ap fè kòd ou genyen yo vin pa valab.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Èske ou sèten?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Kòd ki poko itilize\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Telechaje kòd yo\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Jenere nouvo kòd\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Aktive Aplikasyon Otantifikatè\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Pou pwoteje kont ou ak otantifikasyon de-faktè, eskane kòd QR ki anba a ak \"\n\"aplikasyon otantifikatè ou. Apre sa, antre kòd verifikasyon aplikasyon an \"\n\"jenere a anba a.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Secrè otantifikatè\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Ou ka estoke sekrè sa a epi sèvi avè l pou re-enstale aplikasyon \"\n\"otantifikatè ou yon lòt lè.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Dezaktive Aplikasyon Otantifikatè\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Ou pral dezaktive otantifikasyon ki baze sou aplikasyon otantifikatè. Èske \"\n\"ou sèten?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Fè konfyans navigatè sa a?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Si ou chwazi fè konfyans navigatè sa a, yo pap mande ou yon kòd verifikasyon \"\n\"pwochen fwa ou konekte.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Fè konfyans pandan %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Pa Fè Konfyans\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Ajoute Kle Sekirite\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Retire Kle Sekirite\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Èske ou sèten ou vle retire kle sekirite sa a?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Itilizasyon\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Kle Pase\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Kle Sekirite\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Kle sa a pa endike si li se yon kle pase.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Pa Espesifye\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Ajoute nan %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Dènye itilizasyon %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Modifye\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Modifye Kle Sekirite\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Sove\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Kreye Kle Pase\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Ou pral kreye yon kle pase pou kont ou. Paske ou ka ajoute lòt kle pita, ou \"\n\"ka itilize yon non ki dekri yo pou distenge kle yo youn ak lòt.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Kreye\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Fonksyonalite sa a mande JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Echèk Koneksyon Twazyèm Pati\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Gen yon erè ki rive pandan wap eseye konekte ak kont twazyèm pati ou a.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Ou ka konekte nan kont ou a itilize nenpòt nan kont twazyèm pati ki anba yo:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Kounye a, ou pa gen okenn kont twazyèm pati konekte ak kont sa a.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Ajoute yon Kont Twazyèm Pati\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Yon kont twazyèm pati soti nan %(provider)s konekte ak kont ou a.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Kont Twazyèm Pati Konekte\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"Yon kont twazyèm pati soti nan %(provider)s dekonèkte soti nan kont ou a.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Kont Twazyèm Pati Dekonèkte\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Konekte %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Ou pral konekte yon nouvo kont twazyèm pati soti nan %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Konekte atravè %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Ou pral konekte itilize yon kont twazyèm pati soti nan %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Koneksyon Anile\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Ou deside anile koneksyon nan sit nou an itilize youn nan kont ou deja \"\n\"genyen yo. Si sa te yon erè, tanpri kontinye pou <a \"\n\"href=\\\"%(login_url)s\\\">konekte</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Kont twazyèm pati a konekte.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Kont twazyèm pati a dekonèkte.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Ou pral itilize kont %(provider_name)s ou a pou konekte nan\\n\"\n\"%(site_name)s. Kòm dènye etap, tanpri ranpli fòm sa a:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Oswa itilize yon twazyèm pati\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Dekonekte nan tout lòt sesyon yo.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Kòmanse Lè\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"Adrès IP\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Navigatè\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Dènye fwa wè nan\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Kouran\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Dekonekte Lòt Sesyon\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Sesyon Itilizatè\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"kle sesyon\"\n"
  },
  {
    "path": "allauth/locale/hu/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2024-04-20 21:45+0200\\n\"\n\"Last-Translator: Tamás Makó <tom@greenplug.hu>\\n\"\n\"Language-Team: \\n\"\n\"Language: hu\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Generator: Poedit 1.7.6\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"A felhasználó jelenleg nem aktív.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Az elsődleges email címed nem törölhető.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Ez az email cím már hozzá van rendelve ehhez a felhasználóhoz.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"A megadott email vagy a jelszó hibás.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Hibás az általad megadott telefonszám vagy jelszó.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Egy felhasználó már regisztrált ezzel az email címmel.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Kérlek add meg az aktuális jelszavadat!\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Hibás kód.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Hibás jelszó\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Érvénytelen vagy lejárt kulcs.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Érvénytelen belépési kísérlet.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"A jelszó visszaállító token érvénytelen.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Nem adhatsz hozzá több mint %d email címet.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Ezzel a telefonszámmal már van regisztrált felhasználó.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Túl sok sikertelen belépési kísérlet. Próbáld újra később.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Az email cím nincs hozzárendelve egyetlen felhasználóhoz sem\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"A telefonszám cím nincs hozzárendelve egyetlen felhasználóhoz sem\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Az elsődleges email címet ellenőriznunk kell.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Ez a felhasználói azonosító nem használható. Kérlek válassz másikat!\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"A megadott felhasználó vagy a jelszó hibás.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Kérlek csak egyet válassz!\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Az új értéknek különböznie kell a jelenlegitől.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Légy türelemmel, túl sok kérést küldtél.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Használd a jelszavadat\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Használj hitelesítő alkalmazást vagy kódot\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Használj biztonsági kulcsot\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} ellenőrzöttként megjelölve.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Nem sikerült {email}-t ellenőrzöttként megjelölni.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Kijelölt email címek megjelölése ellenőrzöttként\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Felhasználók\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"Email\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Email\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Adj meg egy telefonszámot az országkóddal együtt (pl. +36 ha Magyarország).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefonszám\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Ugyanazt a jelszót kell megadni mindannyiszor.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Jelszó\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Emlékezz rám\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Felhasználó azonosító\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Bejelentkezés\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Felhasználónév, email vagy telefonszám\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Felhasználónév vagy email\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Felhasználónév vagy telefonszám\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Email vagy telefonszám\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Elfelejtetted a jelszavad?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"Email (ismét)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Email cím megerősítése\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"Email (nem kötelező)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Felhasználónév (nem kötelező)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Mindig ugyanazt az email címet kell begépelned.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Jelszó (ismét)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Jelenlegi jelszó\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Új jelszó\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Új jelszó (ismét)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kód\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"felhasználó\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"email cím\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"megerősített\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"elsődleges\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"email címek\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"létrehozva\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"elküldve\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"kulcs\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"email megerősítés\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"email megerősítések\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Fej nélküli\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Felhasználói azonosító megtekintése\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Email cím megtekintése\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Alapvető profil információk megtekintése\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Engedélyek megadása\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"A helyettesítő karakterek nem engedélyezettek, hacsak nincs engedélyezve az \"\n\"'URI helyettesítő karakterek engedélyezése'.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"Az URI '{}' egynél több helyettesítő karaktert (*) tartalmaz. URI-nként csak \"\n\"egy helyettesítő karakter engedélyezett.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"\"\n\"Helyettesítő karakterek csak az URI gazdagépnév részében engedélyezettek.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Engedélyezési kód\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Készülék kód\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Kliens hitelesítő adatok\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Frissítési token\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Titkos\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Publikus\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"A kliens által kérhető hatókör(ök). Soronként egy értéket adjon meg, pl.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Ha a kliens nem ad meg hatókört, ezek az alapértelmezett hatókörök kerülnek \"\n\"alkalmazásra. Soronként egy értéket adjon meg, pl.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Az engedélyezett engedélytípusok listája. Soronként egy értéket adjon meg, \"\n\"pl.: authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Az engedélyezett források listája a cross-origin kérésekhez, soronként egy.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Helyettesítő karakterek (*) engedélyezése az átirányítási URI-kban és a CORS-\"\n\"forrásokban. Ha engedélyezve van, az URI-k egyetlen csillagot \"\n\"tartalmazhatnak az aldomének egyeztetéséhez.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"A megengedett válasz-típusok listája. Soronként egy érték, pl.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"kliens\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"kliensek\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Nem adhatsz email címet egy olyan fiókhoz, amit kétlépcsős azonosítás véd.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Nem kapcsolhatod ki a kétlépcsős azonosítást.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Nem generálhatsz helyreállítási kódokat anélkül, hogy a kétlépcsős \"\n\"azonosítás be lenne kapcsolva.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Nem aktiválhatod a kétlépcsős azonosítást addig, amíg nem igazolod az email \"\n\"címedet.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Fő kulcs\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Biztonsági kulcs\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Kulcs sz. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Helyreállítási kódok\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP hitelesítő\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Hitelesítő kód\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Jelszó nélküli\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"A jelszó nélküli működés engedélyezése lehetővé teszi, hogy csak ezzel a \"\n\"kulccsal jelentkezz be, de további követelményeket támaszt, mint a \"\n\"biometrikus vagy PIN védelem.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Ezzel az email címmel már van fiók létrehozva. Először jelentkezz be abba a \"\n\"fiókba, majd kapcsold össze a(z) %s fiókoddal.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Érvénytelen token.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"A fiókodhoz nincs beállítva jelszó.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"A fiókodhoz nem tartozik ellenőrzött email cím.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Nem választhatod le az utolsó megmaradt külső fiókodat.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Ez a külső fiók már egy másik fiókhoz van kapcsolva.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Közösségi Fiókok\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"szolgáltató\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"szolgáltató azonosítója\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"név\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"kliens azonosító\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"Alkalmazás azonosító, vagy fogyasztói kulcs\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"titkos kulcs\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API titkos kulcs, kliens titkos kulcs, vagy fogyasztói titkos kulcs\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Kulcs\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"közösségi alkalmazás\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"közösségi alkalmazások\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"utolsó belépés\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"csatlakozás dátuma\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"további adatok\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"közösségi fiók\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"közösségi fiókok\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) vagy hozzáférési token (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"titkos kulcs token\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) vagy frissítő token (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"lejárat ideje\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"közösségi alkalmazás token\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"közösségi alkalmazás tokenek\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Érvénytelen profil adatok\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Bejelentkezés\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Mégsem\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Érvénytelen válasz a hozzáférési kulcs lekérésekor innen: \\\"%s\\\". A válasz: \"\n\"%s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Érvénytelen válasz a hozzáférési token lekérésekor innen: \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Nincs mentett hozzáférési kulcs ehhez: \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Nincs mentett hozzáférési token ehhez: \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Nincs hozzáférés a privát adatokhoz itt: \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Érvénytelen válasz a hozzáférési kulcs lekérésekor innen: \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Inaktív fiók\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Ez a fiók inaktív.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Egy kódot küldtünk a(z) %(recipient)s címre. A kód csak rövid ideig \"\n\"érvényes, ezért kérlek, add meg minél előbb.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Megerősítés\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Új kód kérése\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Hozzáférés megerősítése\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Kérlek hitelesítsd magad újra, hogy megóvd a fiókodat.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Más lehetőségek\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Email ellenőrzése\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Add meg az email ellenőrző kódot\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Másik email cím használata\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Belépés\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Add meg a belépési kódot\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Jelszó visszaállítása\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Add meg a jelszó visszaállító kódot\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Telefonszám ellenőrzés\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Add meg a telefonszám ellenőrző kódot\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Másik telefonszám használata\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Email címek\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"A következő email címek vannak a fiókodhoz rendelve:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Ellenőrizve\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Nincs ellenőrizve\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Elsődleges\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Legyen elsődleges\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Ellenőrzés újraküldése\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Eltávolítás\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Email cím hozzáadása\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Email hozzáadása\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Valóban el akarod távolítani a kijelölt email címet?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Azért kaptad ezt az emailt, mert te (vagy valaki más) megpróbáltál \"\n\"regisztrálni egy fiókot a következő email címmel:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Azonban a megadott email címmel már létezik fiók. Amennyiben elfelejtetted a \"\n\"jelszavadat, kérjük használd a jelszó visszaállító funkciót a fiókod \"\n\"helyreállításához:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"A fiók már létezik\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Üdvözlet a(z) %(site_name)s-tól!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Köszönjük, hogy a(z) %(site_name)s-t használod!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Azért kapod ezt az emailt, mert a következő változtatás történt a fiókodban:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Ha nem ismersz rá erre a változtatásra, kérjük, azonnal tedd meg a megfelelő \"\n\"biztonsági óvintézkedéseket. A fiókod innen lett megváltoztatva:\\n\"\n\"\\n\"\n\"- IP cím: %(ip)s\\n\"\n\"- Böngésző: %(user_agent)s\\n\"\n\"- Dátum: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"\"\n\"Az email címed megváltozott a(z) %(from_email)s-ról a(z) %(to_email)s-ra.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Az email megváltozott\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Email címed megerősítve.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Email megerősítése\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Azért kaptad ezt az emailt, mert a(z) %(user_display)s felhasználó megadta \"\n\"az email címedet, hogy regisztráljon egy fiókot a(z) %(site_domain)s oldalon.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Az email ellenőrző kódod alább található. Kérlek add meg a nyitott \"\n\"böngészőablakban.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"A megerősítéshez menj erre a címre: %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Kérlek, erősítsd meg az email címedet\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"A(z) %(deleted_email)s email cím eltávolítva a fiókodból.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Email eltávolítva\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"A belépési kódod alább található. Kérlek add meg a nyitott böngészőablakban.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Ezt az emailt nyugodtan figyelmen kívül hagyhatod, ha nem te kezdeményezted \"\n\"ezt a műveletet.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Belépési kód\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"A jelszavad megváltozott.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Jelszó megváltozott\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"A jelszó visszaállító kódod alább található. Kérlek add meg a nyitott \"\n\"böngészőablakban.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Jelszó visszaállító kód\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Azért kaptad ezt az emailt, mert te (vagy valaki más) jelszó visszaállítást \"\n\"kértél a fiókodhoz.\\n\"\n\"Nyugodtan figyelmen kívül hagyhatod ezt a levelet, ha nem te kérted a jelszó \"\n\"visszaállítást. A jelszavad visszaállításához kattints az alábbi linkre.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Ha elfelejtetted volna, a felhasználóneved: %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Jelszó visszaállító email\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"A jelszavad visszaállítva.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"A jelszavad beállítva.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Jelszó beállítva\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Azért kapod ezt az emailt, mert te, vagy valaki más megpróbált hozzáférni \"\n\"a(z) %(email)s email címmel rendelkező fiókhoz. Azonban az adatbázisunkban \"\n\"nincs ilyen fiók.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"Ha te voltál, az alábbi linken regisztrálhatsz egy fiókot.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Ismeretlen fiók\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Email cím\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Jelenlegi email\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Változás erre:\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Az email címed még megerősítésre vár.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Változtatás visszavonása\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Változtatás erre:\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Email csere\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Email cím megerősítése\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Kérlek erősítsd meg, hogy a(z) <a href=\\\"mailto:%(email)s\\\">%(email)s</a> \"\n\"email cím a(z) %(user_display)s felhasználóhoz tartozik.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Nem lehet megerősíteni a(z) %(email)s-t, mert már egy másik fiók \"\n\"megerősítette.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Ez az email megerősítő link lejárt vagy érvénytelen. Kérlek <a \"\n\"href=\\\"%(email_url)s\\\">kérj egy új email megerősítő linket</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Ha még nem hoztál létre fiókot, akkor kérlek, először \"\n\"%(link)sregisztrálj%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Belépés passkey-jel\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Küldj nekem egy belépési kódot\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Kijelentkezés\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Biztosan kijelentkezel?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Az elsődleges email cím (%(email)s) nem törölhető.\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Megerősítő levelet küldtünk a(z) %(email)s címre.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"A(z) %(email)s cím visszaigazolása megtörtént.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"%(email)s email cím törölve.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Sikeres bejelentkezés, mint %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Sikeresen kijelentkeztél.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Egy belépési kód lett elküldve a(z) %(recipient)s címre.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Jelszó sikeresen megváltoztatva.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Jelszó sikeresen beállítva.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Ellenőrző kódot küldtünk a(z) %(phone)s telefonszámra.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Megerősítetted a(z) %(phone)s telefonszámot.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Elsődleges email cím beállítva.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Jelszócsere\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Elfelejtett jelszó?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Elfelejtetted a jelszavadat? Add meg az email címedet és küldünk egy linket, \"\n\"ahol új jelszót kérhetsz.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Új jelszó kérése\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Kérlek vedd fel velünk a kapcsolatot, ha problémád adódik a jelszó \"\n\"beállításával.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Elküldtük az ellenőrző emailt.\\n\"\n\"Ha nem találod a beérkezett levelek között, kérlek nézd meg a spam mappában \"\n\"is. Ellenkező esetben vedd fel velünk a kapcsolatot, ha pár percen belül nem \"\n\"kapod meg.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Hibás token\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"A új jelszó kérő link érvénytelen volt, vagy már fel lett használva. <a \"\n\"href=\\\"%(passwd_reset_url)s\\\">Itt tudsz újat kérni</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"A jelszavad megváltozott.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Jelszó beállítása\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Telefonszám csere\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Jelenlegi telefonszám\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"A telefonszámod még megerősítésre vár.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Telefonszám megváltoztatása\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Add meg a jelszavadat:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Egy speciális kódot fogsz kapni a jelszó nélküli belépéshez.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Kód kérése\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Egyéb belépési lehetőségek\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Regisztráció\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Regisztrálás\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Van már fiókod? Akkor kérlek %(link)slépj be%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Regisztráció passkey használatával\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Passkey regisztráció\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Egyéb lehetőségek\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Regisztráció lezárva\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Sajnáljuk, de jelenleg nem lehet regisztrálni.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Megjegyzés\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Már bejelentkeztél, mint %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Figyelem:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Jelenleg nem adtál meg egyetlen email címet sem. Nagyon fontos, hogy megadj \"\n\"egy email címet, mert csak így kaphatsz értesítéseket és csak így tudod a \"\n\"jelszavadat megváltoztatni.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Ellenőrizd az emailedet\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Elküldtük az ellenőrző emailt. A regisztráció befejezéséhez kövesd a benne \"\n\"található linket! Kérlek vedd fel velünk a kapcsolatot, ha az email pár \"\n\"percen belül nem érkezik meg!\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Az oldal ezen része megköveteli, hogy ellenőrizzük\\n\"\n\"a felhasználó azonosságát. Ezért most arra kérünk, \\n\"\n\"hogy erősítsd meg a hozzáférésedet az email címedhez. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Elküldtük az ellenőrző emailt.\\n\"\n\"Kérlek, kövesd a benne található linket! Ha nem találod a beérkezett levelek \"\n\"között, nézd meg a spam mappában is. Ellenkező esetben vedd fel velünk a \"\n\"kapcsolatot, ha pár percen belül nem kapod meg.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Megjegyzés:</strong> az email címet még mindig <a \"\n\"href=\\\"%(email_url)s\\\">meg tudod változtatni</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Üzenetek:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menü:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Egyéb felhasználói fiókok\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Kétlépcsős azonosítás\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Munkamenetek\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Engedélyezés\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"A(z) %(client_name)s hozzáférést kér a(z) %(site_name)s fiókodhoz.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Eszközkód megadása\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Add meg a készülékeden megjelenő kódot.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Folytatás\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Eszköz megerősítése\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Kérlek erősítsd meg a %(client_name)s-n megjelenő kódot, hogy engedélyezd \"\n\"ezt az eszközt.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Elutasítás\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Eszköz engedélyezve\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Sikeresen engedélyezted a(z) %(client_name)s eszközödet.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Eszköz elutasítva\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"A(z) %(client_name)s eszközöd engedélyezése elutasítva.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Hiba\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Bejelentkezve maradás\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"A fiókod kétlépcsős azonosítással védett. Kérlek add meg az azonosító kódot:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"Legeneráltuk az új kétlépcsős azonosító visszaállító kódokat.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Új visszaállító kódok legenerálva\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Azosító alkalmazás aktiválva.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Azonosító alkalmazás aktiválva\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Azosító alkalmazás deaktiválva.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Azonosító alkalmazás deaktiválva\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Egy új biztonsági kulcs lett hozzáadva.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Biztonsági kulcs hozzáadva\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Egy biztonsági kulcs el lett távolítva.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Biztonsági kulcs eltávolítva\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Azonosító alkalmazás\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Azonosítás azonosító alkalmazással aktív.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Azonosító alkalmazás nem aktív.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Kikapcsolás\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Bekapcsolás\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Biztonsági kulcsok\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Hozzáadtál %(count)s biztonsági kulcsot.\"\nmsgstr[1] \"Hozzáadtál %(count)s biztonsági kulcsot.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Nincs hozzáadott biztonsági kulcs.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Kezelés\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Hozzáadás\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Helyreállítási kódok\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"%(unused_count)s van, a rendelkezésre álló %(total_count)s helyreállítási \"\n\"kódból.\"\nmsgstr[1] \"\"\n\"%(unused_count)s van, a rendelkezésre álló %(total_count)s helyreállítási \"\n\"kódból.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Nincs beállított helyreállítási kód.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Megtekintés\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Letöltés\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Generálás\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Új helyreállítási kódok lettek generálva.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Biztonsági kulcs hozzáadva.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Biztonsági kulcs eltávolítva.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Add meg a hitelesítő kódot:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Új helyreállítási kódokat fogsz generálni a fiókodhoz.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Ez a művelet érvényteleníti a meglévő kódjaidat.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Biztos vagy benne?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Felhasználatlan kódok\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Kódok letöltése\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Új kódok generálása\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Hitelesítő alkalmazás bekapcsolása\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Ahhoz, hogy kétlépcsős azonosítással védd a fiókodat, olvasd be az alábbi QR \"\n\"kódot a hitelesítő alkalmazásoddal. Ezután add meg az alkalmazás által \"\n\"generált ellenőrző kódot.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Hitelesítő titkos kód\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Ezt a titkos kódot elmentheted, és később felhasználhatod a hitelesítő \"\n\"alkalmazás újra-telepítésére.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Hitelesítő alkalmazás kikapcsolása\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"A hitelesítő alkalmazáson alapuló azonosítás kikapcsolására készülsz. Biztos \"\n\"vagy benne?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Megbízol ebben a böngészőben?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Ha megbízol ebben a böngészőben, a következő belépéskor nem fogunk tőled \"\n\"ellenőrző kódot kérni.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Megbízok, a következő időtartamra: %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Nem bízok meg\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Biztonsági kulcs hozzáadása\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Biztonsági kulcs eltávolítása\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Biztos, hogy el akarod távolítani ezt a biztonsági kulcsot?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Használat\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Passkey\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Biztonsági kulcs\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Ez a kulcs nem jelzi, hogy passkey-e\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Nincs megadva\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Hozzáadva: %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Utoljára használva: %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Szerkesztés\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Biztonsági kulcs szerkesztése\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Mentés\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Passkey létrehozása\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Egy passkey-t fogsz létrehozni a fiókodhoz. Mivel később további kulcsokat \"\n\"is hozzáadhatsz, használj egy jól leíró nevet a kulcsok megkülönböztetéséhez.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Létrehozás\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Ez a funkció JavaScriptet igényel.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Külső szolgáltatónál történt bejelentkezési hiba\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"Hiba történt miközben megpróbáltál bejelentkezni a külső fiókoddal.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"Az alábbi külső fiókok bármelyikét használhatod a belépéshez:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Jelenleg nincs külső fiók kapcsolva ehhez a fiókhoz.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Külső fiók hozzáadása\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"\"\n\"Egy külső fiók a(z) %(provider)s szolgáltatótól lett kapcsolva a fiókodhoz.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Külső fiók hozzákapcsolva\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"Egy külső fiók a(z) %(provider)s szolgáltatótól lett leválasztva a fiókodról.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Külső fiók leválasztva\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Kapcsolódás a(z) %(provider)s-hoz\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Egy új %(provider)s fiókot fogsz hozzákapcsolni.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Bejelentkezés a(z) %(provider)s-on keresztül\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"A(z) %(provider)s szolgáltató külső fiókjával fogsz bejelentkezni.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Bejelentkezés megszakítva\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Úgy döntöttél, megszakítod a bejelentkezést az oldalunkra a meglévő fiókjaid \"\n\"egyikével. Ha ez nem volt szándékos, kérlek <a href=\\\"%(login_url)s\\\">lépj \"\n\"be</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Külső fiók hozzákapcsolva.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Külső fiók leválasztva.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"A(z) %(provider_name)s fiókodat fogod használni a(z) %(site_name)s oldalra \"\n\"való bejelentkezéshez.\\n\"\n\"Utolsó lépésként kérlek, töltsd ki az alábbi űrlapot:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Vagy használj egy külső szolgáltatót\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Kijelentkezve az összes többi munkamenetből.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Kezdés időpontja\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP cím\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Böngésző\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Utoljára ekkor volt aktív\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Jelenlegi\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Kijelentkezés a többi munkamenetből\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Felhasználói munkamenetek\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"munkamenet kulcs\"\n\n#~ msgid \"Account Connection\"\n#~ msgstr \"Egyéb felhasználói fiókok\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"A jelszónak minimum {0} hosszúnak kell lennnie.\"\n\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"A következő email címek tartoznak a felhasználódhoz:\"\n\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Email cím megváltoztatása\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Kérlek jelentkezz be\\n\"\n#~ \"az egyik felhasználóddal vagy %(link)sregisztrálj%(end_link)s\\n\"\n#~ \"új %(site_name)s felhasználót és használd azt:\"\n\n#~ msgid \"or\"\n#~ msgstr \"vagy\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"OpenID bejelentkezés\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Ez az email cím már hozzá van rendelve egy másik felhasználóhoz.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Elküldtük az emailt. Kérlek vedd fel velünk a kapcsolatot, ha nem kapod \"\n#~ \"meg perceken belül.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"A megadott bejelentkezési azonosító vagy a jelszó hibás.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"\"\n#~ \"A felhasználói azonosítók csak betűket, számokat és a @/./+/-/_ \"\n#~ \"karaktereket tartalmazhatnak.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"Ez a felhasználói azonosító már foglalt. Kérlek válassz másikat!\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"Sikeres visszaigazolás. A(z) <a href=\\\"mailto:%(email)s\\\">%(email)s</a> \"\n#~ \"email a(z) %(user_display)s felhasználóhoz tartozik.\"\n\n#~ msgid \"Thanks for using our site!\"\n#~ msgstr \"Köszönjük, hogy az oldalunkat használod!\"\n"
  },
  {
    "path": "allauth/locale/id/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-06-05 15:41+0000\\n\"\n\"Last-Translator: Nyong Onta 11 <nyongonta11@gmail.com>\\n\"\n\"Language-Team: Indonesian <https://hosted.weblate.org/projects/allauth/\"\n\"django-allauth/id/>\\n\"\n\"Language: id\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 5.12-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Akun ini sedang tidak aktif.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Anda tidak dapat menghapus alamat email utama Anda.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Alamat e-mail ini sudah terhubung dengan akun ini.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Alamat e-mail dan/atau kata sandi yang anda masukkan tidak benar.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Nomor ponsel dan/atau kata sandi yang anda masukkan tidak benar.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Seorang pengguna sudah terdaftar dengan alamat e-mail ini.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Silahkan ketik kata sandi Anda saat ini.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Kode salah.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Kata sandi salah.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Kunci tidak valid atau kedaluwarsa.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"login tidak valid.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Token untuk mengatur ulang kata sandi tidak valid.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Anda tidak dapat menambahkan lebih dari %d alamat e-mail.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Seorang pengguna sudah terdaftar dengan nomor telepon ini.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Terlalu banyak percobaan masuk yang gagal. Coba lagi nanti.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Alamat e-mail ini tidak terhubung dengan akun pengguna mana pun.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Nomor telepon ini tidak terhubung dengan akun pengguna mana pun.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Alamat e-mail utama Anda harus diverifikasi.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"Name pengguna tidak dapat digunakan. Silahkan gunakan nama pengguna lain.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Nama pengguna dan/atau kata sandi yang anda masukkan tidak benar.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Silakan pilih satu saja.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Nilai yang baru harus berbeda dari nilai saat ini.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Bersabarlah, Anda mengirim terlalu banyak permintaan.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Gunakan kata sandi Anda\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Gunakan aplikasi atau kode autentikator\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Gunakan kunci keamanan\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} ditandai sebagai terverifikasi.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Gagal menandai {email} sebagai terverifikasi.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Tandai alamat email yang dipilih sebagai terverifikasi\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Akun\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Alamat e-mail\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Masukkan nomor telepon termasuk kode negara (misalnya +1 untuk AS).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telepon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Anda harus mengetikkan kata sandi yang sama setiap kali.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Kata sandi\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Ingat Saya\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Nama pengguna\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Masuk\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Nama, email, atau ponsel\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Nama pengguna atau e-mail\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Nama pengguna atau ponsel\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-mail atau telepon\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Lupa kata sandi Anda?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-mail (lagi)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Konfirmasi alamat e-mail\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-mail (opsional)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Nama pengguna (opsional)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Anda harus mengetikkan e-mail yang sama setiap kali.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Kata sandi (lagi)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Kata sandi saat ini\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Kata sandi baru\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Kata sandi baru (lagi)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kode\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"pengguna\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"alamat e-mail\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"terverifikasi\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"utama\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"alamat e-mail\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"dibuat\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"dikirim\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"kunci\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"konfirmasi e-mail\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"konfirmasi e-mail\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Lihat ID pengguna Anda\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Lihat alamat email Anda\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Lihat informasi profil dasar Anda\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Berikan izin\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"Wildcard tidak diizinkan kecuali 'Izinkan wildcard URI' diaktifkan.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' mengandung lebih dari satu wildcard (*). Hanya satu wildcard per \"\n\"URI yang diizinkan.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Wildcard hanya diizinkan di bagian hostname URI.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Kode otorisasi\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Kode perangkat\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Kredensial klien\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Token penyegaran\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Rahasia\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Publik\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Cakupan yang diizinkan untuk diminta klien. Berikan satu nilai per baris, \"\n\"mis.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Jika klien tidak menentukan cakupan, cakupan default ini digunakan. Berikan \"\n\"satu nilai per baris, mis.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Daftar jenis grant yang diizinkan. Berikan satu nilai per baris, mis.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Daftar origin yang diizinkan untuk permintaan lintas origin, satu per baris.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Izinkan wildcard (*) di URI redirect dan asal CORS. Saat diaktifkan, URI \"\n\"dapat berisi satu tanda bintang untuk mencocokkan subdomain.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Daftar jenis respons yang diizinkan. Berikan satu nilai per baris, mis.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"klien\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"klien\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Anda tidak dapat menambahkan alamat email ke akun yang dilindungi oleh \"\n\"autentikasi dua faktor.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Anda tidak dapat menonaktifkan autentikasi dua faktor.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Anda tidak dapat membuat kode pemulihan tanpa mengaktifkan autentikasi dua \"\n\"faktor.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Anda tidak dapat mengaktifkan autentikasi dua faktor hingga Anda \"\n\"memverifikasi alamat email Anda.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Kunci utama\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Kunci cadangan\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Kunci no. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Kode pemulihan\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"Otentikator TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Kode autentikator\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Tanpa kata sandi\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Mengaktifkan operasi tanpa kata sandi memungkinkan Anda untuk masuk hanya \"\n\"dengan menggunakan kunci ini, tetapi memberlakukan persyaratan tambahan \"\n\"seperti perlindungan biometrik atau PIN.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Akun sudah ada dengan alamat email ini. Silakan masuk ke akun tersebut \"\n\"terlebih dahulu, lalu hubungkan akun %s Anda.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Token Salah.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Akun Anda tidak memiliki kata sandi.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Akun Anda tidak memiliki alamat e-mail yang terverifikasi.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Anda tidak dapat memutuskan akun pihak ketiga Anda yang terakhir.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Akun pihak ketiga sudah terhubung ke akun yang berbeda.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Akun Sosial\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"pemberi\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ID penyedia\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"nama\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"id klien\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"ID Aplikasi, atau kunci konsumen\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"kunci rahasia\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"Kunci API, kunci klien, atau kunci konsumen\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Kunci\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"aplikasi sosial\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"aplikasi sosial\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"masuk terakhir\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"tanggal bergabung\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"data tambahan\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"akun sosial\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"akun sosial\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) atau token akses (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"rahasia token\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) atau token refresh (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"kadaluarsa pada\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"token aplikasi sosial\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"token-token aplikasi sosial\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Data profil tidak valid\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Masuk\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Batal\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Respons tidak valid saat memperoleh token permintaan dari \\\"%s\\\". Responsnya \"\n\"adalah: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Respon tidak valid saat meminta token akses dari \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Tidak ada token request yang disimpan untuk \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Tidak ada token akses yang disimpan untuk \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Tidak ada akses ke sumber daya pribadi pada \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Respon tidak valid saat meminta token request dari \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Akun Tidak Aktif\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Akun ini tidak aktif.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Kami telah mengirimkan kode ke %(recipient)s. Kode tersebut akan segera \"\n\"kedaluwarsa, jadi harap segera masukkan.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Konfirmasi\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Minta kode baru\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Konfirmasi Akses\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Harap autentikasi ulang untuk menjaga keamanan akun Anda.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Pilihan alternatif\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Verifikasi E-mail\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Masukkan Kode Verifikasi E-mail\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Gunakan alamat e-mail yang berbeda\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Masuk\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Masukkan Kode Masuk\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Reset Kata Sandi\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Masukkan Kode Reset Kata Sandi\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Verifikasi Telepon\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Masukkan Kode Verifikasi Telepon\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Gunakan nomor ponsel berbeda\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Alamat E-mail\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Alamat-alamat e-mail berikut ini terkait dengan akun Anda:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Terverifikasi\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Tidak Terverifikasi\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Utama\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Jadikan Utama\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Kirim Ulang Verifikasi\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Hapus\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Tambahkan Alamat E-mail\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Tambahkan E-mail\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Apakah Anda benar-benar ingin menghapus alamat e-mail yang dipilih?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Anda menerima email ini karena Anda atau orang lain mencoba mendaftar akun \"\n\"menggunakan alamat email:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Namun, akun yang menggunakan alamat email tersebut sudah ada. Jika Anda lupa \"\n\"tentang hal ini, silakan gunakan prosedur lupa kata sandi untuk memulihkan \"\n\"akun Anda:\\n\"\n\"Akun kamu\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Akun Sudah Ada\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Halo dari %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Terima kasih telah menggunakan %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Anda menerima email ini karena perubahan berikut dilakukan pada akun Anda:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Jika Anda tidak mengenali perubahan ini, harap segera ambil tindakan \"\n\"pencegahan keamanan yang tepat. Perubahan pada akun Anda berasal dari:\\n\"\n\"\\n\"\n\"- Alamat IP: %(ip)s\\n\"\n\"- Peramban: %(user_agent)s\\n\"\n\"- Tanggal: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"E-mail Anda telah diubah dari %(from_email)s menjadi %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"E-mail Diubah\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"E-mail Anda telah dikonfirmasi.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Konfirmasi E-mail\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Anda menerima email ini karena pengguna %(user_display)s telah memberikan \"\n\"alamat email Anda untuk mendaftar akun di %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Kode verifikasi e-mail Anda tercantum di bawah ini. Silakan masukkan di \"\n\"jendela browser yang terbuka.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Untuk mengonfirmasi kebenarannya, kunjungi %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Mohon Konfirmasi Alamat E-mail Anda\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"Alamat e-mail %(deleted_email)s telah dihapus dari akun Anda.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"E-mail Dihapus\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Kode masuk Anda tercantum di bawah ini. Silakan masukkan di jendela browser \"\n\"yang terbuka.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Email ini dapat diabaikan dengan aman jika Anda tidak memulai tindakan ini.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Kode Masuk\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Kata sandi Anda telah diubah.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Kata Sandi Diubah\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Kode reset kata sandi Anda tercantum di bawah ini. Silakan masukkan di \"\n\"jendela browser yang terbuka.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Kode Reset Kata Sandi\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Anda menerima e-mail ini karena Anda atau orang lain telah meminta kata \"\n\"sandi untuk akun Anda.\\n\"\n\"Abaikan jika Anda tidak meminta reset kata sandi. Klik link di bawah untuk \"\n\"mereset kata sandi Anda.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Jikalau Anda lupa, nama pengguna Anda adalah %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"E-mail Reset Kata Sandi\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Kata sandi Anda telah direset.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Kata sandi Anda telah ditetapkan.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Kata Sandi Ditetapkan\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Anda menerima email ini karena Anda, atau orang lain, mencoba mengakses akun \"\n\"dengan email %(email)s. Namun, kami tidak memiliki catatan akun tersebut \"\n\"dalam basis data kami.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Jika itu Anda, Anda dapat mendaftar akun menggunakan tautan di bawah ini.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Akun Tidak Dikenal\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Alamat Email\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Email saat ini\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Mengubah ke\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Alamat email Anda masih menunggu verifikasi.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Batalkan Perubahan\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Ubah ke\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Ubah Email\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Konfirmasi Alamat E-mail\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Mohon konfirmasi bahwa <a href=\\\"mailto:%(email)s\\\">%(email)s</a> adalah \"\n\"alamat e-mail untuk pengguna %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Tidak dapat mengonfirmasi %(email)s karena sudah dikonfirmasi oleh akun lain.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Tautan konfirmasi e-mail ini sudah kedaluwarsa atau tidak valid. Silakan <a \"\n\"href=\\\"%(email_url)s\\\">kirimkan permintaan konfirmasi e-mail baru</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Jika Anda belum membuat akun, mohon %(link)sdaftar%(end_link)s terlebih \"\n\"dahulu.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Masuk dengan passkey\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Kirim kode masuk kepada saya\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Keluar\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Anda yakin ingin keluar?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Anda tidak dapat menghapus alamat e-mail utama Anda (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"E-mail konfirmasi dikirim ke %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Anda telah mengkonfirmasi %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Alamat e-mail %(email)s telah dihapus.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Berhasil masuk sebagai %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Anda telah keluar.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Kode masuk telah dikirim ke %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Kata sandi berhasil diubah.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Kata sandi berhasil setel.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Kode verifikasi telah dikirim ke %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Anda telah memverifikasi nomor telepon %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Alamat e-mail utama telah disetel.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Ubah Kata Sandi\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Lupa Kata Sandi?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Lupa kata sandi Anda? Masukkan alamat email Anda di bawah, dan kami akan \"\n\"mengirimkan email yang memungkinkan Anda untuk meresetnya.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Reset Kata Sandi Saya\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Mohon hubungi kami jika Anda mengalami masalah saat mengubah kata sandi Anda.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Kami telah mengirimkan email kepada Anda. Jika Anda belum menerimanya, \"\n\"silakan periksa folder spam Anda. Jika tidak, hubungi kami jika Anda tidak \"\n\"menerimanya dalam beberapa menit.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Token Salah\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Link reset kata sandi tidak valid, mungkin karena telah digunakan.  Silakan \"\n\"minta <a href=\\\"%(passwd_reset_url)s\\\">reset kata sandi baru</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Kata sandi Anda telah diubah.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Setel Kata Sandi\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Ubah Telepon\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Telepon saat ini\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Nomor telepon Anda masih menunggu verifikasi.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Ubah Telepon\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Masukkan kata sandi Anda:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Anda akan menerima kode khusus untuk masuk tanpa kata sandi.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Minta Kode\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Pilihan masuk lainnya\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Daftar\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Daftar\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Sudah memiliki akun? Silakan %(link)smasuk%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Daftar menggunakan passkey\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Daftar dengan Passkey\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Pilihan lainnya\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Daftar Ditutup\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Mohon maaf, tapi pendaftaran saat ini ditutup.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Catatan\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Anda sudah masuk sebagai %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Peringatan:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Anda saat ini tidak memiliki alamat e-mail yang disetel. Anda sebaiknya \"\n\"menambahkan alamat e-mail agar dapat menerima notifikasi, mereset kata \"\n\"sandi, dll.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Verifikasi Alamat E-mail Anda\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Kami telah mengirimkan e-mail kepada Anda untuk verifikasi. Ikuti tautan \"\n\"yang disediakan untuk menyelesaikan proses pendaftaran. Jika Anda tidak \"\n\"melihat e-mail verifikasi di kotak masuk utama, periksa folder spam Anda. \"\n\"Silakan hubungi kami jika Anda tidak menerima e-mail verifikasi dalam \"\n\"beberapa menit.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Bagian dari situs ini mengharuskan kami untuk memverifikasi bahwa\\n\"\n\"Anda adalah orang yang Anda klaim. Untuk tujuan ini, kami mengharuskan Anda\\n\"\n\"memverifikasi kepemilikan alamat e-mail Anda. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Kami telah mengirimkan e-mail kepada Anda untuk\\n\"\n\"verifikasi. Silakan klik tautan di dalam e-mail tersebut. Jika Anda tidak \"\n\"melihat e-mail verifikasi di kotak masuk utama, periksa folder spam Anda. \"\n\"Jika tidak,\\n\"\n\"hubungi kami jika Anda tidak menerimanya dalam beberapa menit.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Catatan:</strong> Anda masih bisa <a href=\\\"%(email_url)s\\\">mengubah \"\n\"alamat e-mail Anda</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Pesan:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menu:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Koneksi Akun\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Autentikasi Dua Faktor\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sesi\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Otorisasi\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s ingin mengakses akun %(site_name)s Anda.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Masukkan Kode Perangkat\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Masukkan kode yang ditampilkan di perangkat Anda.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Lanjutkan\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Konfirmasi Perangkat\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Silakan konfirmasi kode yang ditampilkan pada %(client_name)s Anda untuk \"\n\"mengotorisasi perangkat ini.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Tolak\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Perangkat Terotorisasi\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Anda berhasil mengotorisasi perangkat %(client_name)s Anda.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Perangkat Ditolak\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Otorisasi untuk perangkat %(client_name)s Anda telah ditolak.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Kesalahan\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Tetap Masuk\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Akun Anda dilindungi oleh autentikasi dua faktor. Silakan masukkan kode \"\n\"autentikator:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"Satu set kode pemulihan Autentikasi Dua Faktor yang baru telah dibuat.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Kode Pemulihan Baru Dibuat\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Aplikasi autentikator diaktifkan.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Aplikasi Autentikator Diaktifkan\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Aplikasi autentikator dinonaktifkan.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Aplikasi Autentikator Dinonaktifkan\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Kunci keamanan baru telah ditambahkan.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Kunci Keamanan Ditambahkan\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Kunci keamanan telah dihapus.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Kunci Keamanan Dihapus\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Aplikasi Autentikator\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Autentikasi menggunakan aplikasi autentikator sedang aktif.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Aplikasi autentikator tidak aktif.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Nonaktifkan\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktifkan\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Kunci Keamanan\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Anda telah menambahkan %(count)s kunci keamanan.\"\nmsgstr[1] \"Anda telah menambahkan %(count)s kunci keamanan.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Belum ada kunci keamanan yang ditambahkan.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Kelola\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Tambah\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Kode Pemulihan\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Ada %(unused_count)s dari %(total_count)s kode pemulihan yang tersedia.\"\nmsgstr[1] \"\"\n\"Ada %(unused_count)s dari %(total_count)s kode pemulihan yang tersedia.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Belum ada kode pemulihan yang disiapkan.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Lihat\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Unduh\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Buat\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Satu set kode pemulihan baru telah dibuat.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Kunci keamanan ditambahkan.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Kunci keamanan dihapus.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Masukkan kode autentikator:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Anda akan membuat satu set kode pemulihan baru untuk akun Anda.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Tindakan ini akan membatalkan kode Anda yang sudah ada.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Apakah Anda yakin?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Kode yang belum digunakan\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Unduh kode\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Buat kode baru\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Aktifkan Aplikasi Autentikator\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Untuk melindungi akun Anda dengan autentikasi dua faktor, pindai kode QR di \"\n\"bawah ini dengan aplikasi autentikator Anda. Kemudian, masukkan kode \"\n\"verifikasi yang dihasilkan oleh aplikasi di bawah ini.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Rahasia autentikator\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Anda dapat menyimpan rahasia ini dan menggunakannya untuk menginstal ulang \"\n\"aplikasi autentikator Anda di lain waktu.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Nonaktifkan Aplikasi Autentikator\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Anda akan menonaktifkan autentikasi berbasis aplikasi autentikator. Apakah \"\n\"Anda yakin?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Percayai Browser Ini?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Jika Anda memilih untuk mempercayai browser ini, Anda tidak akan diminta \"\n\"kode verifikasi saat masuk berikutnya.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Percayai selama %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Jangan Percaya\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Tambahkan Kunci Keamanan\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Hapus Kunci Keamanan\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Apakah Anda yakin ingin menghapus kunci keamanan ini?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Penggunaan\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Passkey\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Kunci keamanan\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Kunci ini tidak menunjukkan apakah itu merupakan passkey.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Tidak ditentukan\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Ditambahkan pada %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Terakhir digunakan %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Edit\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Edit Kunci Keamanan\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Simpan\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Buat Passkey\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Anda akan membuat passkey untuk akun Anda. Karena Anda dapat menambahkan \"\n\"kunci tambahan nanti, Anda dapat menggunakan nama deskriptif untuk \"\n\"membedakan kunci.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Buat\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Fungsi ini memerlukan JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Kegagalan Login Pihak Ketiga\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Terjadi kesalahan saat mencoba masuk menggunakan akun pihak ketiga Anda.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Anda dapat masuk ke akun Anda menggunakan salah satu akun pihak ketiga \"\n\"berikut:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"\"\n\"Anda saat ini tidak memiliki akun pihak ketiga yang terhubung ke akun ini.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Tambahkan Akun Pihak Ketiga\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Akun pihak ketiga dari %(provider)s telah terhubung ke akun Anda.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Akun Pihak Ketiga Terhubung\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"Akun pihak ketiga dari %(provider)s telah terputus dari akun Anda.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Akun Pihak Ketiga Terputus\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Hubungkan %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Anda akan menghubungkan akun pihak ketiga baru dari %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Masuk Melalui %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Anda akan masuk menggunakan akun pihak ketiga dari %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Login Dibatalkan\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Anda memutuskan untuk membatalkan masuk ke situs kami menggunakan salah satu \"\n\"dari akun Anda. Jika ini adalah kesalahan, silakan lanjutkan ke <a \"\n\"href=\\\"%(login_url)s\\\">masuk</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Akun pihak ketiga telah terhubung.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Akun pihak ketiga telah terputus.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Anda akan menggunakan akun %(provider_name)s untuk masuk ke\\n\"\n\"%(site_name)s. Sebagai langkah akhir, silakan lengkapi formulir berikut:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Atau gunakan pihak ketiga\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Keluar dari semua sesi lainnya.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Dimulai Pada\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"Alamat IP\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Browser\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Terakhir terlihat pada\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Saat ini\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Keluar dari Sesi Lainnya\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Sesi Pengguna\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"kunci sesi\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Koneksi Akun\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Kata sandi harus memiliki panjang minimal {0} karakter.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Anda menerima e-mail ini karena Anda atau orang lain telah meminta kata \"\n#~ \"sandi untuk akun Anda.\\n\"\n#~ \"Abaikan jika Anda tidak meminta reset kata sandi. Klik link di bawah \"\n#~ \"untuk mereset kata sandi Anda.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Alamat-alamat e-mail berikut ini terkait dengan akun Anda:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Konfirmasi Alamat E-mail\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Mohon masuk dengan salah satu\\n\"\n#~ \"dari akun pihak ketiga Anda. Atau, %(link)sdaftar%(end_link)s\\n\"\n#~ \"untuk akun %(site_name)s dan masuk di bawah:\"\n\n#~ msgid \"or\"\n#~ msgstr \"atau\"\n\n#~ msgid \"change password\"\n#~ msgstr \"ubah kata sandi\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Masuk Dengan OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Alamat e-mail ini sudah terhubung dengan akun lain.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Kami telah mengirimkan e-mail. Mohon hubungi kami jika Anda tidak \"\n#~ \"menerimanya dalam beberapa menit.\"\n"
  },
  {
    "path": "allauth/locale/it/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# Translators:\n# guglielmo <guglielmo.celata@gmail.com>, 2014\n# joke2k <joke2k@gmail.com>, 2014\n# puntosit <lowenberger@gmail.com>, 2014\n# Sandro <sandro@e-den.it>, 2019.\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: django-allauth\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-12-20 19:00+0000\\n\"\n\"Last-Translator: Gabriele-V <gabriele-v@users.noreply.hosted.weblate.org>\\n\"\n\"Language-Team: Italian <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/it/>\\n\"\n\"Language: it\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 5.15.1\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Questo account non è attualmente attivo.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Non puoi eliminare il tuo indirizzo email principale.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Questo indirizzo email è già associato a questo account.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"L'indirizzo email e/o la password che hai usato non sono corretti.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Il numero di telefono e/o la password specificati non sono corretti.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Un utente è già registrato con questo indirizzo email.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Inserisci la tua password attuale.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Codice errato.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Password errata.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Chiave non valida o scaduta.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Accesso non valido.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Il codice per il reset della password non è valido.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Non puoi aggiungere più di %d indirizzi email.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Un altro utente si è già registrato con questo numero di telefono.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Troppi tentativi di accesso. Riprova più tardi.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"L'indirizzo email non è assegnato a nessun account utente.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Il numero di telefono non è associato a nessun account utente.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Il tuo indirizzo email principale deve essere verificato.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Questo username non può essere usato. Per favore scegline un altro.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Lo username e/o la password che hai usato non sono corretti.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Selezionare una sola opzione.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Il nuovo valore deve essere diverso da quello attuale.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Abbi pazienza, stai inviando troppe richieste.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Usa la tua password\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Usa l'app di autenticazione o un codice\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Usa una chiave di sicurezza\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Contrassegna {email} come verificato.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Impossibile contrassegnare {email} come verificato.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Contrassegna gli indirizzi email selezionati come verificati\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Accounts\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"email\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Indirizzo email\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Inserisci un numero di telefono comprensivo di prefisso internazionale (es. \"\n\"+39 per l'Italia).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefono\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Devi digitare la stessa password.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Password\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Ricordami\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Username\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Nome utente, email o numero di telefono\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Username o email\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Nome utente o numero di telefono\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Email o numero di telefono\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Password dimenticata?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"email (di nuovo)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Conferma dell'indirizzo email\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"email (opzionale)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Nome utente (opzionale)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Devi digitare la stessa password ogni volta.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Password (nuovamente)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Password attuale\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Nuova password\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Nuova password (nuovamente)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Codice\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"utente\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"indirizzo email\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"verificato\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"primario\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"indirizzi email\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"creato\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"inviato\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"chiave\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"email di conferma\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"email di conferma\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Visualizza il tuo ID utente\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Visualizza il tuo indirizzo email\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Visualizza le informazioni di base del tuo profilo\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Concedi autorizzazioni\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"I caratteri jolly non sono consentiti a meno che non sia abilitata l'opzione \"\n\"'Consenti caratteri jolly negli URI'.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"L'URI '{}' contiene più di un carattere jolly (*). È consentito un solo \"\n\"carattere jolly per URI.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"\"\n\"I caratteri jolly sono consentiti solo nella parte del nome host dell'URI.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Codice di autorizzazione\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Codice dispositivo\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Credenziali client\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Aggiorna token\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Confidenziale\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Pubblico\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Gli ambiti che il client è autorizzato a richiedere. Fornire un valore per \"\n\"riga, ad esempio: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Se il client non specifica alcun ambito, vengono utilizzati questi ambiti \"\n\"predefiniti. Fornire un valore per riga, ad esempio: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Elenco dei tipi di autorizzazione consentiti. Fornire un valore per riga, ad \"\n\"esempio: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Elenco delle origini consentite per le richieste cross-origin, una per riga.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Consenti caratteri jolly (*) negli URI di reindirizzamento e nelle origini \"\n\"CORS. Quando abilitato, gli URI possono contenere un singolo asterisco per \"\n\"corrispondere ai sottodomini.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Elenco dei tipi di risposta consentiti. Fornire un valore per riga, ad \"\n\"esempio: code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"client\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"clients\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Non è possibile aggiungere un indirizzo email a un account protetto da \"\n\"autenticazione a due fattori.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Non è possibile disattivare l'autenticazione a due fattori.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Non è possibile creare dei codici di recuperazione senza avere attivato \"\n\"l'autenticazione a due fattori.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Non è possibile attivare l'autenticazione a due fattori fino a quando non \"\n\"hai verificato il tuo indirizzo email.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Chiave principale\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Chiave di backup\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Chiave numero {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Codici di recupero\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"Autenticatore TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Codice autenticatore\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Senza password\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"L'abilitazione dell'operazione senza password ti consente di accedere \"\n\"utilizzando solo questa chiave, ma impone requisiti aggiuntivi come l'uso di \"\n\"dati biometrici o la protezione tramite PIN.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Esiste già un account con questo indirizzo email. Per favore entra con \"\n\"quell'account, e successivamente connetti il tuo account %s.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Token non valido.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Il tuo account non ha ancora nessuna password.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Il tuo account non ha un indirizzo email verificato.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"\"\n\"Non puoi scollegare il tuo ultimo servizio di autenticazione Social Network.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"L'account di terze parti è già collegato a un altro account.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Account\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"provider\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ID del Provider\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"nome\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"Id cliente\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"App ID, o consumer key\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"chiave segreta\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"Segreto API, segreto del cliente, or segreto del consumatore\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Chiave\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"applicazione sociale\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"applicazioni sociali\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"Ultimo accesso\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"data iscrizione\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"dati aggiuntivi\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"account sociale\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"account sociali\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) o token di accesso (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"token segreto\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) o token di aggiornamento (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"scade il\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"token dell'applicazione social\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"token dell'applicazione social\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Dati profilo non validi\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Annulla\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Risposta non valida durante l'ottenimento del token di richiesta da \\\\\\\"%s\\\\\"\n\"\\\". La risposta è stata: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Risposta non valida alla richiesta di un token da \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Nessuna richiesta di token salvata per \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Nessun token di accesso salvato per \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Nessuna accesso alle risorse private a \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Risposta non valida alla richiesta di un token da \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Account non attivo\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Questo account non è attivo.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Abbiamo inviato un codice a %(recipient)s. Il codice scadrà a breve, quindi \"\n\"inseriscilo al più presto.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Conferma\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Richiedi nuovo codice\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Conferma l'accesso\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Si prega di rieseguire l'autenticazione per proteggere il tuo account.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Opzioni alternative\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Verifica Email\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Inserisci il codice di verifica email\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Utilizza un indirizzo email differente\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Accedi\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Inserisci il codice di accesso\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Reimpostazione password\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Inserisci il codice di reimpostazione della password\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Verifica del Numero di Telefono\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Inserisci il Codice di Verifica del Telefono\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Utilizza un numero di telefono diverso\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Indirizzi email\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"I seguenti indirizzi email sono associati al tuo account:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Verificato\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Non verificato\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Principale\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Rendi Principale\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Re-invia la Verifica\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Rimuovi\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Aggiungi un indirizzo email\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Aggiungi email\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Sei sicuro di voler rimuovere l'indirizzo email selezionato?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Stai ricevendo questa email perché tu o qualcun altro\\n\"\n\"avete tentato di registrare un account utilizzando l'indirizzo email:  \\n\"\n\"\\n\"\n\"%(email)s  \\n\"\n\"\\n\"\n\"Tuttavia, esiste già un account associato a questo indirizzo email.  Se lo \"\n\"hai dimenticato,\\n\"\n\"utilizza la procedura di recupero password\\n\"\n\"per recuperare il tuo account:  \\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"L'account esiste già\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Ciao da %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Grazie per usare %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Stai ricevendo questa email perché è stata apportata la seguente modifica al \"\n\"tuo account:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Se non riconosci questa modifica, adotta immediatamente le opportune misure \"\n\"di sicurezza. La modifica al tuo account proviene da:\\n\"\n\"\\n\"\n\"- Indirizzo IP: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Data: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"La tua email è stata cambiata da %(from_email)s a %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Email modificata\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"La tua mail è stata confermata.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Manda una conferma\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Hai ricevuto questa email perché l'utente %(user_display)s ha fornito il tuo \"\n\"indirizzo email per registrare un account su %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Il tuo codice di verifica email è riportato di seguito. Inseriscilo nella \"\n\"finestra del browser aperta.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Per confermare che sia corretto, vai su %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Conferma il tuo indirizzo email\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"L'indirizzo email %(deleted_email)s è stato rimosso dal tuo account.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Email rimossa\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Il tuo codice di accesso è riportato di seguito. Inseriscilo nella finestra \"\n\"del browser aperta.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Puoi ignorare questa email in sicurezza se non hai avviato questa azione.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Codice di connessione\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"La tua password è stata cambiata.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Password cambiata\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Il tuo codice di reimpostazione della password è riportato di seguito. \"\n\"Inseriscilo nella finestra del browser aperta.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Codice di reimpostazione della password\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Hai ricevuto questa mail perché hai richiesto la password per il tuo account \"\n\"utente.\\n\"\n\"Se non hai richiesto tu il reset della password, ignora questa mail, \"\n\"altrimenti clicca sul link qui sotto per fare il reset della password.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Nel caso tu lo abbia dimenticato, il tuo nome utente è %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Email per reimpostare la password\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"La tua password è stata reimposta.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Password impostata.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Imposta la Password\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Stai ricevendo questa email perché tu, o qualcun altro, ha tentato di \"\n\"accedere a un account con l'email %(email)s. Tuttavia, non abbiamo alcun \"\n\"record di un account con questa email nel nostro database.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Se sei stato tu, puoi registrarti per un account utilizzando il link qui \"\n\"sotto.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Account sconosciuto\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Indirizzo email\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Email attuale\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Passare a\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"La tua email è ancora in attesa di verifica.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Annulla Modifica\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Passa a\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Cambia Email\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Conferma l'indirizzo email\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Conferma che <a href=\\\"mailto:%(email)s\\\">%(email)s</a> è un indirizzo email \"\n\"per l'utente %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Impossibile confermare %(email)s perché è già stata confermata da un account \"\n\"diverso.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Questo link di conferma email è scaduto o non è valido. Ti chiediamo di <a \"\n\"href=\\\"%(email_url)s\\\">ripetere la richiesta di conferma via email</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"Se non hai ancora creato un account, %(link)sRegistrati%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Accedi con una passkey\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Inviami un codice di accesso\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Disconnetti\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Sei sicuro di volerti disconnettere?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Non puoi eliminare il tuo indirizzo email principale (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Email di conferma inviata a %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Hai appena confermato l’indirizzo email %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Indirizzo email %(email)s rimosso.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Ti sei collegato con successo come %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Ti sei scollegato.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Un codice di accesso è stato inviato a %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Password cambiata con successo.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Password impostata correttamente.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Un codice di verifica è stato inviato a %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Hai verificato il numero di telefono %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Indirizzo email principale impostato.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Cambia la tua Password\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Password dimenticata?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Hai dimenticato la tua password? Inserisci qui sotto il tuo indirizzo email, \"\n\"ti invieremo una mail con un link per reimpostarla.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Reimposta la mia password\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"Se hai qualche problema a reimpostare la password, contattaci.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Ti abbiamo inviato un'email. Se non l'hai ricevuta, controlla la cartella \"\n\"dello spam. In caso contrario, contattaci se non la ricevi entro pochi \"\n\"minuti.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Token non valido\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Il link di reimpostazione della password non è valido, probabilmente è già \"\n\"stato usato. Inoltra una <a href=\\\"%(passwd_reset_url)s\\\">nuova richiesta di \"\n\"reimpostazione della password</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Password cambiata.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Imposta una password\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Cambia Numero di Telefono\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Numero di telefono attuale\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Il tuo numero di telefono è ancora in attesa di verifica.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Cambia Numero di Telefono\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Inserisci la tua password:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Riceverai un codice speciale per un accesso senza password.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Richiedi Codice\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Altre opzioni di accesso\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Registrati\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Registrazione\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Hai già un account valido? %(link)sAccedi%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Registrati con una passkey\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Registrazione con una chiave di sicurezza\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Altre opzioni\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Registrazioni Chiuse\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Spiacenti, le registrazioni sono per il momento sospese.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Nota\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Sei già collegato come %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Attenzione:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Al momento non hai configurato alcun indirizzo email. Ti consigliamo \"\n\"vivamente di aggiungere un indirizzo email per poter ricevere notifiche, \"\n\"reimpostare la password, ecc.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Verifica il tuo indirizzo email\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Ti abbiamo inviato un'email di verifica. Segui il link fornito per \"\n\"completare la procedura di registrazione. Se non trovi l'email di verifica \"\n\"nella tua casella di posta principale, controlla la cartella dello spam. \"\n\"Contattaci se non ricevi l'email di verifica entro pochi minuti.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Per utilizzare questa parte del sito dobbiamo verificare\\n\"\n\"che sei veramente chi dici di essere. Sarà sufficiente\\n\"\n\"dimostrare che hai effettivamente accesso al tuo indirizzo email. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Ti abbiamo inviato un'email di verifica.\\n\"\n\"Clicca sul link contenuto nell'email. Se non vedi l'email di verifica nella \"\n\"tua casella di posta principale, controlla la cartella dello spam.\\n\"\n\"In caso contrario, contattaci se non la ricevi entro pochi minuti.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Nota:</strong> puoi comunque <a href=\\\"%(email_url)s\\\">modificare il \"\n\"tuo indirizzo email</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Messaggi:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menu:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Connessioni all'account\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Autenticazione a Due Fattori\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sessioni\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autorizza\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s desidera accedere al tuo account %(site_name)s.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Inserisci il codice dispositivo\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Inserisci il codice visualizzato sul tuo dispositivo.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Continua\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Conferma dispositivo\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Conferma il codice visualizzato sul tuo %(client_name)s per autorizzare \"\n\"questo dispositivo.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Nega\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Dispositivo autorizzato\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Hai autorizzato con successo il tuo dispositivo %(client_name)s.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Dispositivo negato\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"\"\n\"L'autorizzazione per il tuo dispositivo %(client_name)s è stata negata.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Errore\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Resta connesso\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Il tuo account è protetto da autenticazione a due fattori. Inserisci il \"\n\"codice di autenticazione:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"È stato generato un nuovo set di codici di recupero per l'Autenticazione a \"\n\"Due Fattori.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Nuovi Codici di Recupero Generati\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Applicazione di autenticazione attivata.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Applicazione di autenticazione attivata\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Applicazione di autenticazione disattivata.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Applicazione di autenticazione disattivata\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"È stata aggiunta una nuova chiave di sicurezza.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Chiave di sicurezza aggiunta\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Una chiave di sicurezza è stata rimossa.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Chiave di sicurezza rimossa\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Applicazione di autenticazione\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"L'autenticazione tramite un'applicazione di autenticazione è attiva.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Un'applicazione di autenticazione non è attiva.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Disattiva\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Attiva\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Chiavi di sicurezza\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Hai aggiunto %(count)s chiave di sicurezza.\"\nmsgstr[1] \"Hai aggiunto %(count)s chiavi di sicurezza.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Nessuna chiave di sicurezza è stata aggiunta.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Gestisci\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Aggiungi\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Codici di recupero\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"C'è %(unused_count)s codice di recupero disponibile su un totale di \"\n\"%(total_count)s.\"\nmsgstr[1] \"\"\n\"Ci sono %(unused_count)s codici di recupero disponibili su un totale di \"\n\"%(total_count)s.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Nessun codice di recupero impostato.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Visualizza\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Scarica\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Genera\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"È stato generato un nuovo set di codici di recupero.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Chiave di sicurezza aggiunta.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Chiave di sicurezza rimossa.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Inserisci un codice dell'autenticatore:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\"Stai per generare un nuovo set di codici di recupero per il tuo account.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Questa azione renderà invalidi i tuoi codici esistenti.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Sei sicuro?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Codici non utilizzati\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Scarica codici\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Genera nuovi codici\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Attiva l'applicazione di autenticazione\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Per proteggere il tuo account con l'autenticazione a due fattori, \"\n\"scannerizza il codice QR qui sotto con la tua applicazione di \"\n\"autenticazione. Successivamente, inserisci il codice di verifica generato \"\n\"dall'applicazione qui sotto.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Segreto dell'autenticatore\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Puoi conservare questo segreto e utilizzarlo per reinstallare la tua \"\n\"applicazione di autenticazione in un momento successivo.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Disattiva l'applicazione di autenticazione\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Stai per disattivare l'autenticazione basata sull'applicazione di \"\n\"autenticazione. Sei sicuro?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Ti fidi di questo browser?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Se scegli di fidarti di questo browser, non ti verrà richiesto alcun codice \"\n\"di verifica al prossimo accesso.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Fiducia per %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Non fidarti\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Aggiungi Chiave di Sicurezza\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Rimuovi Chiave di Sicurezza\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Sei sicuro di voler rimuovere questa chiave di sicurezza?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Utilizzazione\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Chiave di sicurezza\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Chiave di sicurezza\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Questa chiave non indica se è una passkey.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Non specificato\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Aggiunta a %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Ultimo utilizzo: %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Modifica\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Modifica Chiave di Sicurezza\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Salva\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Crea Passkey\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Stai per creare una passkey per il tuo account. Poiché puoi aggiungere \"\n\"ulteriori chiavi in seguito, puoi utilizzare un nome descrittivo per \"\n\"distinguerle.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Crea\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Questa funzionalità richiede JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Errore di accesso con account di terze parti\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Si è verificato un errore durante il tentativo di accesso con il tuo account \"\n\"di terze parti.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Puoi collegarti al tuo account utilizzando uno dei seguenti servizi di \"\n\"autenticazione Social Network:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Attualmente non hai account di terze parti collegati a questo account.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Aggiungi un account di un Social Network\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"\"\n\"Un account di terze parti da %(provider)s è stato collegato al tuo account.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Account di terze parti collegato\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"Un account di terze parti da %(provider)s è stato disconnesso dal tuo \"\n\"account.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Account di terze parti disconnesso\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Connetti %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Stai per collegare un nuovo account di terze parti da %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Accedi tramite %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Stai per accedere utilizzando un account di terze parti da %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Accesso annullato\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Hai deciso di cancellare l'accesso a questo sito usando uno dei tuoi account \"\n\"attivi. Se è stato un errore, ripeti l'<a href=\\\"%(login_url)s\\\">Accesso</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"L'account di terze parti è stato collegato.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"L'account di terze parti è stato disconnesso.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Stai per usare il tuo account su %(provider_name)s per effettuare il login \"\n\"su\\n\"\n\"%(site_name)s. Come ultima operazione ti chiediamo di riempire il form qui \"\n\"sotto:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"O usa un servizio di terze parti\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Disconnesso da tutte le altre sessioni.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Iniziato alle\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"Indirizzo IP\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Browser\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Ultimo accesso alle\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Attuale\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Esci dalle altre sessioni\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Sessioni utente\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"chiave di sessione\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Connessioni all'account\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"La password deve essere lunga almeno {0} caratteri.\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Stai ricevendo questa email perché tu o qualcun altro ha richiesto una\\n\"\n#~ \"password per il tuo account utente. Tuttavia, non abbiamo alcun record di \"\n#~ \"un utente\\n\"\n#~ \"con l'indirizzo email %(email)s nel nostro database.\\n\"\n#~ \"\\n\"\n#~ \"Questa email può essere ignorata in modo sicuro se non hai richiesto un \"\n#~ \"ripristino della password.\\n\"\n#~ \"\\n\"\n#~ \"Se sei stato tu, puoi registrarti per un account utilizzando il link qui \"\n#~ \"sotto.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"I seguenti indirizzi email sono associati al tuo account:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Conferma l'Indirizzo Email\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Per favore, accedi con uno\\n\"\n#~ \"dei tuoi account social, o %(link)sregistra%(end_link)s\\n\"\n#~ \"il tuo account per %(site_name)s e accedi:\"\n\n#~ msgid \"or\"\n#~ msgstr \"o\"\n\n#~ msgid \"change password\"\n#~ msgstr \"cambia password\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Accesso con OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Questo indirizzo email è gia associato a un altro account.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an email. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Ti abbiamo spedito una mail. Contattaci se non la ricevi entro qualche \"\n#~ \"minuto.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"Il login e/o la password che hai usato non sono corretti.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"Gli username possono contenere solo lettere, cifre e @/./+/-/_.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"Questo username è già in uso. Per favore scegline un altro.\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"email address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"Hai appena confermato che <a href=\\\"mailto:%(email)s\\\">%(email)s</a> è un \"\n#~ \"indirizzo email valido per l'utente %(user_display)s.\"\n\n#~ msgid \"Thanks for using our site!\"\n#~ msgstr \"Grazie per aver utilizzato questo Sito!\"\n"
  },
  {
    "path": "allauth/locale/ja/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-08-07 02:02+0000\\n\"\n\"Last-Translator: SATOH Fumiyasu <fumiyas@osstech.co.jp>\\n\"\n\"Language-Team: Japanese <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/ja/>\\n\"\n\"Language: ja\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 5.13-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"このアカウントは現在無効です。\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"メインのメールアドレスは削除できません。\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"このメールアドレスはすでに別のアカウントで登録されています。\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"入力されたメールアドレスもしくはパスワードが正しくありません。\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"入力された電話番号もしくはパスワードが正しくありません。\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"ほかのユーザーがこのメールアドレスでアカウント登録済みです。\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"現在のパスワードを入力してください。\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"コードが正しくありません。\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"パスワードが正しくありません。\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"不正または期限切れのキーです。\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"不正なログインです。\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"パスワード再設定コードが無効です。\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"メールアドレスは %d 個までしか登録できません。\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"ほかのユーザーがこの電話番号を登録済みです。\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"ログイン失敗が連続しています。時間が経ってからやり直してください。\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"このメールアドレスで登録されたユーザーアカウントがありません。\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"この電話番号で登録されたユーザーアカウントがありません。\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"メインのメールアドレスは確認済みでなければいけません。\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"このユーザー名は使用できません。ほかのユーザー名を選んでください。\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"入力されたユーザー名もしくはパスワードが正しくありません。\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"1つだけ選択してください。\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"現在値と異なる値にしてください。\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"あなたは大量のリクエストを送信しています。しばらくお待ちください。\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"パスワードを使用する\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"認証アプリまたは認証コードを使用する\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"セキュリティキーを使用する\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} を確認済みにしました。\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"{email} を確認済みに変更する処理が失敗しました。\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"確認済みにするメールアドレスを選択\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"アカウント\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"メールアドレス\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"メールアドレス\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"電話番号を国番号付きで入力してください (日本なら国番号 +81)。\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"電話番号\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"同じパスワードを入力してください。\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"パスワード\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"ログインしたままにする\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"ユーザー名\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"ログイン\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"ユーザー名、メールアドレスまたは電話番号\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"ユーザー名またはメールアドレス\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"ユーザー名または電話番号\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"メールアドレスまたは電話番号\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"パスワードをお忘れですか?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"メールアドレス (確認用)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"メールアドレスの確認\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"メールアドレス (オプション)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"ユーザー名 (オプション)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"同じパスワードを入力してください。\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"パスワード (再入力)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"現在のパスワード\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"新しいパスワード\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"新しいパスワード (再入力)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"コード\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"ユーザー\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"メールアドレス\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"確認済み\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"メイン\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"メールアドレス\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"作成日時\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"送信日時\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"キー\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"メールアドレスの確認\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"メールアドレスの確認\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"ヘッドレス\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"あなたのユーザー ID を表示\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"あなたのメールアドレスを表示\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"あなたの基本ユーザー情報を表示\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"認可パーミッション\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"「URIワイルドカードを許可」が有効でない限り、ワイルドカードは使用できません。\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI「{}」に複数のワイルドカード（*）が含まれています。URIごとに使用できるワイ\"\n\"ルドカードは1つのみです。\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"ワイルドカードはURIのホスト名部分でのみ使用できます。\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"認可コード\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"デバイスコード\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"クライアントクレデンシャル\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"リフレッシュトークン\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"クレデンシャル\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"公開\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"許可するクライアントスコープ。行ごとに区切ってスコープを入力してください。\"\n\"(例: openid(改行)profile(改行)email(改行))\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"クライアントがスコープを指定しない場合、この既定のスコープが使用されます。行\"\n\"ごとに区切って入力してください。(例: openid(改行)profile(改行)email(改行))\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"許可する認可タイプの一覧。行ごとに区切って入力してください。(例: \"\n\"authorization_code(改行)client_credentials(改行)refresh_token(改行))\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"オリジン間リクエストで許可するリクエスト元の一覧。行ごとに区切って入力してく\"\n\"ださい。\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"リダイレクトURIおよびCORSオリジンでワイルドカード（*）を許可します。有効にす\"\n\"ると、URIにサブドメインに一致する単一のアスタリスクを含めることができます。\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"許可する応答タイプの一覧。行ごとに区切って入力してください。(例: code(改\"\n\"行)id_token token(改行))\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"クライアント\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"クライアント\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"多要素認証で保護されているアカウントには、メールアドレスを追加できません。\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"多要素認証は無効化できません。\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"リカバリーキーを生成するには多要素認証の有効化が必要です。\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"多要素認証を有効化するには、先にメールアドレスの確認を完了させてください。\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"マスターキー\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"バックアップキー\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"キー番号 {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"多要素認証\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"リカバリーコード\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP 認証アプリ\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"認証アプリコード\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"パスワードレス\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"パスワードレス機能を有効化すると、このキーを使用してログイン可能になります。\"\n\"その代わりに生態認証や PIN コードなどによる保護が必要になります。\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"ほかのアカウントが既にこのメールアドレスを登録しています。そのアカウントでロ\"\n\"グインしてから %s アカウントを接続してください。\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"不正なトークンです。\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"アカウントにパスワードを設定する必要があります。\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"確認済みのメールアドレスの登録が必要です。\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"唯一残っている外部アカウントとの接続は解除できません。\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"この外部アカウントはほかのアカウントに接続されています。\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"外部アカウント\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"プロバイダー\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"プロバイダー ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"名前\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"クライアント ID\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"App ID もしくはコンシューマキー\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"シークレットキー\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"\"\n\"API シークレット、クライアントシークレット、またはコンシューマーシークレット\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"キー\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"ソーシャルアプリケーション\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"ソーシャルアプリケーション\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"UID\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"最終ログイン\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"アカウント作成日\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"エクストラデータ\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"ソーシャルアカウント\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"ソーシャルアカウント\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"トークン\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"「oauth_token」(OAuth1) もしくは Access Token (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"トークンシークレット\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"「oauth_token_secret」(OAuth1) もしくは Refresh Token (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"失効期限\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"ソーシャルアプリケーショントークン\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"ソーシャルアプリケーショントークン\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"無効なプロファイルデータ\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"ログイン\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"キャンセル\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"リクエストトークン取得中に「%s」から不正な応答がありました。レスポンス: %s\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"\"\n\"不正なレスポンスが返されたため、「%s」からアクセストークンを取得できませんで\"\n\"した。\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"「%s」のリクエストトークンが保存されていません。\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"「%s」のアクセストークンが保存されていません。\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"「%s」の情報にアクセスできませんでした。\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"\"\n\"不正なレスポンスが返されたため、「%s」からリクエストトークンを取得できません\"\n\"でした。\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"無効なアカウント\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"このアカウントは無効です。\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"コードを %(recipient)s に送信しました。コードの有効期限はまもなく切れますの\"\n\"で、お早めにご入力ください。\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"確認する\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"新しいコードを要求\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"アクセス確認\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"アカウントを保護するために再認証してください。\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"そのほかの方法\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"メールアドレスの確認\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"メールの確認コードを入力:\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"別のメールアドレスを使用する\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"ログイン\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"ログインコードを入力\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"パスワードの再設定\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"パスワード再設定コードの入力\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"電話番号の確認\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"電話番号の確認コードの入力\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"別の電話番号を使用する\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"メールアドレス\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"以下のメールアドレスがアカウントに登録されています:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"確認済み\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"未確認\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"メイン\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"メインにする\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"確認メールを再送する\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"削除\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"メールアドレスの登録\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"メールアドレスの登録\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"選択されたメールアドレスを削除してもよろしいですか?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"あなた (もしくはほかの誰か) が次のメールアドレスを使用してアカウントの登録を\"\n\"試みました:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"しかし、このメールアドレスを使用したアカウントがすでに存在しています。もしア\"\n\"カウントの登録を忘れていた場合は、パスワードを忘れたときの手続きを利用してア\"\n\"カウントを回復してください:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"アカウントが既に存在\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"こんにちは、%(site_name)s です!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"%(site_name)s をご利用いただきありがとうございます!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"あなたのアカウントに以下の変更が加えられたため、このメールが届いています:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"この変更が認識できない場合は、直ちに適切なセキュリティ対策を講じてください。\"\n\"あなたのアカウントに対するこの変更の起源は以下の通りです：\\n\"\n\"\\n\"\n\"- IPアドレス: %(ip)s\\n\"\n\"- ブラウザ: %(user_agent)s\\n\"\n\"- 日付: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"\"\n\"あなたのメールアドレスを %(from_email)s から %(to_email)s に変更しました。\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"メールアドレスを変更しました\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"あなたのメールアドレスを確認しました。\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"メールアドレスの確認\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"%(user_display)s さんが %(site_domain)s にあなたのメールアドレスを登録しよう\"\n\"としています。\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"あなたのメール確認コードを下記に記載します。開いているブラウザのウィンドウに\"\n\"入力してください。\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"間違いなければ、%(activate_url)s にアクセスしてください。\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"メールアドレスを確認してください\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"\"\n\"メールアドレス %(deleted_email)s をあなたのアカウントから削除しました。\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"メールアドレスの削除\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"以下にあなたのログインコードが記載されています。開いているブラウザのウィンド\"\n\"ウに入力してください。\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"この操作があなたによるものではない場合、このメールは無視しても差し支えありま\"\n\"せん。\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"ログインコード\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"パスワードを変更しました。\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"パスワードを変更しました\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"以下にあなたのパスワード再設定コードを記載します。開いているブラウザのウィン\"\n\"ドウに入力してください。\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"パスワード再設定コード\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"このメールは、あなた (もしくはほかの誰か) がパスワードの再設定を行おうとした\"\n\"ために送られました。\\n\"\n\"パスワードの再設定を要求したのがあなたではない場合、このメールは無視してくだ\"\n\"さい。\\n\"\n\"パスワードを再設定するためには、以下のリンクをクリックしてください。\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"あなたのアカウントのユーザー名は %(username)s です。\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"パスワード再設定メール\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"パスワードを再設定しました。\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"パスワードを設定しました。\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"パスワード設定\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"あなた (もしくはほかの誰か) がメールアドレス %(email)s を持つアカウントにアク\"\n\"セスしようとしたため、この通知メールを送りました。ただし、私たちのデータベー\"\n\"スには該当するアカウント情報がありませんでした。\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"もしあなたで間違いないなら、以下のリンクからアカウントを登録できます。\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"不明なアカウント\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"メールアドレス\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"現在のメールアドレス\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"変更中\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"あなたのメールアドレスはまだ確認されていません。\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"変更をキャンセル\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"変更する\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"メールアドレス変更\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"メールアドレスの確認\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"メールアドレス <a href=\\\"mailto:%(email)s\\\">%(email)s</a> がユーザー \"\n\"%(user_display)s さんのものであることを確認してください。\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"%(email)s はすでにほかのアカウントで確認済みです。\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"メールアドレス確認用のリンクが不正か、期限が切れています。<a \"\n\"href=\\\"%(email_url)s\\\">確認用のメールを再送</a>してください。\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"アカウントをまだお持ちでなければ、 %(link)sこちらからユーザー登\"\n\"録%(end_link)s してください。\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"パスキーでログイン\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"ログインコードを送信する\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"ログアウト\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"ログアウトしますか?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"メインのメールアドレス (%(email)s) は削除できません。\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"確認メールを %(email)s へ送信しました。\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"%(email)s を確認しました。\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"メールアドレス %(email)s を削除しました。\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"ユーザー %(name)s としてログインしました。\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"ログアウトしました。\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"ログインコードを %(recipient)s へ送信しました。\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"パスワードを変更しました。\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"パスワードを設定しました。\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"確認コードを %(phone)s へ送信しました。\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"あなたの電話番号 %(phone)s を照合しました。\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"メインメールアドレスを設定しました。\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"パスワード変更\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"パスワードをお忘れですか?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"パスワードをお忘れですか? パスワードを再設定するために、メールアドレスを入力\"\n\"してください。\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"パスワードを再設定する\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"パスワードの再設定に問題がある場合はご連絡ください。\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"確認のためのメールを送信しました。確認メールが届かないときは迷惑メールフォル\"\n\"ダをご確認ください。しばらくしてもメールが届かない場合はご連絡ください。\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"不正なトークン\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"パスワード再設定のリンクが不正です。すでに使用された可能性があります。もう一\"\n\"度 <a href=\\\"%(passwd_reset_url)s\\\">パスワードの再設定</a>をお試しください。\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"パスワードを変更しました。\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"パスワード設定\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"電話番号を変更する\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"現在の電話番号\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"あなたの電話番号はまだ確認されていません。\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"電話番号を変更する\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"パスワードを入力してください。\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"パスワード不要のログイン用特別コードが記載されたメールをお送りします。\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"コードを要求\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"そのほかのログイン方法\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"ユーザー登録\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"ユーザー登録\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"\"\n\"すでにアカウントをお持ちであれば、こちらから %(link)sログイン%(end_link)s し\"\n\"てください。\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"パスキーでユーザー登録\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"パスキーでユーザー登録\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"ほかのオプション\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"ユーザー登録停止中\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"申し訳ありません、現在ユーザー登録を停止しています。\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"注意\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"%(user_display)s さんとしてすでにログイン中です。\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"注意:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"メールアドレスが設定されていません。通知を受け取ったり、パスワードを再設定し\"\n\"たりするためにはメールアドレスを登録する必要があります。\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"メールアドレスを確認してください\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"確認のメールを送信しました。メールに記載されたリンクをクリックして、ユーザー\"\n\"登録を完了させてください。確認メールが届かないときは迷惑メールフォルダをご確\"\n\"認ください。しばらくしても確認のメールが届かない場合はお問い合わせください。\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"このページにアクセスするためには、本人確認が必要です。\\n\"\n\"そのために、登録されているメールアドレスがご自身のものであることを確認してい\"\n\"ただきます。 \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"確認のためのメールを送信しました。メールに記載されたリンクをクリックしてくだ\"\n\"さい。\\n\"\n\"確認メールが届かないときは迷惑メールフォルダをご確認ください。\\n\"\n\"しばらくしてもメールが届かない場合はお問い合わせください。\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>注意:</strong> <a href=\\\"%(email_url)s\\\">メールアドレスの変更</a>をし\"\n\"ていただくことも可能です。\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"メッセージ:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"メニュー:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"アカウント接続\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"多要素認証\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"セッション\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"認可する\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"\"\n\"%(client_name)s があなたの %(site_name)s アカウントへのアクセスを要求していま\"\n\"す。\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"デバイスコードの入力\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"あなたのデバイスに表示されたコードを入力してください。\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"続ける\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"デバイスの確認\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"あなたの %(client_name)s に表示されたデバイス認可用のコードをご確認ください。\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"拒否する\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"デバイスが認可されました\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"あなたの %(client_name)s デバイスを認可しました。\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"デバイスは拒否されました\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"あなたの %(client_name)s デバイスの認可は拒否されました。\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"エラー\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"ログイン状態を保持する\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"あなたのアカウントは多要素認証で保護されています。認証コードを入力してくださ\"\n\"い:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"多要素認証用のリカバリーコードを新たに生成しました。\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"新しいリカバリーコードを生成しました\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"認証アプリを有効化しました。\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"認証アプリを有効化しました\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"認証アプリを無効化しました。\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"認証アプリを無効化しました\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"新しいセキュリティキーを登録しました。\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"セキュリティキーを追加しました\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"セキュリティキーを削除しました。\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"セキュリティキーを削除しました\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"認証アプリ\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"認証アプリを使用した認証が有効です。\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"認証アプリは有効ではありません。\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"無効化する\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"有効化する\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"セキュリティキー\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"%(count)s 個のセキュリティキーを登録しました。\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"登録されているセキュリティキーはありません。\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"管理\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"登録\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"リカバリーコード\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"利用可能なリカバリーコードは %(total_count)s 個中 %(unused_count)s 個です。\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"リカバリーコードは設定されていません。\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"表示\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"ダウンロード\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"生成する\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"新しいリカバリーコードを生成しました。\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"セキュリティーキーを登録しました。\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"セキュリティキーを削除しました。\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"認証アプリのコードを入力:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"新しいリカバリーコードセットを生成しようとしています。\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"この操作により、現在のコードが無効になります。\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"本当によろしいですか?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"未使用のコード\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"コードをダウンロードする\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"新しいコードを生成する\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"認証アプリを有効化する\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"アカウントを多要素認証で保護するために、認証アプリで以下の QR コードをスキャ\"\n\"ンしてください。次に、アプリで生成された確認コードを以下に入力してください。\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"認証アプリシークレット\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"このシークレットを保存し、後で認証アプリを再インストールする際に使用できま\"\n\"す。\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"認証アプリを無効化する\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"認証アプリによる認証を無効化しようとしています。本当によろしいですか?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"このブラウザを信頼しますか?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"このブラウザを信頼すると、次回のログイン時に確認コードの入力が不要になりま\"\n\"す。\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"信頼する (%(period)s)\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"信頼しない\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"セキュリティキーを追加\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"セキュリティキーを解除\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"セキュリティキーを解除しますか?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"使用方法\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"パスキー\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"セキュリティキー\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"このキーはパスキーかどうか示されていません。\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"未指定\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"登録日: %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"最終使用日: %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"編集\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"セキュリティキーを編集\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"保存\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"パスキーを作成\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"あなたのアカウント用のパスキーを作成します。あとでキーの追加もできるため、\"\n\"キーに区別しやすい名前を付けてください。\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"作成\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"この機能を利用するには JavaScript が必要です。\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"外部アカウントによるログインに失敗しました\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"外部アカウントでのログイン時ににエラーが発生しました。\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"以下の外部アカウントを使ってログインできます:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"あなたのカウントに結びつけられた外部アカウントはありません。\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"外部アカウントを追加する\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"%(provider)s の外部アカウントをあなたのアカウントに接続しました。\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"外部アカウントを接続しました\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"%(provider)s の外部アカウントへの接続を解除しました。\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"外部アカウントとの接続を解除しました\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"%(provider)s と接続する\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"%(provider)s の新しい外部アカウントを接続しようとしています。\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"%(provider)s でログイン\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"%(provider)s の外部アカウントを使用してログインしようとしています。\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"ログインをキャンセルしました\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"既存の外部アカウントを使ったログインをキャンセルしました。\\n\"\n\"やり直す場合は<a href=\\\"%(login_url)s\\\">ログインページ</a>にお進みください。\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"外部アカウントを接続しました。\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"外部アカウントとの接続を解除しました。\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"%(provider_name)s アカウントを使って %(site_name)s にログインしようとしていま\"\n\"す。\\n\"\n\"ユーザー登録のために、以下のフォームに記入してください。\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"外部アカウントを使用する\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"ほかのすべてのセッションをログアウトしました。\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"開始日時\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP アドレス\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"ブラウザー\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"閲覧日時\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"現在の\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"ほかのセッションをログアウト\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"ユーザーセッション\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"セッションキー\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"アカウント接続\"\n\n#~ msgid \"Use security key or device\"\n#~ msgstr \"セキュリティキー/デバイスを使用\"\n\n#~ msgid \"Add Security Key or Device\"\n#~ msgstr \"セキュリティキー/デバイスの登録\"\n\n#~ msgid \"Add key or device\"\n#~ msgstr \"キー/デバイスを登録\"\n\n#~ msgid \"Security Keys and Devices\"\n#~ msgstr \"セキュリティキー/デバイス\"\n\n#~ msgid \"You have not added any security keys/devices.\"\n#~ msgstr \"登録されたセキュリティキー/デバイスはありません。\"\n\n#~ msgid \"Edit Security Key or Device\"\n#~ msgstr \"セキュリティキー/デバイスの編集\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"パスワードは {0} 文字以上の長さが必要です。\"\n\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"このメールは、あなた（もしくは別の誰か）がパスワードの再設定を行おうとした\"\n#~ \"ために送られました。\\n\"\n#~ \"パスワードの再設定を要求したのがあなたではない場合、このメールは無視してく\"\n#~ \"ださい。パスワードを再設定するためには、以下のリンクをクリックしてくださ\"\n#~ \"い。\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"以下のメールアドレスがアカウントに登録されています：\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"メールアドレスの確認\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"お持ちの外部アカウントでログインするか、%(site_name)sに <a \"\n#~ \"href=\\\"%(signup_url)s\\\">ユーザー登録</a> してログインしてください。\"\n\n#~ msgid \"or\"\n#~ msgstr \"または\"\n\n#~ msgid \"change password\"\n#~ msgstr \"パスワード変更\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"OpenID ログイン\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"このメールアドレスは別のアカウントで使用されています。\"\n"
  },
  {
    "path": "allauth/locale/ka/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# Nikoloz Naskidashvili <nikoloz2005@gmail.com>, 2021.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-10-20 04:54+0000\\n\"\n\"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\\n\"\n\"Language-Team: Georgian <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/ka/>\\n\"\n\"Language: ka\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 5.14-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"ეს ანგარიში ამჟამად გაუქმებულია.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"თქვენ არ შეგიძლიათ წაშალოთ თქვენი ძირითადი ელ. ფოსტის მისამართი.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"ეს ელ.ფოსტის მისამართი უკვე დაკავშირებულია ამ ანგარიშთან.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"თქვენს მიერ მითითებული ელ. ფოსტა ან პაროლი არასწორია.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"თქვენს მიერ მითითებული ტელეფონის ნომერი ან პაროლი არასწორია.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"მომხმარებელი ამ ელ. ფოსტით უკვე დარეგისტრირებულია.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"გთხოვთ აკრიფეთ მიმდინარე პაროლი.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"არასწორი კოდი.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"არასწორი პაროლი.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"არასწორი, ან ვადაამოწურული გასაღები.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"არასწორი შესვლის მცდელობა.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"პაროლის აღდგენის კოდი არასწორია.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"თქვენ არ შეგიძლიათ დაამატოთ %d- ზე მეტი ელექტრონული ფოსტის მისამართი.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"მომხმარებელი ამ ტელეფონის ნომრით უკვე დარეგისტრირებულია.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"შესვლის ძალიან ბევრი წარუმატებელი მცდელობა. მოგვიანებით სცადეთ.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"\"\n\"ეს ელექტრონული ფოსტის მისამართი არ არის მიბმული რომელიმე მომხმარებლის \"\n\"ანგარიშზე.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"ეს ტელეფონის ნომერი არ არის მიბმული რომელიმე მომხმარებლის ანგარიშზე.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"თქვენი ძირითადი ელფოსტის მისამართი გადამოწმებული უნდა იყოს.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"ამ მომხმარებლის სახელის გამოყენება შეუძლებელია. გთხოვთ გამოიყენოთ სხვა.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"თქვენს მიერ მითითებული მომხმარებლის სახელი ან პაროლი არასწორია.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"გთხოვთ აირჩიოთ მხოლოდ ერთი.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"ახალი მნიშვნელობა მიმდინარესგან განსხვავებული უნდა იყოს.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"მოითმინეთ, თქვენ ძალიან ბევრ მოთხოვნას აგზავნით.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"გამოიყენეთ თქვენი პაროლი\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"გამოიყენეთ ავთენტიფიკატორის აპლიკაცია ან კოდი\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"გამოიყენეთ უსაფრთხოების გასაღები\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} დაინიშნა, როგორც გადამოწმებული.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"{email}-ის გადამოწმებულად დანიშვნა ჩავარდა.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"არჩეული ელ. ფოსტის მისამართების გადამოწმებულად მონიშვნა\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"მომხმარებლის ანგარიშები\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"ელ. ფოსტა\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"ელ. ფოსტა\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"შეიყვანეთ ტელეფონის ნომერი ქვეყნის კოდის ჩათვლით (მაგ. +1 აშშ-სთვის).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"ტელეფონი\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"თქვენ უნდა აკრიფოთ ერთი და იგივე პაროლი ყოველ ჯერზე.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"პაროლი\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"დამიმახსოვრე\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"მომხმარებლის სახელი\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"შესვლა\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"მომხმარებლის სახელი, ელ. ფოსტა ან ტელეფონი\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"მომხმარებლის სახელი ან ელ. ფოსტა\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"მომხმარებლის სახელი ან ტელეფონი\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"ელ. ფოსტა ან ტელეფონი\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"დაგავიწყდათ პაროლი?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"ელ. ფოსტა (გაამეორეთ)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"ელ. ფოსტის დადასტურება\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"ელ. ფოსტა (არ არის აუცილებელი)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"მომხმარებლის სახელი (არასავალდებულო)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"თქვენ უნდა ჩაწეროთ ერთი და იგივე ელ. ფოსტა ყოველ ჯერზე.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"პაროლი (გაამეორეთ)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"მიმდინარე პაროლი\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"ახალი პაროლი\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"ახალი პაროლი (გაამეორეთ)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"კოდი\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"მომხმარებელი\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"ელ. ფოსტა\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"დადასტურებული\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"პირველადი\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"ელ. ფოსტის ანგარიშები\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"შექმნილი\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"გაგზავნილი\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"გასაღები\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"ელ. ფოსტის დადასტურება\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"ელ. ფოსტის დადასტურებები\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"თქვენი მომხმარებლის ID-ს ნახვა\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"თქვენი ელ. ფოსტის მისამართის ნახვა\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"თქვენი ძირითადი პროფილის ინფორმაციის ნახვა\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"ნებართვების მინიჭება\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"ბუნებრივი ნიშნები (*) დაშვებული არ არის, თუ 'URI ბუნებრივი ნიშნების დაშვება' \"\n\"ჩართული არ არის.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' შეიცავს ერთზე მეტ ბუნებრივ ნიშანს (*). თითო URI-ში მხოლოდ ერთი \"\n\"ბუნებრივი ნიშანი (*) არის დაშვებული.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"ბუნებრივი ნიშნები (*) მხოლოდ URI-ის ჰოსტის ნაწილში არის დაშვებული.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"ავტორიზაციის კოდი\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"მოწყობილობის კოდი\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"კლიენტის სერთიფიკატები\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"განახლების ტოკენი\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"კონფიდენციალური\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"საჯარო\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"სფერო(ები), რომელთა მოთხოვნის უფლება აქვს კლიენტს. მიუთითეთ ერთი მნიშვნელობა \"\n\"თითო სტრიქონზე, მაგ.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"თუ კლიენტი არ მიუთითებს სფეროს, გამოიყენება ეს ნაგულისხმევი სფეროები. \"\n\"მიუთითეთ ერთი მნიშვნელობა თითო სტრიქონზე, მაგ.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"დაშვებული გრანტის ტიპების სია. მიუთითეთ ერთი მნიშვნელობა თითო სტრიქონზე, \"\n\"მაგ.: authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"ქროს-ორიჯინ მოთხოვნებისთვის დაშვებული წარმოშობის სია, თითო სტრიქონზე.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"ბუნებრივი ნიშნების (*) დაშვება გადამისამართების URI-ებსა და CORS \"\n\"წარმოშობებში. ჩართვისას, URI-ები შეიძლება შეიცავდეს ერთ ვარსკვლავს (*) \"\n\"ქვედომენების შესატყვისად.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"დაშვებული პასუხის ტიპების სია. მიუთითეთ ერთი მნიშვნელობა თითო სტრიქონზე, \"\n\"მაგ.: code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"კლიენტი\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"კლიენტები\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"თქვენ არ შეგიძლიათ ელ. ფოსტის მისამართის დამატება ორფაქტორიანი \"\n\"ავთენტიფიკაციით დაცულ ანგარიშზე.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"თქვენ არ შეგიძლიათ ორფაქტორიანი ავთენტიფიკაციის გამორთვა.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"თქვენ არ შეგიძლიათ აღდგენის კოდების გენერირება ორფაქტორიანი ავთენტიფიკაციის \"\n\"ჩართვის გარეშე.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"თქვენ ვერ ჩართავთ ორფაქტორიან ავთენტიფიკაციას, სანამ არ დაადასტურებთ თქვენს \"\n\"ელ. ფოსტის მისამართს.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"მთავარი გასაღები\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"სარეზერვო გასაღები\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"გასაღები №{number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"აღდგენის კოდები\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP ავთენტიფიკატორი\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"ავთენტიფიკატორის კოდი\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"უპაროლო\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"უპაროლო რეჟიმის ჩართვა საშუალებას გაძლევთ შეხვიდეთ მხოლოდ ამ გასაღების \"\n\"გამოყენებით, მაგრამ მოითხოვს დამატებით პირობებს, როგორიცაა ბიომეტრიკა ან PIN-\"\n\"კოდით დაცვა.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"ანგარიში ამ ელ. ფოსტის მისამართით უკვე არსებობს. გთხოვთ, ჯერ შეხვიდეთ იმ \"\n\"ანგარიშში, შემდეგ კი დააკავშიროთ თქვენი %s ანგარიში.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"არასწორი კოდი.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"თქვენს ანგარიშს არ აქვს პაროლი დაყენებული.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"თქვენს ანგარიშს არ აქვს დადასტურებული ელ. ფოსტა.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"თქენს უკანასკნელ მესამე პირების მიერ დამატებულ ანგარიშს ვერ გათიშავთ.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"მესამე მხარის ანგარიში უკვე მიბმულია სხვა ანგარიშთან.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"სოციალური ანგარიშები\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"პროვაიდერი\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"პროვაიდერის ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"სახელი\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"კლიენტის id\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"აპლიკაციის ID ან მომხმარებლის კოდი\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"საიდუმლო კოდი\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"\"\n\"API-ს საიდუმლო კოდი, კლიენტის საიდუმლო კოდი ან მომხმარებლის საიდუმლო კოდი\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"გასაღები\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"სოციალური აპლიკაცია\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"სოციალური აპლიკაციები\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"ბოლო შესვლის თარიღი\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"ანგარიშის შექმნის თარიღი\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"სხვა მონაცემები\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"სოციალური ანგარიში\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"სოციალური ანგარიშები\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"კოდი\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) ან access token (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"საიდუმლო კოდი\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) ან refresh token (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"ვადა გაუსვლის თარიღი\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"სოციალური ანგარიშის კოდი\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"სოციალური ანგარიშების კოდი\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"პროფილის მონაცემები არასწორია\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"შესვლა\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"გაუქმება\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"არასწორი პასუხი მოთხოვნის მიღებისას \\\"%s\\\"-დან. მიღებულია პასუხი: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"არასწორი პასუხი მოთხოვნის წვდომის კოდის მიღებისას \\\"%s\\\"-დან.\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"მოთხოვნის კოდი არ არის შენახული \\\"%s\\\" -სთვის.\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"მოთხოვნის წვდომის კოდი არ არის შენახული \\\"%s\\\" -სთვის.\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\" - ზე კერძო რესურსებზე წვდომა არ არის.\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"არასწორი პასუხი კოდის მიღებისას \\\"%s\\\"-დან.\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"ანგარიში გაუქმებულია\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"ეს ანგარიში გაუქმებულია.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"ჩვენ გამოგიგზავნეთ კოდი %(recipient)s-ზე. კოდს მალე ვადა გაუვა, ამიტომ \"\n\"გთხოვთ შეიყვანოთ დროულად.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"დადასტურება\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"ახალი კოდის მოთხოვნა\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"წვდომის დადასტურება\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"გთხოვთ ხელახლა გაიაროთ ავთენტიფიკაცია თქვენი ანგარიშის დასაცავად.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"ალტერნატიული ვარიანტები\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"ელ. ფოსტის ვერიფიკაცია\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"შეიყვანეთ ელ. ფოსტის ვერიფიკაციის კოდი\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"გამოიყენეთ სხვა ელ. ფოსტის მისამართი\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"შესვლა\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"შეიყვანეთ შესვლის კოდი\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"პაროლის შეცვლა\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"შეიყვანეთ პაროლის აღდგენის კოდი\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"ტელეფონის ვერიფიკაცია\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"შეიყვანეთ ტელეფონის ვერიფიკაციის კოდი\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"გამოიყენეთ სხვა ტელეფონის ნომერი\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"ელ. ფოსტის მისამართები\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"შემდეგი ელ.ფოსტის მისამართები ასოცირდება თქვენს ანგარიშთან:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"დადასტურებული\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"არ არის დადასტურებელი\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"პირველადი\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"გახადე პირველადი\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"ვერიფიკაციის თავიდან გაგზავნა\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"წაშლა\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"ელ. ფოსტის მისამართის დამატება\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"ელ. ფოსტის დამატება\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"ნამდვილად გსურთ წაშალოთ არჩეული ელ.ფოსტის მისამართი?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"თქვენ იღებთ ამ ელ. წერილს, რადგან თქვენ ან სხვა ვიღაცამ სცადა რეგისტრაცია\\n\"\n\"შემდეგი ელ. ფოსტის მისამართით:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"თუმცა, ამ ელ. ფოსტის მისამართით ანგარიში უკვე არსებობს. თუ\\n\"\n\"დაგავიწყდათ, გთხოვთ გამოიყენოთ პაროლის აღდგენის პროცედურა\\n\"\n\"თქვენი ანგარიშის აღსადგენად:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"ანგარიში უკვე არსებობს\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"მოგესალმებით %(site_name)s!-დან!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"მადლობა რომ იყენებ %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"თქვენ იღებთ ამ ელ. წერილს, რადგან თქვენს ანგარიშში შემდეგი ცვლილება \"\n\"განხორციელდა:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"თუ ეს ცვლილება არ გეცნობათ, გთხოვთ დაუყოვნებლივ მიიღოთ შესაბამისი \"\n\"უსაფრთხოების ზომები. ცვლილება თქვენს ანგარიშზე განხორციელდა:\\n\"\n\"\\n\"\n\"- IP მისამართი: %(ip)s\\n\"\n\"- ბრაუზერი: %(user_agent)s\\n\"\n\"- თარიღი: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"თქვენი ელ. ფოსტა შეიცვალა %(from_email)s-დან %(to_email)s-ზე.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"ელ. ფოსტა შეიცვალა\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"თქვენი ელ. ფოსტა დადასტურებულია.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"ელ. ფოსტის დადასტურება\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"თქვენ იღებთ ამ ელ. წერილს რადგან მომხმარებემა - %(user_display)s მიუთითა \"\n\"თქვენი ელ.ფოსტის ანგარიში რომ დარეგისტრირდეს შემდეგ საიტზე - %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"თქვენი ელ. ფოსტის ვერიფიკაციის კოდი მოცემულია ქვემოთ. გთხოვთ შეიყვანოთ ის \"\n\"თქვენს ღია ბრაუზერის ფანჯარაში.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"იმის დასადასტურებლად, რომ ეს სწორია, გადადით %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"გთხოვთ დაადასტუროთ თქვენი ელ. ფოსტა\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"ელ. ფოსტის მისამართი %(deleted_email)s წაშლილია თქვენი ანგარიშიდან.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"ელ. ფოსტა წაშლილია\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"თქვენი შესვლის კოდი მოცემულია ქვემოთ. გთხოვთ შეიყვანოთ ის თქვენს ღია \"\n\"ბრაუზერის ფანჯარაში.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"თქვენ შეგიძლიათ უსაფრთხოდ უგულებელყოთ ეს წერილი, თუ ეს მოქმედება თქვენი \"\n\"ინიცირებული არ იყო.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"შესვლის კოდი\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"თქვენი პაროლი შეიცვალა.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"პაროლი შეიცვალა\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"თქვენი პაროლის აღდგენის კოდი მოცემულია ქვემოთ. გთხოვთ შეიყვანოთ ის თქვენს \"\n\"ღია ბრაუზერის ფანჯარაში.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"პაროლის აღდგენის კოდი\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"თქვენ იღებთ ამ ელ. წერილს, რადგან თქვენ ან სხვა ვიღაცამ მოითხოვა პაროლის \"\n\"აღდგენა თქვენს ანგარიშზე.\\n\"\n\"თქვენ შეგიძლიათ უბრალოდ უგულებელყოთ ეს ელ. წერილი, თუ ეს თქვენი მოთხოვნა არ \"\n\"იყო. დააჭირეთ ქვემოთ მოცემულ ბმულს პაროლის აღსადგენად.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"თუ თქვენ დაგავიწყდათ, თქვენი მომხმარებლის სახელია: %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"პაროლის აღდგენის ელ. წერილი\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"თქვენი პაროლი ჩამოიყარა.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"თქვენი პაროლი დაყენებულია.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"პაროლი დაყენებულია\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"თქვენ იღებთ ამ ელ. წერილს, რადგან თქვენ ან სხვა ვიღაცამ სცადა ანგარიშზე \"\n\"წვდომა ელ. ფოსტით %(email)s. თუმცა, ჩვენს მონაცემთა ბაზაში ასეთი ანგარიშის \"\n\"ჩანაწერი არ მოიძებნა.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"თუ ეს თქვენ იყავით, შეგიძლიათ დარეგისტრირდეთ ქვემოთ მოცემული ბმულის \"\n\"გამოყენებით.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"უცნობი ანგარიში\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"ელ. ფოსტის მისამართი\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"მიმდინარე ელ. ფოსტა\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"იცვლება\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"თქვენი ელფოსტის მისამართი ჯერ კიდევ ითხოვს გადამოწმებას.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"ცვლილების გაუქმება\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"შეცვლა\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"ელ. ფოსტის შეცვლა\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"დაადასტურეთ ელ. ფოსტა\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"გთხოვთ დაადასტუროთ, რომ <a href=\\\"mailto:%(email)s\\\">%(email)s</a> არის ელ. \"\n\"ფოსტის მისამართი მომხმარებლისთვის %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"ელფოსტის %(email)s დადასტურება შეუძლებელია, რადგან ის უკვე დადასტურებულია \"\n\"სხვა ანგარიშისთვის.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"ეს ელ. ფოსტის დადასტურების ბმული ვადაგასულია ან არასწორია. გთხოვთ <a \"\n\"href=\\\"%(email_url)s\\\">გააკეთოთ ახალი ელ. ფოსტის დადასტურების მოთხოვნა</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"თუ არ გაქვთ შექმნილი ანგარიში, მაშინ გთხოვთ \"\n\"%(link)sდარეგისტრირდით%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"შესვლა გასაღებით (passkey)\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"გამომიგზავნეთ შესვლის კოდი\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"გასვლა\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"დარწმუნებული ხარ, რომ გინდა გასვლა?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"შენ არ შეგიძლია წაშალო შენი პირველადი ელ. ფოსტა (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"ელ. ფოსტის დადასტურების წერილი გაგზავნილია %(email)s მისამართით.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"თქვენ დაადასტურეთ %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"ელ. ფოსტა %(email)s წაშლილია.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"თქვენ წარმატებით შეხვედით %(name)s-ად.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"თქვენ წარმატებით გახვედით თქვენი ანგარიშიდან.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"შესვლის კოდი გაგზავნილია %(recipient)s-ზე.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"პაროლი წარმატებით შეცვლილია.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"პაროლი წარმატებით დაყენებულია.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"ვერიფიკაციის კოდი გაგზავნილია %(phone)s-ზე.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"თქვენ დაადასტურეთ ტელეფონის ნომერი %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"ძირითადი ელფოსტის მისამართი დაყენებულია.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"პაროლის შეცვლა\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"დაგავიწყდა პაროლი?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"დაგავიწყდათ პაროლი? შეიყვანეთ თქვენი ელ. ფოსტის მისამართი ქვემოთ და ჩვენ \"\n\"გამოგიგზავნით ელ. წერილს პაროლის აღსადგენად.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"ჩემი პაროლის შეცვლა\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"გთხოვთ დაგვიკავშირდით თუ გაქვთ პრობლემა პაროლის შეცვლასთან.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"ჩვენ ელფოსტა გამოგიგზავნეთ. თუ არ მიგიღიათ, შეამოწმეთ თქვენი სპამის \"\n\"საქაღალდე. დაგვიკავშირდით, თუ ელფოსტას რამდენიმე წუთში არ მიიღებთ.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"შეცდომა, ცუდი კოდი\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"პაროლის აღდგენის ლინკი არასწორია, ალბათ იმის გამო რომ უკვე გამოყენებული \"\n\"იქნა. გთხოვთ მოითხოვეთ <a href=\\\"%(passwd_reset_url)s\\\">პაროლის შეცვლა \"\n\"თავიდან</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"თქვენი პაროლი ახლა შეცვლილია.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"პაროლის დაყენება\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"ტელეფონის შეცვლა\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"მიმდინარე ტელეფონი\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"თქვენი ტელეფონის ნომერი ჯერ კიდევ ითხოვს ვერიფიკაციას.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"ტელეფონის შეცვლა\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"შეიყვანეთ თქვენი პაროლი:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"თქვენ მიიღებთ სპეციალურ კოდს უპაროლო შესვლისთვის.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"კოდის მოთხოვნა\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"სხვა შესვლის ვარიანტები\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"რეგისტრაცია\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"რეგისტრაცია\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"უკვე გაქვს ანგარიში? %(link)sშესვლა%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"რეგისტრაცია გასაღებით (passkey)\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"რეგისტრაცია გასაღებით (Passkey)\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"სხვა ვარიანტები\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"რეგისტრაცია დროებით გაუქმებულია\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"ბოდიში, რეგისტრაცია დროებით გაუქმებულია.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"შენიშვნა\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"თქვენ უკვე შესული ხართ როგორც %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"გაფრთხილება:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"თქვენ ამჟამად არ გაქვთ ელ. ფოსტის მისამართი დაყენებული. რეკომენდირებულია \"\n\"დაამატოთ ელ. ფოსტის მისამართი, რათა მიიღოთ შეტყობინებები, აღადგინოთ პაროლი \"\n\"და ა.შ.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"დაადასტურეთ თქვენი ელ. ფოსტა\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"ჩვენ გამოგიგზავნეთ ელ. წერილი ვერიფიკაციისთვის. მიჰყევით მასში მოცემულ \"\n\"ბმულს, რომ დაასრულოთ რეგისტრაცია. თუ ვერ ხედავთ ვერიფიკაციის ელ. წერილს \"\n\"თქვენს ძირითად საფოსტო ყუთში, შეამოწმეთ სპამის საქაღალდე. გთხოვთ \"\n\"დაგვიკავშირდით, თუ ვერიფიკაციის ელ. წერილს რამდენიმე წუთში არ მიიღებთ.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"საიტის ეს ნაწილი ითხოვს იმის დადასტურებას, რომ\\n\"\n\"თქვენ ხართ ის, ვინც აცხადებთ, რომ ხართ. ამისთვის ჩვენ ვითხოვთ\\n\"\n\"თქვენი ელ. ფოსტის მისამართის საკუთრების დადასტურებას. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"ჩვენ გამოგიგზავნეთ ელ. წერილი\\n\"\n\"ვერიფიკაციისთვის. გთხოვთ დააჭიროთ მასში მოცემულ ბმულს. თუ ვერ ხედავთ \"\n\"ვერიფიკაციის ელ. წერილს თქვენს ძირითად საფოსტო ყუთში, შეამოწმეთ სპამის \"\n\"საქაღალდე. წინააღმდეგ შემთხვევაში\\n\"\n\"დაგვიკავშირდით, თუ მას რამდენიმე წუთში არ მიიღებთ.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>შენიშვნა:</strong> თქვენ ჯერ კიდევ შეგიძლიათ <a \"\n\"href=\\\"%(email_url)s\\\">შეცვალოთ ელ. ფოსტის მისამართი</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"შეტყობინებები:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"მენიუ:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"ანგარიშის კავშირები\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"ორფაქტორიანი ავთენტიფიკაცია\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"სესიები\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"ავტორიზაცია\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s სურს წვდომა თქვენს %(site_name)s ანგარიშზე.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"შეიყვანეთ მოწყობილობის კოდი\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"შეიყვანეთ თქვენს მოწყობილობაზე ნაჩვენები კოდი.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"გაგრძელება\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"მოწყობილობის დადასტურება\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"გთხოვთ დაადასტუროთ %(client_name)s-ზე ნაჩვენები კოდი ამ მოწყობილობის \"\n\"ავტორიზაციისთვის.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"უარყოფა\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"მოწყობილობა ავტორიზებულია\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"თქვენ წარმატებით გაიარეთ %(client_name)s მოწყობილობის ავტორიზაცია.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"მოწყობილობა უარყოფილია\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"თქვენი %(client_name)s მოწყობილობის ავტორიზაცია უარყოფილია.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"შეცდომა\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"დარჩი შესული\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"თქვენი ანგარიში დაცულია ორფაქტორიანი ავთენტიფიკაციით. გთხოვთ შეიყვანოთ \"\n\"ავთენტიფიკატორის კოდი:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"ორფაქტორიანი ავთენტიფიკაციის აღდგენის კოდების ახალი ნაკრები გენერირებულია.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"ახალი აღდგენის კოდები გენერირებულია\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"ავთენტიფიკატორის აპლიკაცია გააქტიურებულია.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"ავთენტიფიკატორის აპლიკაცია გააქტიურებულია\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"ავთენტიფიკატორის აპლიკაცია გამორთულია.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"ავთენტიფიკატორის აპლიკაცია გამორთულია\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"ახალი უსაფრთხოების გასაღები დამატებულია.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"უსაფრთხოების გასაღები დამატებულია\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"უსაფრთხოების გასაღები წაშლილია.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"უსაფრთხოების გასაღები წაშლილია\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"ავთენტიფიკატორის აპლიკაცია\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"ავთენტიფიკატორის აპლიკაციით ავთენტიფიკაცია აქტიურია.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"ავთენტიფიკატორის აპლიკაცია არ არის აქტიური.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"გამორთვა\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"გააქტიურება\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"უსაფრთხოების გასაღებები\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"თქვენ დაამატეთ %(count)s უსაფრთხოების გასაღები.\"\nmsgstr[1] \"თქვენ დაამატეთ %(count)s უსაფრთხოების გასაღები.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"უსაფრთხოების გასაღებები არ არის დამატებული.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"მართვა\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"დამატება\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"აღდგენის კოდები\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"ხელმისაწვდომია %(unused_count)s აღდგენის კოდი %(total_count)s-დან.\"\nmsgstr[1] \"ხელმისაწვდომია %(unused_count)s აღდგენის კოდი %(total_count)s-დან.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"აღდგენის კოდები არ არის დაყენებული.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"ნახვა\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"ჩამოტვირთვა\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"გენერირება\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"აღდგენის კოდების ახალი ნაკრები გენერირებულია.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"უსაფრთხოების გასაღები დამატებულია.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"უსაფრთხოების გასაღები წაშლილია.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"შეიყვანეთ ავთენტიკაციის კოდი:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\"თქვენ აპირებთ თქვენი ანგარიშისთვის აღდგენის კოდების ახალი ნაკრების \"\n\"გენერირებას.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"ეს მოქმედება გააუქმებს თქვენს არსებულ კოდებს.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"დარწმუნებული ხართ?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"გამოუყენებელი კოდები\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"კოდების ჩამოტვირთვა\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"ახალი კოდების გენერირება\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"ავთენტიფიკატორის აპლიკაციის გააქტიურება\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"თქვენი ანგარიშის ორფაქტორიანი ავთენტიფიკაციით დასაცავად, დაასკანირეთ ქვემოთ \"\n\"მოცემული QR კოდი თქვენი ავთენტიფიკატორის აპლიკაციით. შემდეგ, შეიყვანეთ \"\n\"აპლიკაციის მიერ გენერირებული ვერიფიკაციის კოდი ქვემოთ.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"ავთენტიფიკატორის საიდუმლო კოდი\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"თქვენ შეგიძლიათ შეინახოთ ეს საიდუმლო კოდი და გამოიყენოთ ის ავთენტიფიკატორის \"\n\"აპლიკაციის მოგვიანებით ხელახლა ინსტალაციისთვის.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"ავთენტიფიკატორის აპლიკაციის გამორთვა\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"თქვენ აპირებთ ავთენტიფიკატორის აპლიკაციაზე დაფუძნებული ავთენტიფიკაციის \"\n\"გამორთვას. დარწმუნებული ხართ?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"ენდობით ამ ბრაუზერს?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"თუ ამ ბრაუზერს ენდობით, შემდეგ შესვლისას ვერიფიკაციის კოდი აღარ მოგეთხოვებათ.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"ენდობა %(period)s-ის განმავლობაში\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"არ ვენდობი\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"უსაფრთხოების გასაღების დამატება\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"უსაფრთხოების გასაღების წაშლა\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"დარწმუნებული ხართ, რომ გინდათ ამ უსაფრთხოების გასაღების წაშლა?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"გამოყენება\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"გასაღები (Passkey)\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"უსაფრთხოების გასაღები\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"ეს გასაღები არ მიუთითებს, არის თუ არა ის passkey.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"დაუზუსტებელი\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"დამატებულია %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"ბოლოს გამოყენებული %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"რედაქტირება\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"უსაფრთხოების გასაღების რედაქტირება\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"შენახვა\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"გასაღების (Passkey) შექმნა\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"თქვენ აპირებთ თქვენი ანგარიშისთვის გასაღების (passkey) შექმნას. რადგან \"\n\"მოგვიანებით დამატებითი გასაღებების დამატებაც შეგიძლიათ, შეგიძლიათ აღწერითი \"\n\"სახელი გამოიყენოთ მათ გასარჩევად.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"შექმნა\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"ეს ფუნქცია მოითხოვს JavaScript-ს.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"მესამე მხარის ანგარიშით შესვლის შეცდომა\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"დაფიქსირდა შეცდომა მესამე მხარის ანგარიშით შესვლის მცდელობისას.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"თქვენ შეგიძლიათ შეხვიდეთ თქვენს ანგარიშში რომელიმე შემდეგი მესამე მხარის \"\n\"ანგარიშის გამოყენებით:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"\"\n\"თქვენ ამჟამად არ გაქვთ ამ ანგარიშთან დაკავშირებული მესამე მხარის ანგარიშები.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"მესამე მხარის ანგარიშის დამატება\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"\"\n\"%(provider)s-ის მესამე მხარის ანგარიში დაკავშირებულია თქვენს ანგარიშთან.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"მესამე მხარის ანგარიში დაკავშირებულია\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"%(provider)s-ის მესამე მხარის ანგარიში გათიშულია თქვენი ანგარიშიდან.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"მესამე მხარის ანგარიში გათიშულია\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"%(provider)s ანგარიშის დაკავშირება\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"\"\n\"თქვენ აპირებთ %(provider)s-ის ახალი მესამე მხარის ანგარიშის დაკავშირებას.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"შესვლა %(provider)s ანგარიშით\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"თქვენ აპირებთ შესვლას %(provider)s-ის მესამე მხარის ანგარიშით.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"შესვლა გაუქმებულია\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"თქვენ გადაწყვიტეთ გააუქმოთ შესვლა ჩვენს საიტზე თქვენი ერთ-ერთი არსებული \"\n\"ანგარიშის გამოყენებით. თუ ეს შეცდომა იყო, გთხოვთ <a \"\n\"href=\\\"%(login_url)s\\\">ხელახლა შედით</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"მესამე მხარის ანგარიში დაკავშირებულია.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"მესამე მხარის ანგარიში გათიშულია.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"თქვენ აპირებთ გამოიყენოთ თქვენი %(provider_name)s ანგარიში შესასვლელად\\n\"\n\"%(site_name)s-ზე. როგორც საბოლოო ნაბიჯი, გთხოვთ შეავსეთ ეს ფორმა:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"ან გამოიყენეთ მესამე მხარე\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"ყველა სხვა სესიიდან გასვლა შესრულებულია.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"დაწყებულია\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP მისამართი\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"ბრაუზერი\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"ბოლოს ნანახი\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"მიმდინარე\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"სხვა სესიებიდან გასვლა\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"მომხმარებლის სესიები\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"სესიის გასაღები\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"ანგარიშის კავშირები\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"პაროლი უნდა შეიცავდეს მინიმუმ {0} სიმბოლოს.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"თქვენ იღებთ ამ ელ. წერილს რადგან თქვენ ან სხვა ვიღაცამ მოითხოვა პაროლის \"\n#~ \"შეცვლა თქვენს ანგარიშზე.\\n\"\n#~ \"თქვენ შეგიძლიათ უბრალოდ დააიგნოროთ ეს ელ. წერილი თუ ეს თქვენი მოთხოვნა არ \"\n#~ \"იყო. დააჭირეთ ქვემოთ მოცემულ ლინკს პაროლის აღსადგენად.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"შემდეგი ელ.ფოსტის მისამართები ასოცირდება თქვენს ანგარიშთან:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"დაადასტურეთ ელ. ფოსტა\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"გთხოვთ შედით რომელიმე\\n\"\n#~ \"სოციალური ანგარიშით. ან, %(link)sდარეგისტრირდით %(end_link)s\\n\"\n#~ \"ან შედით %(site_name)s საიტზე\"\n\n#~ msgid \"or\"\n#~ msgstr \"ან\"\n\n#~ msgid \"change password\"\n#~ msgstr \"პაროლის შეცვლა\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"OpenID-ით შესვლა\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"ეს ელ.ფოსტის მისამართი უკვე დაკავშირებულია სხვა ანგარიშთან.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"ჩვენ გამოგიგზავნეთ ელ. წერილი. გთხოვთ დაგვიკავშირდით თუ არ მიიღებთ \"\n#~ \"რამდენიმე წუთში.\"\n"
  },
  {
    "path": "allauth/locale/ko/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-09-17 16:01+0000\\n\"\n\"Last-Translator: Hyunjoon <yi.hyunjoon@gmail.com>\\n\"\n\"Language-Team: Korean <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/ko/>\\n\"\n\"Language: ko\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 5.14-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"해당 계정은 현재 비활성화 상태입니다.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"주 이메일은 제거할 수 없습니다.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"해당 이메일은 이미 이 계정에 등록되어 있습니다.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"이메일 또는 비밀번호가 올바르지 않습니다.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"전화번호 또는 비밀번호가 올바르지 않습니다.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"해당 이메일은 이미 사용되고 있습니다.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"현재 비밀번호를 입력하세요.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"올바르지 않은 코드.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"올바르지 않은 비밀번호.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"올비르지 않거나 만료된 키.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"유효하지 않은 로그인입니다.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"비밀번호 초기화 토큰이 올바르지 않습니다.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"이메일 주소는 %d개 이상 추가할 수 없습니다.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"해당 전화번호는 이미 사용되고 있습니다.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"너무 많은 로그인 실패가 감지되었습니다. 잠시 후에 다시 시도하세요.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"해당 이메일 주소와 연결된 사용자 계정이 없습니다.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"해당 전화번호와 연결된 사용자 계정이 없습니다.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"주 이메일은 인증이 필요합니다.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"해당 아이디는 이미 사용중입니다. 다른 사용자명을 이용해 주세요.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"아이디 또는 비밀번호가 올바르지 않습니다.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"하나만 선택해 주세요.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"새 값은 현재 값과 달라야 합니다.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"잠시만 기다려 주세요. 요청을 너무 많이 보내고 있습니다.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"비밀번호를 사용하세요\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"인증 앱 또는 코드를 사용하세요\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"보안키를 사용하세요\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email}을(를) 인증됨으로 표시했습니다.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"{email}을(를) 인증 완료로 표시하지 못했습니다.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"선택된 이메일 주소를 인증됨으로 표시\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"계정\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"이메일\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"이메일 주소\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"국가 코드를 포함한 전화번호를 입력하세요 (예: 미국의 경우 +1).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"전화번호\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"동일한 비밀번호를 입력해야 합니다.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"비밀번호\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"아이디 저장\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"아이디\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"로그인\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"아이디, 이메일 또는 전화번호\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"아이디 또는 이메일\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"아이디 또는 전화번호\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"이메일 또는 전화번호\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"비밀번호를 잊으셨나요?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"이메일 (확인)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"이메일 주소 확인\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"이메일 (선택사항)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"아이디 (선택사항)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"동일한 이메일을 입력해야 합니다.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"비밀번호 (확인)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"현재 비밀번호\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"새 비밀번호\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"새 비밀번호 (확인)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"코드\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"사용자\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"이메일 주소\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"인증완료\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"주\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"이메일 주소\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"생성됨\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"전송됨\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"키\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"이메일 확인\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"이메일 확인\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"헤드리스\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"사용자 ID 보기\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"이메일 주소 보기\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"기본 프로필 정보 보기\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"권한 부여\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"'URI 와일드카드 허용'이 활성화되지 않은 경우 와일드카드를 사용할 수 없습니다.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}'에 와일드카드(*)가 두 개 이상 포함되어 있습니다. URI당 와일드카드는 \"\n\"하나만 허용됩니다.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"와일드카드는 URI의 호스트명 부분에서만 허용됩니다.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"인가 코드\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"디바이스 코드\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"클라이언트 자격 증명\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"리프레시 토큰\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"기밀\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"공개\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"클라이언트가 요청할 수 있는 범위(scope)입니다. 한 줄에 하나씩 입력하세요. \"\n\"예: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"클라이언트가 범위를 지정하지 않은 경우 이 기본 범위가 사용됩니다. 한 줄에 하\"\n\"나씩 입력하세요. 예: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"허용된 인가 유형 목록입니다. 한 줄에 하나씩 입력하세요. 예: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"교차 출처 요청에 허용된 출처 목록입니다. 한 줄에 하나씩 입력하세요.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"리디렉트 URI 및 CORS 출처에서 와일드카드(*)를 허용합니다. 활성화하면 URI에 단\"\n\"일 별표를 포함하여 하위 도메인을 매칭할 수 있습니다.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"허용된 응답 유형 목록입니다. 한 줄에 하나씩 입력하세요. 예: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"클라이언트\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"클라이언트 목록\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"2단계 인증으로 보호되는 계정에 이메일 주소를 추가할 수 없습니다.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"2단계 인증을 비활성화 할 수 없습니다.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"2단계 인증을 활성화하지 않으면 복구 코드를 생성할 수 없습니다.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"이메일 주소를 인증하기 전까지는 2단계 인증을 활성화할 수 없습니다.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"마스터 키\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"벡업 키\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"키 번호. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"복구 코드\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP 인증\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"웹인증\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"인증 코드\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"비밀번호 없음\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"비밀번호 없는 작업을 활성화하면 이 키만 사용하여 로그인할 수 있지만, 생체 인\"\n\"식이나 PIN 보호와 같은 추가 요구 사항이 적용됩니다.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"해당 이메일을 사용중인 계정이 이미 존재합니다. 해당 계정으로 로그인 후에 %s \"\n\"계정으로 연결하세요.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"유효하지 않은 토큰.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"당신의 계정에 비밀번호가 설정되어있지 않습니다.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"당신의 계정에는 인증된 이메일이 없습니다.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"마지막 남은 소셜 계정은 연결해제 할수 없습니다.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"해당 소셜 계정이 이미 다른 계정에 연결되어 있습니다.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"소셜 계정\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"제공자\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"제공자 ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"이름\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"클라이언트 아이디\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"앱 아이디 또는 컨슈머 아이디\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"비밀 키\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API 비밀 키, 클라이언트 비밀 키, 또는 컨슈머 비밀 키\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"키\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"소셜 애플리케이션\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"소셜 애플리케이션\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"사용자 식별\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"최종 로그인\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"가입 날짜\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"추가 정보\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"소셜 계정\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"소셜 계정\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"토큰\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) 또는 access token (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"시크릿 토큰\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) 또는 refresh token (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"만료일\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"소셜 애플리케이션 토큰\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"소셜 애플리케이션 토큰\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"올바르지 않은 프로필 데이터\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"로그인\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"취소\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"\\\"%s\\\".로 부터 요청 토큰을 받는 도중 잘못된 응답을 받았습니다. 응답은 %s였습\"\n\"니다.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\".로 부터 access 토큰을 받는 도중 잘못된 응답을 받았습니다.\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\".을(를) 위한 request 토큰이 없습니다.\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\".을(를) 위한 access 토큰이 없습니다.\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\".에 접근하기 위한 권한이 없습니다.\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\".로 부터 request 토큰을 받는 도중 잘못된 응답을 받았습니다.\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"계정 비활성\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"해당 계정은 비활성화된 상태입니다.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"%(recipient)s(으)로 코드를 보냈습니다. 코드가 곧 만료되므로 즉시 입력하세요.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"확인\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"새 코드 요청\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"접근 확인\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"계정을 보호하려면 다시 인증하세요.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"대체 옵션\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"이메일 인증\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"이메일 인증 코드 입력\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"다른 이메일 주소 사용\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"로그인\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"로그인 코드 입력\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"비밀번호 초기화\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"비밀번호 초기화 코드 입력\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"전화번호 인증\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"전화번호 인증 코드 입력\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"다른 전화번호 사용\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"이메일 계정\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"다음 이메일 주소들이 당신의 계정에 등록되어 있습니다.\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"인증완료\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"인증대기\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"주\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"주 이메일로 지정\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"인증 재전송\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"제거\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"이메일 주소 추가\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"이메일 추가\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"정말로 선택하신 이메일을 제거하시겠습니까?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"귀하 또는 다른 사람이 다음 이메일 주소를 사용하여 계정을 등록하려고 시도했기\"\n\"에 이 이메일을 받으셨습니다:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"하지만 이 이메일 주소를 사용하는 계정이 이미 존재합니다. 혹시 이 사실을 잊으\"\n\"셨다면, 비밀번호 찾기 절차를 통해 계정을 복구해 주세요:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"계정이 이미 존재합니다\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"안녕하세요 %(site_name)s입니다!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"%(site_name)s 서비스를 이용해 주셔서 감사합니다!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"귀하의 계정에 다음과 같은 변경이 이루어졌기 때문에 이 메일을 받으셨습니다:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"이 변경 사항을 인지하지 못하셨다면 즉시 적절한 보안 조치를 취해주시기 바랍니\"\n\"다. 귀하의 계정 변경 출처는 다음과 같습니다:\\n\"\n\"\\n\"\n\"- IP 주소: %(ip)s\\n\"\n\"- 브라우저: %(user_agent)s\\n\"\n\"- 날짜: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"귀하의 이메일이 %(from_email)s에서 %(to_email)s(으)로 변경되었습니다.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"이메일 변경됨\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"이메일이 확인 되었습니다.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"이메일 확인\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"%(user_display)s 님이 %(site_domain)s에서 계정을 등록하기 위해 귀하의 이메일 \"\n\"주소를 제공하였기 때문에 이 이메일을 받으셨습니다.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"이메일 인증 코드가 아래에 나와 있습니다. 열린 브라우저 창에 입력해 주세요.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"이메일 주소를 확인하기 위해, %(activate_url)s을 클릭하세요\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"이메일 주소를 확인하세요.\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"이메일 주소 %(deleted_email)s이(가) 귀하의 계정에서 삭제되었습니다.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"이메일 제거됨\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"귀하의 로그인 코드는 아래에 나와 있습니다. 열린 브라우저 창에 입력해 주시기 \"\n\"바랍니다.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"이 메일은 귀하가 이 작업을 시작하지 않았다면 안전하게 무시하셔도 됩니다.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"로그인 코드\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"비밀번호가 변경되었습니다.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"비밀번호 변경됨\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"비밀번호 초기화 코드가 아래에 나와 있습니다. 열린 브라우저 창에 입력해 주세\"\n\"요.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"비밀번호 초기화 코드\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"회원님의 계정에 대한 암호 변경 요청이 접수되었습니다.\\n\"\n\"패스워드 초기화를 원치 않는 경우 본 메일을 무시해 주십시요. 변경을 요청할 경\"\n\"우 아래 링크를 클릭하세요.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"잊어버린 경우를 대비하여, 회원님의 사용자 이름은 %(username)s 입니다.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"비밀번호 초기화 이메일\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"비밀번호가 초기화 되었습니다.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"비밀번호가 설정되었습니다.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"비밀번호 설정\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"귀하 또는 다른 사람이 이메일 %(email)s로 계정에 접근하려 했기 때문에 이 이메\"\n\"일을 받으셨습니다. 그러나 저희 데이터베이스에는 해당 계정의 기록이 없습니다.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"이 작업이 귀하에 의해 이루어진 것이라면, 아래 링크를 사용하여 계정을 등록할 \"\n\"수 있습니다.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"알 수 없는 계정\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"이메일 계정\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"현재 이메일\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"변경 중\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"귀하의 이메일 주소는 아직 검증 중입니다.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"변경 취소\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"변경\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"이메일 변경\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"이메일 확인\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"<a href=\\\"mailto:%(email)s\\\">%(email)s</a>이 사용자 %(user_display)s의 이메일\"\n\"이 맞는지 확인해 주세요.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"%(email)s은 다른 계정에서 이미 확인되었기 때문에 확인할 수 없습니다.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"이 이메일 확인 링크는 만료되었거나 유효하지 않습니다. <a \"\n\"href=\\\"%(email_url)s\\\">새로운 이메일 확인 요청</a>을 해주세요.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"계정이 없다면 %(link)s회원가입%(end_link)s을 진행하세요.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"패스키로 로그인\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"로그인 코드 받기\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"로그아웃\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"정말로 로그아웃 하시겠습니까?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"주 이메일은 제거할 수 없습니다 (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"%(email)s 으로 확인 메일이 전송되었습니다.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"%(email)s 을 확인하였습니다.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"%(email)s 을 제거하였습니다.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"%(name)s 으로 로그인 되었습니다.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"로그아웃 되었습니다.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"로그인 코드가 %(recipient)s(으)로 발송되었습니다.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"비밀번호가 성공적으로 변경되었습니다.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"비밀번호가 성공적으로 설정되었습니다.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"인증 코드가 %(phone)s(으)로 발송되었습니다.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"전화번호 %(phone)s이(가) 인증되었습니다.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"주 이메일이 지정되었습니다.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"비밀번호 변경\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"비밀번호를 잊으셨나요?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"비밀번호를 잊으셨나요? 아래에 당신의 이메일을 입력하시면, 비밀번호 초기화 이\"\n\"메일을 전송해 드리겠습니다.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"비밀번호 초기화\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"비밀번호 초기화에 문제가 있으시면 저희에게 연락주세요.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"메일을 전송하였습니다. 메일을 받지 못했다면 스팸 폴더를 확인해주세요.몇 분 후\"\n\"에도 메일을 받지 못하시면 저희에게 연락주세요.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"올비르지 않은 토큰\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"비밀번호 초기화 링크가 올바르지 않습니다. 다시 <a \"\n\"href=\\\"%(passwd_reset_url)s\\\">비밀번호 초기화</a> 하세요.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"비밀번호가 변경되었습니다.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"비밀번호 설정\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"전화번호 변경\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"현재 전화번호\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"귀하의 휴대전화 번호는 아직 승인 전 입니다.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"전화번호 변경\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"패스워드 입력:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"비밀번호 없이 로그인할 수 있는 특별 코드를 받게 됩니다.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"코드 요청\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"다른 로그인 옵션\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"회원가입\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"회원가입\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"이미 계정이 있으신가요? 바로 %(link)s로그인%(end_link)s 하세요.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"패스키로 회원가입\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"패스키 회원가입\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"다른 옵션\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"회원가입 종료\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"죄송합니다. 회원가입은 현재 종료되었습니다.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"메모\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"%(user_display)s 로 이미 로그인 되어있습니다.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"경고: \"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"등록된 이메일이 없습니다. 알림, 비밀번호 초기화 등을 위해 이메일을 등록해야 \"\n\"합니다.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"이메일을 인증하세요\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"인증 메일이 전송되었습니다. 회원가입 완료를 위해 전송된 메일의 링크를 클릭하\"\n\"세요. 인증 메일을 받지 못했다면 스팸 폴더를 확인해주세요. 몇 분 후에도 메일\"\n\"이 전송되지 않으면 저희에게 연락주세요.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"해당 페이지는 계정 소유주가 맞는지\\n\"\n\"확인해야합니다.\\n\"\n\"이를 위해 이메일 주소 소유권을 확인해야 합니다.\"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"인증 메일이 전송되었습니다. \\n\"\n\"회원가입 완료를 위해 전송된 메일의 링크를 클릭하세요. 인증 메일을 받지 못했다\"\n\"면 스팸 폴더를 확인해주세요. 몇 분 후에도 메일이 전송되지 않으면 저희에게 연\"\n\"락주세요.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>메모:</strong> <a href=\\\"%(email_url)s\\\">이메일 변경</a>이 가능합니\"\n\"다.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"메시지:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"메뉴:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"계정 연결\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"2단계 인증\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"세션\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"승인\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s이(가) 귀하의 %(site_name)s 계정에 접근하려고 합니다.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"디바이스 코드 입력\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"디바이스에 표시된 코드를 입력하세요.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"계속\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"디바이스 확인\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"이 디바이스를 승인하려면 %(client_name)s에 표시된 코드를 확인해 주세요.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"거부\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"디바이스 승인됨\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"%(client_name)s 디바이스가 성공적으로 승인되었습니다.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"디바이스 거부됨\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"%(client_name)s 디바이스에 대한 승인이 거부되었습니다.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"오류\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"로그인 유지\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"귀하의 계정은 2단계 인증으로 보호되고 있습니다. 인증 코드 입력해 주세요:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"새로운 2단계 인증 복구 코드 세트가 생성되었습니다.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"새로운 복구 코드가 생성되었습니다.\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"인증 앱이 활성화 되었습니다.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"인증 앱이 활성화 되었습니다.\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"인증 앱이 비활성화 되었습니다.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"인증 앱이 비활성화 되었습니다.\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"새로운 보안키가 추가되었습니다.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"보안키 추가됨\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"보안 키가 제거되었습니다.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"보안키 제거됨\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"인증 앱\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"인증 앱을 사용한 인증이 활성화 되었습니다.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"인증 앱이 활성화 되지 않았습니다.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"비활성화\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"활성화\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"보안키\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"%(count)s 를 보안 키로 설정하였습니다.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"보안키가 추가되지 않았습니다.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"관리\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"추가\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"복구 코드\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"총 %(total_count)s개 계정 중 %(unused_count)s개의 계정이 복구 코드 설정 가능\"\n\"합니다.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"복구 코드가 설정되지 않았습니다.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"보기\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"다운로드\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"생성\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"새로운 복구 코드 세트가 생성되었습니다.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"보안 키가 추가 되었습니다.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"보안 키가 삭제되었습니다.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"인증 코드 입력:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"귀하의 계정을 위한 새로운 복구 코드 세트를 생성하려고 합니다.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"이 작업은 기존 코드를 무효화 합니다.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"확실하세요?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"사용되지 않은 코드\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"코드 다운로드\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"새로운 코드 생성\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"인증 앱 활성화\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"귀하의 계정을 2단계 인증으로 보호하려면 아래의 QR 코드를 인증기 앱으로 스캔하\"\n\"세요. 그런 다음, 앱에서 생성된 인증 코드를 아래에 입력하세요.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"인증 secret\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"이 secret을 저장해 두면 나중에 인증기 앱을 재설치할 때 사용할 수 있습니다.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"인증 앱 비활성화\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"인증 앱 기반 인증을 비활성화하려고 합니다. 확실하세요?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"이 브라우저를 신뢰하시겠습니까?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"이 브라우저를 신뢰하면 다음에 로그인할 때 인증 코드를 요청하지 않습니다.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"%(period)s 동안 신뢰\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"신뢰하지 않음\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"보안키 추가\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"보안키 제거\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"정말로 보안키를 제거하시겠습니까?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"사용\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"패스키\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"보안 키\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"이 키는 패스키인지 여부를 나타내지 않습니다.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"지정되지 않음\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"%(created_at)s에 추가됨\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"%(last_used)s에 마지막으로 사용됨\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"변경\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"보안 키 변경\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"저장\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"패스키 생성\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"귀하의 계정을 위한 보안 키 인증을 설정하세요. 그리고 나서 보안 키를 추가적으\"\n\"로 설정할 수 있습니다.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"생성\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"이 기능은 자바스크립트를 요구합니다.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"소셜 로그인 실패\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"소셜 계정을 통해 로그인 하는 도중 오류가 발생했습니다.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"다음 소셜 계정들을 통해 로그인 할 수 있습니다:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"해당 계정에 연결되어있는 소셜 계정이 없습니다.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"소셜 계정을 추가하세요.\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"%(provider)s로 부터 소셜 계정이 귀하의 계정에 연결되었습니다.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"소셜 계정 연결됨.\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"%(provider)s로 부터 소셜 계정이 귀하의 계정에서 연결이 해제되었습니다.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"소셜 계정이 연결 해제됨\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"%(provider)s 계정 연결\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"%(provider)s에서 제공하는 소셜 계정을 연결하려 합니다.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"%(provider)s을 통한 로그인\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"소셜 %(provider)s의 계정을 사용해 로그인을 진행하려 합니다.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"로그인 취소됨\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"기존 계정중 하나를 사용한 로그인을 취소하였습니다. 실수로 인한 경우, <a \"\n\"href=\\\"%(login_url)s\\\">로그인</a>을 진행해 주세요.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"소셜 계정이 연결되었습니다.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"소셜 계정 연결이 해제되었습니다.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"%(provider_name)s 의 계정을 이용하여 %(site_name)s 으로 로그인하려 합니다.\\n\"\n\"마지막으로 다음 폼을 작성해주세요:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"또는 소셜을 사용하세요.\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"모든 다른 세션에서 로그아웃되었습니다.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"시작 시작\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP 주소\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"브라우저\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"마지막으로 본 시간\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"현재\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"다른 세션에서 로그아웃\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"사용자 세션\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"세션 키\"\n\n#~ msgid \"Account Connection\"\n#~ msgstr \"계정 연결\"\n"
  },
  {
    "path": "allauth/locale/ky/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2024-04-20 21:44+0200\\n\"\n\"Last-Translator: Murat Jumashev <jumasheff at gmail dot com>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\"Language: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Poedit 1.5.4\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Бул эсеп учурда активдүү эмес.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Негизги эмейл даректи алып салуу мүмкүн эмес.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Бул эмейл дарек ушул эсеп менен буга чейин туташтырылган.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Сиз берген эмейл дарек жана/же купуя туура эмес.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Сиз берген телефон номери жана/же купуя туура эмес.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Мындай эмейл менен катталган колдонуучу бар.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Учурдагы купуяңызды жазыңыз.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Код туура эмес.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Купуя туура эмес.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Ачкыч туура эмес же мөөнөтү өткөн.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Кирүү туура эмес.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Купуяны жаңыртуу токени туура эмес.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Сиз %d эмейл даректен ашык кошо албайсыз.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Мындай телефон номери менен катталган колдонуучу бар.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Өтө көп жолу кирүү аракеттери жасалды. Кайрадан аракеттениңиз.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Эмейл дарек эч бир колдонуучу эсебине байланган эмес.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Телефон номери эч бир колдонуучу эсебине байланган эмес.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Негизги эмейл дарегиңиз дурусталышы керек.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Бул атты колдонуу мүмкүн эмес. Башкасын тандаңыз.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Сиз берген колдонуучу аты жана/же купуя туура эмес.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Бирөөнү гана тандаңыз.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Жаңы маани азыркысынан айырмаланышы керек.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Сабырдуу болуңуз, сиз өтө көп сурам жөнөтүп жатасыз.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Купуяңызды колдонуңуз\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Аутентификатор колдонмосун же кодду колдонуңуз\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Коопсуздук ачкычын колдонуңуз\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} дурусталган деп белгиленди.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"{email} дурусталган деп белгилөө ишке ашкан жок.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Тандалган эмейл даректерди дурусталган деп белгилөө\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Эсептер\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"Эмейл\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Эмейл дарек\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Өлкө коду менен телефон номерин жазыңыз (мис. АКШ үчүн +1).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Телефон\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Сиз ошол эле купуяны кайрадан териңиз.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Купуя\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Мени эстеп кал\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Колдонуучу аты\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Кирүү\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Колдонуучу аты, эмейл же телефон\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Колдонуучу аты же эмейл\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Колдонуучу аты же телефон\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Эмейл же телефон\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Купуяңызды унуттуңузбу?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"Эмейл (кайрадан)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Эмейл дарек ырастоо\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"Эмейл (милдеттүү эмес)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Колдонуучу аты (милдеттүү эмес)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Ар бир жолу бирдей эмейлди терүүңүз керек.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Купуя (дагы бир жолу)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Азыркы купуя\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Жаңы купуя\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Жаңы купуя (кайрадан)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Код\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"колдонуучу\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"эмейл дарек\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"дурусталган\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"негизги\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"эмейл даректер\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"түзүлгөн\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"жөнөтүлгөн\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"ачкыч\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"эмейл ырастоо\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"эмейл ырастоолор\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Колдонуучу ID'ңизди көрүү\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Эмейл дарегиңизди көрүү\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Негизги профил маалыматыңызды көрүү\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Уруксаттарды берүү\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"'URI белгилерине уруксат берүү' иштетилмегенче, белгилерге (*) уруксат \"\n\"берилбейт.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' бирден көп белги (*) камтыйт. Бир URI үчүн бир гана белгиге уруксат \"\n\"берилет.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Белгилерге (*) URI'дин хост аты бөлүгүндө гана уруксат берилет.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Авторизация коду\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Түзмөк коду\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Кардар мандаттары\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Жаңыртуу токени\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Жашыруун\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Жалпыга ачык\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Кардар суроого укуктуу чөйрөлөр. Бир сапка бир маани жазыңыз, мис.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Эгерде кардар чөйрө көрсөтпөсө, бул демейки чөйрөлөр колдонулат. Бир сапка \"\n\"бир маани жазыңыз, мис.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Уруксат берилген грант типтеринин тизмеси. Бир сапка бир маани жазыңыз, \"\n\"мис.: authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Кайчылаш суроолор үчүн уруксат берилген булактардын тизмеси, бир сапка \"\n\"бирден.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Кайра багыттоо URI'лерде жана CORS булактарында белгилерге (*) уруксат \"\n\"берүү. Иштетилгенде, URI'лер субдомендерди дал келтирүү үчүн бир жылдызча \"\n\"камтый алат.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Уруксат берилген жооп типтеринин тизмеси. Бир сапка бир маани жазыңыз, мис.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"кардар\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"кардарлар\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Эки кадамдуу аутентификация менен корголгон эсепке эмейл дарек кошо албайсыз.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Эки кадамдуу аутентификацияны өчүрө албайсыз.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Эки кадамдуу аутентификация иштетилбей калыбына келтирүү коддорун түзө \"\n\"албайсыз.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Эмейл дарегиңизди дурусталмайынча эки кадамдуу аутентификацияны иштете \"\n\"албайсыз.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Башкы ачкыч\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Камдык ачкыч\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Ачкыч №{number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Калыбына келтирүү коддору\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP Аутентификатор\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Аутентификатор коду\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Купуясыз\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Купуясыз режимди иштетүү бул ачкычты гана колдонуп кирүүгө мүмкүнчүлүк \"\n\"берет, бирок биометрика же PIN коргоо сыяктуу кошумча талаптарды коёт.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Бул эмейл менен башка эсеп катталган. Алгач ошол эсепке кирип, %s эсебиңизди \"\n\"туташтырыңыз.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Токен туура эмес.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Сиздин эсебиңизде купуя орнотулган эмес.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Сиздин эсебиңизде дурусталган эмейл даректер жок.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Акыркы калган үчүнчү тарап эсебиңизди ажырата албайсыз.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Бул үчүнчү тарап эсеби башка эсепке туташтырылган.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Социалдык эсептер\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"провайдер\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"провайдер ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"аты\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"кардар id'си\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"Колдонмо ID'си, же керектөөчү ачкычы\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"жашыруун ачкыч\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API, кардар же керектөөчүнүн жашыруун ачкычы\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Ачкыч\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"социалдык колдонмо\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"социалдык колдонмолор\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"акыркы кириши\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"кошулган күнү\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"кошумча маалымат\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"социалдык эсеп\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"социалдык эсептер\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"токен\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) же жетки токени (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"токендин жашыруун ачкычы\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) же жаңыртуу токени (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"мөөнөтү аяктайт\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"социалдык колдонмо токени\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"социалдык колдонмо токендери\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Профил маалыматы туура эмес\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Кирүү\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Жокко чыгаруу\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\\\"%s\\\" тарабынан сурам токенин алууда туура эмес жооп келди. Жооп: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\" тарабынан жетки токенин алууда туура эмес жооп келди.\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\" үчүн сурам токени сакталган жок.\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\" үчүн жетки токени сакталган жок.\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\" тарабындагы жеке ресурстарга жетки жок.\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\" тарабынан сурам токенин алууда туура эмес жооп келди.\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Эсеп активдүү эмес\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Бул эсеп активдүү эмес.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Биз %(recipient)s дарегине код жөнөттүк. Коддун мөөнөтү жакында бүтөт, \"\n\"андыктан тезирээк жазыңыз.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Ырастоо\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Жаңы код сурануу\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Кирүүнү ырастаңыз\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Эсебиңизди коргоо үчүн кайрадан аутентификация өтүңүз.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Альтернативалуу варианттар\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Эмейл дурустоо\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Эмейл дурустоо кодун жазыңыз\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Башка эмейл дарек колдонуңуз\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Кирүү\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Кирүү кодун жазыңыз\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Купуяны жаңыртуу\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Купуяны жаңыртуу кодун жазыңыз\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Телефон дурустоо\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Телефон дурустоо кодун жазыңыз\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Башка телефон номерин колдонуңуз\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Эмейл даректер\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Төмөнкү эмейл даректер сиздин эсебиңизге байланган:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Дурусталган\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Дурустала элек\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Негизги\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Негизги кылуу\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Дурустоо катын кайрадан жиберүү\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Алып салуу\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Эмейл дарек кошуу\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Эмейл кошуу\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Тандалган эмейл даректи алып салууну дурустайсызбы?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Сиз же башка бирөө төмөнкү эмейл дарек менен\\n\"\n\"эсеп каттоого аракет кылгандыктан бул катты алып жатасыз:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Бирок, бул эмейл дарек менен эсеп мурунтан эле бар. Эгерде сиз муну\\n\"\n\"унутуп калган болсоңуз, эсебиңизди калыбына келтирүү үчүн купуя жаңыртуу\\n\"\n\"процедурасын колдонуңуз:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Эсеп мурунтан эле бар\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"%(site_name)s сайтынан салам!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"%(site_name)s сайтын колдонгонуңузга алкыш!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"Эсебиңизде төмөнкү өзгөрүү болгондуктан бул катты алып жатасыз:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Эгерде бул өзгөрүүнү тааныбасаңыз, дароо тиешелүү коопсуздук чараларын \"\n\"көрүңүз. Эсебиңиздеги өзгөрүү төмөнкүдөн келген:\\n\"\n\"\\n\"\n\"- IP дарек: %(ip)s\\n\"\n\"- Браузер: %(user_agent)s\\n\"\n\"- Дата: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Эмейлиңиз %(from_email)s дарегинен %(to_email)s дарегине өзгөртүлдү.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Эмейл өзгөртүлдү\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Эмейлиңиз дурусталды.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Эмейл ырастоо\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"%(user_display)s деген колдонуучу %(site_domain)s деген сайтта эсеп каттоо \"\n\"үчүн сиздин эмейл дарегиңизди берген болгондуктан, бул катты алып жатасыз.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Эмейлиңизди дурустоо кодуңуз төмөндө берилген. Аны ачык браузер терезеңизге \"\n\"жазыңыз.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Бул туура экенин ырастоо үчүн %(activate_url)s дарегине өтүңүз\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Эмейл дарегиңизди ырастаңыз\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"%(deleted_email)s эмейл дареги эсебиңизден алып салынды.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Эмейл алып салынды\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"Кирүү кодуңуз төмөндө берилген. Аны ачык браузер терезеңизге жазыңыз.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Эгерде бул аракетти сиз баштабаган болсоңуз, бул катка көңүл бурбай коюсаңыз \"\n\"болот.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Кирүү коду\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Купуяңыз өзгөртүлдү.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Купуя өзгөртүлдү\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Купуяны жаңыртуу кодуңуз төмөндө берилген. Аны ачык браузер терезеңизге \"\n\"жазыңыз.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Купуяны жаңыртуу коду\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Сиз же башка бирөө сиздин эсебиңиздин купуясын жаңыртуу сурамын \"\n\"жөнөткөндүктөн бул катты алып жатасыз.\\n\"\n\"Эгерде сурамды сиз жөнөтпөгөн болсоңуз, бул катка көңүл бурбай эле коюңуз. \"\n\"Купуяны жаңыртуу үчүн төмөндөгү шилтемени басыңыз.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Эстей албай жатсаңыз, сиздин колдонуучу атыңыз %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Купуяны жаңыртуу эмейли\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Купуяңыз жаңыртылды.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Купуяңыз коюлду.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Купуя коюлду\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Сиз же башка бирөө %(email)s эмейл дареги менен эсепке кирүүгө аракет \"\n\"кылгандыктан бул катты алып жатасыз. Бирок, биздин базада мындай эсеп жок.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Эгерде бул сиз болсоңуз, төмөнкү шилтеме аркылуу эсеп каттасаңыз болот.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Белгисиз эсеп\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Эмейл дарек\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Азыркы эмейл\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Өзгөртүлүүдө\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Эмейл дарегиңиз дагы деле дурусталбай турат.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Өзгөртүүнү жокко чыгаруу\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Өзгөртүү\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Эмейлди өзгөртүү\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Эмейл даректи ырастаңыз\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"<a href=\\\"mailto:%(email)s\\\">%(email)s</a> деген эмейл дарек \"\n\"%(user_display)s колдонуучусуна таандык экенин ырастаңыз.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"%(email)s дарегин ырастоо мүмкүн эмес, анткени ал башка эсеп тарабынан \"\n\"мурунтан эле ырасталган.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Бул эмейлди ырастоо шилтемесинин мөөнөтү өтүп кеткен же ал туура эмес. <a \"\n\"href=\\\"%(email_url)s\\\">Эмейлди ырастоо сурамын кайрадан жөнөтүңүз</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Эгерде сиз эсеп түзө элек болсоңуз, анда биринчи \"\n\"%(link)sкатталыңыз%(end_link)s\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Passkey менен кирүү\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Мага кирүү кодун жөнөтүңүз\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Чыгуу\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Сиз чыгып жатканыңызды дурустайсызбы?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Негизги эмейл даректи алып салуу мүмкүн эмес (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Ырастоо эмейли %(email)s дарегине жөнөтүлдү.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Сиз %(email)s дарегин ырастадыңыз.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"%(email)s дарегин алып салдык.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"%(name)s аты менен ийгиликтүү кирдик.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Сиз чыгып кеттиңиз.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Кирүү коду %(recipient)s дарегине жөнөтүлдү.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Купуя ийгиликтүү өзгөртүлдү.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Купуя ийгиликтүү орнотулду.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Дурустоо коду %(phone)s номерине жөнөтүлдү.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Сиз %(phone)s телефон номерин дурустадыңыз.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Негизги эмейл орнотулду.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Купуяны өзгөртүү\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Купуяңызды унуттуңузбу?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Купуяңызды унуттуңузбу? Эмейл дарегиңизди төмөндө жазсаңыз, биз сизге кат \"\n\"жөнөтүп, аны жаңыртканга жардам беребиз.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Купуямды жаңырт\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"Купуяны жаңыртууда суроолор пайда болсо, бизге кайрылыңыз.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Биз сизге кат жөнөттүк. Эгерде кат кабыл алынбаса, спам папкаңызды \"\n\"текшериңиз. Кат бир нече мүнөттө келбесе, бизге кайрылыңыз.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Токен туура эмес\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Купуя жаңыртуу шилтемеси туура эмес экен, ал мурун колдонулса керек. <a \"\n\"href=\\\"%(passwd_reset_url)s\\\">Купуяны жаңыртуу</a> сурамын кайрадан \"\n\"жөнөтүңүз.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Купуяңыз эми өзгөртүлдү.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Купуя орнотуу\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Телефонду өзгөртүү\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Азыркы телефон\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Телефон номериңиз дагы деле дурусталбай турат.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Телефонду өзгөртүү\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Купуяңызды жазыңыз:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Купуясыз кирүү үчүн атайын код аласыз.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Код сурануу\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Кирүүнүн башка варианттары\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Катталуу\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Катталуу\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Эсебиңиз барбы? Анда %(link)sкириңиз%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Passkey менен катталуу\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Passkey менен катталуу\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Башка варианттар\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Катталуу жабык\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Кечирим сурайбых, бирок учурда катталуу жабык.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Эскертүү\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Сиз %(user_display)s катары кирип турасыз.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Эскертүү:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Сизде азыр бир дагы эмейл катталган эмес. Билдирүүлөрдү алуу, купуяны \"\n\"жаңыртуу ж.б. үчүн каттап коюңуз.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Эмейл дарегиңизди дурустап бериңиз\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Биз эмейлиңизди дурустоо үчүн кат жөнөттүк. Каттоодон өтүүнү аяктоо үчүн \"\n\"берилген шилтемени басыңыз. Дурустоо каты негизги кутуңузда жок болсо, спам \"\n\"папкасын текшериңиз. Кат бир нече мүнөттө келбесе, бизге кайрылыңыз.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Сайттын бул бөлүгүнө өтүш үчүн сиз чын эле сиз айткан\\n\"\n\"адам экениңизди такташыбыз керек. Ал үчүн эмейл\\n\"\n\"дарек сизге таандык экенин дурусташыңыз керек. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Биз сизге кат жөнөттүк, дурустоо үчүн.\\n\"\n\"Ичинде берилген шилтемени басыңыз. Дурустоо каты негизги кутуңузда жок \"\n\"болсо, спам папкасын текшериңиз. Болбосо,\\n\"\n\"кат бир нече мүнөттө келбей калса, бизге кайрылыңыз.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Эскертүү:</strong> эмейл дарегиңизди дагы деле <a \"\n\"href=\\\"%(email_url)s\\\">өзгөртсөңүз болот</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Билдирүүлөр:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Меню:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Эсеп байланыштары\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Эки кадамдуу аутентификация\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Сессиялар\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Уруксат берүү\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s сиздин %(site_name)s эсебиңизге кирүүнү каалайт.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Түзмөк кодун жазыңыз\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Түзмөгүңүздө көрсөтүлгөн кодду жазыңыз.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Улантуу\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Түзмөктү ырастаңыз\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Бул түзмөккө уруксат берүү үчүн %(client_name)s түзмөгүңүздө көрсөтүлгөн \"\n\"кодду ырастаңыз.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Баш тартуу\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Түзмөккө уруксат берилди\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Сиз %(client_name)s түзмөгүңүзгө ийгиликтүү уруксат бердиңиз.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Түзмөккө баш тартылды\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"%(client_name)s түзмөгүңүзгө уруксат берүү четке кагылды.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Ката\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Кирип калуу\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Эсебиңиз эки кадамдуу аутентификация менен корголгон. Аутентификатор кодун \"\n\"жазыңыз:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Эки кадамдуу аутентификациянын калыбына келтирүү коддорунун жаңы тобу \"\n\"түзүлдү.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Жаңы калыбына келтирүү коддору түзүлдү\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Аутентификатор колдонмосу иштетилди.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Аутентификатор колдонмосу иштетилди\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Аутентификатор колдонмосу өчүрүлдү.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Аутентификатор колдонмосу өчүрүлдү\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Жаңы коопсуздук ачкычы кошулду.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Коопсуздук ачкычы кошулду\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Коопсуздук ачкычы алып салынды.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Коопсуздук ачкычы алып салынды\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Аутентификатор колдонмосу\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Аутентификатор колдонмосу менен аутентификация иштеп жатат.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Аутентификатор колдонмосу иштебей жатат.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Өчүрүү\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Иштетүү\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Коопсуздук ачкычтары\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"%(count)s коопсуздук ачкычы кошулду.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Коопсуздук ачкычтары кошулган эмес.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Башкаруу\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Кошуу\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Калыбына келтирүү коддору\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"%(total_count)s калыбына келтирүү кодунан %(unused_count)s жеткиликтүү.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Калыбына келтирүү коддору орнотулган эмес.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Көрүү\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Жүктөп алуу\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Түзүү\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Калыбына келтирүү коддорунун жаңы тобу түзүлдү.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Коопсуздук ачкычы кошулду.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Коопсуздук ачкычы алып салынды.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Аутентификатор кодун жазыңыз:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Сиз эсебиңиз үчүн калыбына келтирүү коддорунун жаңы тобун түзөсүз.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Бул аракет учурдагы коддоруңузду жараксыз кылат.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Ишенимдүүсүзбү?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Колдонулбаган коддор\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Коддорду жүктөп алуу\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Жаңы коддорду түзүү\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Аутентификатор колдонмосун иштетүү\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Эсебиңизди эки кадамдуу аутентификация менен коргоо үчүн, төмөндөгү QR кодду \"\n\"аутентификатор колдонмоңуз менен сканерлеңиз. Андан кийин, колдонмо \"\n\"тарабынан түзүлгөн дурустоо кодун жазыңыз.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Аутентификатор жашыруун ачкычы\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Бул жашыруун ачкычты сактап, кийинчерээк аутентификатор колдонмоңузду кайра \"\n\"орнотуу үчүн колдонсоңуз болот.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Аутентификатор колдонмосун өчүрүү\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Аутентификатор колдонмосуна негизделген аутентификацияны өчүрөсүз. \"\n\"Ишенимдүүсүзбү?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Бул браузерге ишенесизби?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Эгерде бул браузерге ишенсеңиз, кийинки жолу кирүүдө дурустоо коду суралбайт.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"%(period)s ишенүү\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Ишенбөө\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Коопсуздук ачкычын кошуу\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Коопсуздук ачкычын алып салуу\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Бул коопсуздук ачкычын алып салууну каалайсызбы?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Колдонуу\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Passkey\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Коопсуздук ачкычы\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Бул ачкыч passkey экенин көрсөтпөйт.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Белгиленбеген\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"%(created_at)s кошулган\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Акыркы жолу колдонулган %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Өзгөртүү\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Коопсуздук ачкычын өзгөртүү\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Сактоо\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Passkey түзүү\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Сиз эсебиңиз үчүн passkey түзөсүз. Кийинчерээк кошумча ачкычтарды коше \"\n\"аласыз, андыктан аларды айырмалоо үчүн сүрөттөмө ат колдонсоңуз болот.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Түзүү\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Бул функция JavaScript талап кылат.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Үчүнчү тарап аркылуу кирүү ийгиликсиз\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"Үчүнчү тарап эсебиңиз аркылуу кирүүдө ката кетти.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Эсебиңизге кийинки үчүнчү тарап эсептердин бирин колдонуп кирсеңиз болот:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Азырынча эсебиңизге үчүнчү тарап эсептери байланган эмес.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Үчүнчү тарап эсебин кошуу\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"\"\n\"%(provider)s тарабынан үчүнчү тарап эсеби сиздин эсебиңизге туташтырылды.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Үчүнчү тарап эсеби туташтырылды\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"%(provider)s тарабынан үчүнчү тарап эсеби сиздин эсебиңизден ажыратылды.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Үчүнчү тарап эсеби ажыратылды\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"%(provider)s туташтыруу\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Сиз %(provider)s тарабынан жаңы үчүнчү тарап эсебин туташтырасыз.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"%(provider)s аркылуу кирүү\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Сиз %(provider)s тарабынан үчүнчү тарап эсеби менен кирүүдөсүз.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Кирүү токтотулду\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Эсептериңизин бирөөсүн колдонуп сайтыбызга кирүүдөн баш тарттыңыз. Аны \"\n\"байкабастан кылып алсаңыз, <a href=\\\"%(login_url)s\\\">кирүүнү</a> улантсаңыз \"\n\"болот.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Үчүнчү тарап эсеби туташтырылды.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Үчүнчү тарап эсеби ажыратылды.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Сиз азыр %(provider_name)s эсебиңизди колдонуп, %(site_name)s\\n\"\n\"сайтына кирейин деп турасыз. Акыркы кадам катары кийинки калыпты\\n\"\n\"толтуруп коюңузду суранабыз :\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Же үчүнчү тарапты колдонуңуз\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Башка бардык сессиялардан чыгарылды.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Башталган убакыт\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP дарек\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Браузер\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Акыркы жолу көрүлгөн\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Азыркы\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Башка сессиялардан чыгуу\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Колдонуучу сессиялары\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"сессия ачкычы\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Эсеп байланыштары\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Купуя жок дегенде {0} белгиден турушу керек.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"%(site_name)s сайтынан салам!\\n\"\n#~ \"\\n\"\n#~ \"Сиз бул катты %(site_domain)s сайтынан кимдир бирөө эсебиңиздин купуясын \"\n#~ \"жаңыртуу сурамын жөнөткөндүктөн алып жататсыз.\\n\"\n#~ \"Эгерде сурамды сиз жөнөтпөгөн болсоңуз, бул катка көңүл бурбай эле \"\n#~ \"коюңуз. Купуяны жаңыртуу үчүн төмөндөгү шилтемени басыңыз.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Төмөнкү эмейл даректер сиздин эсебиңизге байланган:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Эмейл даректи ырастаңыз\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Тышкаркы кызматтарда катталган\\n\"\n#~ \"эсебиңиз аркылуу кириңиз. Же, %(site_name)s \\n\"\n#~ \"сайтына %(link)sкатталып%(end_link)s\\n\"\n#~ \"\\\"төмөн жактан кириңиз:\"\n\n#~ msgid \"or\"\n#~ msgstr \"же\"\n\n#~ msgid \"change password\"\n#~ msgstr \"купуяны өзгөртүү\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"OpenID менен кирүү\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Бул эмейл дарек башка бир эсеп менен буга чейин туташтырылган.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Биз сизге кат жөнөттүк. Бир нече мүнөттүн ичинде келбей калса бизге \"\n#~ \"кайрылыңыз.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"Сиз берген логин жана/же купуя туура эмес.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"\"\n#~ \"Колдонуучу аттары тамгалардан, сандардан жана @/./+/-/_ белгилеринен гана \"\n#~ \"тура алат.\"\n"
  },
  {
    "path": "allauth/locale/lt/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2024-04-20 22:02+0200\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\"Language: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < \"\n\"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? \"\n\"1 : n % 1 != 0 ? 2: 3);\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Šiuo metu ši paskyra yra neaktyvi.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Negalite pašalinti pagrindinio el. pašto.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Šis el. pašto adresas jau susietas su šia paskyra.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Pateiktas el. pašto adresas ir/arba slaptažodis yra neteisingi.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Nurodytas telefono numeris ir/arba slaptažodis yra neteisingi.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Šiuo el. pašto adresu jau yra užsiregistravęs kitas naudotojas.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Prašome įvesti esamą jūsų slaptažodį.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Neteisingas kodas.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Neteisingas slaptažodis.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Neteisingas arba pasenęs raktas.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Neteisingas prisijungimas.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Neteisingas slaptažodžio atstatymo atpažinimo ženklas.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Negalima pridėti daugiau nei %d el. pašto adresų.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Šiuo telefono numeriu jau yra užsiregistravęs kitas naudotojas.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Per daug nepavykusių prisijungimo bandymų. Bandykite vėliau.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"El. pašto adresas nėra susietas su jokia naudotojo paskyra.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Telefono numeris nėra susietas su jokia naudotojo paskyra.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Pirminis el. pašto adresas turi būti patvirtintas.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"Šis naudotojo vardas negalimas. Prašome pasirinkti kitą naudotojo vardą.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Pateiktas naudotojo vardas ir/arba slaptažodis yra neteisingi.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Prašome pasirinkti tik vieną.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Nauja reikšmė turi skirtis nuo dabartinės.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Būkite kantrūs, siunčiate per daug užklausų.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Naudokite slaptažodį\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Naudokite autentifikacijos programą arba kodą\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Naudokite saugumo raktą\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} pažymėtas kaip patvirtintas.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Nepavyko pažymėti {email} kaip patvirtinto.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Pažymėti pasirinktus el. pašto adresus, kaip patvirtintus\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Paskyros\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"El. paštas\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"El. pašto adresas\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Įveskite telefono numerį su šalies kodu (pvz., +1 JAV).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefonas\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Turite įvesti tą patį slaptažodį kiekvieną kartą.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Slaptažodis\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Prisimink mane\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Naudotojo vardas\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Prisijungimo vardas\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Naudotojo vardas, el. paštas arba telefonas\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Naudotojo vardas arba el. paštas\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Naudotojo vardas arba telefonas\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"El. paštas arba telefonas\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Pamiršote slaptažodį?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"El. paštas (pakartoti)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"El. pašto patvirtinimas\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"El. paštas (neprivalomas)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Naudotojo vardas (neprivalomas)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Turite įvesti tą patį el. pašto adresą kiekvieną kartą.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Slaptažodis (pakartoti)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Esamas slaptažodis\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Naujas slaptažodis\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Naujas slaptažodis (pakartoti)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kodas\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"naudotojas\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"el. pašto adresas\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"patvirtintas\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"pirminis\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"el. pašto adresai\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"sukurtas\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"išsiųstas\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"raktas\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"el. pašto patvirtinimas\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"el. pašto patvirtinimai\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Begalvis\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Peržiūrėkite savo naudotojo ID\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Peržiūrėkite savo el. pašto adresą\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Peržiūrėkite savo pagrindinę profilio informaciją\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Suteikti leidimus\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Pakaitos simboliai neleidžiami, nebent įjungta 'Leisti URI pakaitos \"\n\"simbolius'.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' turi daugiau nei vieną pakaitos simbolį (*). Leidžiamas tik vienas \"\n\"pakaitos simbolis vienam URI.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Pakaitos simboliai leidžiami tik URI prieglobos pavadinimo dalyje.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Autorizacijos kodas\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Įrenginio kodas\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Kliento kredencialai\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Atnaujinimo žetonas\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Konfidencialus\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Viešas\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Apimtys, kurias klientui leidžiama prašyti. Pateikite vieną reikšmę \"\n\"eilutėje, pvz.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Jei klientas nenurodo jokios apimties, naudojamos šios numatytosios apimtys. \"\n\"Pateikite vieną reikšmę eilutėje, pvz.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Leidžiamų suteikimo tipų sąrašas. Pateikite vieną reikšmę eilutėje, pvz.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Leidžiamų šaltinių sąrašas tarpdomeniniams užklausoms, po vieną eilutėje.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Leisti pakaitos simbolius (*) peradresavimo URI ir CORS šaltiniuose. Kai \"\n\"įjungta, URI gali turėti vieną žvaigždutę subdomenams atitikti.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Leidžiamų atsakymo tipų sąrašas. Pateikite vieną reikšmę eilutėje, pvz.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"klientas\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"klientai\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Jūs negalite pridėti el. pašto adreso į dviguba autentifikacija saugomą \"\n\"paskyrą.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Jūs negalite deaktyvuoti dvigubos autentifikacijos.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Jūs negalite generuoti atstatymo kodų be įjungtos dvigubos autentifikacijos.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Jūs negalite aktyvuoti dvigubos autentifikacijos kol nepatvirtinsite savo \"\n\"el. pašto.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Pagrindinis raktas\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Atsarginis raktas\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Rakto nr. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Atkūrimo kodai\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP autentikatorius\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Autentifikatoriaus kodas\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Be Slaptažodžio\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Prisijungimo be slaptažodžio režimo įjungimas leidžia prisijungti naudojant \"\n\"tik šį raktą, tačiau nustato papildomus reikalavimus, tokius kaip biometrika \"\n\"arba PIN apsauga.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Paskyra su šiuo el. pašto adresu jau egzistuoja. Prašome pirmiausia \"\n\"prisijungti prie tos paskyros ir tada prijunkite %s paskyrą.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Klaidinga atpažinimo žymė\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Jūsų paskyra neturi nustatyto slaptažodžio.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Jūsų paskyra neturi patvirtinto el. pašto adreso.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Negalite atjungti paskutinės trečiosios šalies paskyros.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Trečiosios šalies paskyra jau yra prijungta prie kitos paskyros.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Socialinės paskyros\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"tiekėjas\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"tiekėjo ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"pavadinimas\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"kliento id\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"App ID arba consumer key\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"secret key\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API secret, client secret, arba consumer secret\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Raktas\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"socialinė programėlė\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"socialinės programėlės\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"paskutinis prisijungimas\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"registracijos data\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"papildomi duomenys\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"socialinė paskyra\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"socialinės paskyros\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"atpažinimo ženklas\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) arba prieigos atpažinimo ženklas (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"token secret\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\"\n\"\\\"oauth_token_secret\\\" (OAuth1) arba atnaujintas atpažinimo ženklas (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"galiojimas\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"socialinės programėlės atpažinimo ženklas\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"socialinės programėlės atpažinimo ženklai\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Neteisingi profilio duomenys\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Prisijungti\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Atšaukti\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Klaidingas atsakymas gaunant užklausos atpažinimo ženklą iš \\\"%s\\\". \"\n\"Atsakymas buvo: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Klaidingas atsakymas gaunant prieigos atpažinimo ženklą iš \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Nėra užklausos atpažinimo žymės šiam \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Nėra prieigos atpažinimo žymės šiam \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Nėra prieigos prie privataus resurso iš \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Klaidingas atsakymas gaunant užklausos atpažinimo ženklą iš \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Paskyra neaktyvi\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Ši paskyra neaktyvi.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Į %(recipient)s išsiuntėme kodą. Kodo galiojimas greitai pasibaigs, tad \"\n\"įrašykite jį kuo greičiau.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Patvirtinti\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Prašyti naujo kodo\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Patvirtinkite Prieigą\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Prašome dar kartą autentifikuotis, kad apsaugotumete savo paskyrą.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Kiti pasirinkimai\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"El. Pašto Patvirtinimas\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Įrašykite Teisingą Patvirtinimo Kodą\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Naudoti kitą el. pašto adresą\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Prisijungti\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Įrašykite Prisijungimo Kodą\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Slaptažodžio atstatymas\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Įveskite slaptažodžio atstatymo kodą\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Telefono patvirtinimas\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Įveskite telefono patvirtinimo kodą\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Naudoti kitą telefono numerį\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"El. pašto adresai\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Šie el. pašto adresas yra susieti su jūsų paskyra:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Patvirtintas\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Nepatvirtintas\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Pirminis\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Padaryti pirminiu\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Pakartotinai siųsti patvirtinimą\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Šalinti\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Pridėti el. pašto adresą\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Pridėti el. paštą\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Ar tikrai norite ištrinti pasirinktą el. pašto adresą?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Jūs gaunate šį laišką, nes kažkas bandė prisiregistruoti\\n\"\n\" naudojantis :\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Paskyra su šiuo el. pašto adresu egzistuoja. Jei užmiršote\\n\"\n\" apie tai, prašome naudotis užmiršto slaptažodžio procedūra, kad \"\n\"atstatytumėte\\n\"\n\"jūsų paskyrą:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Pakyra Jau Egzistuoja\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Ačiū nuo %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Ačiū, kad naudojate %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"Jūs gaunate šį laišką, nes šie pakitimai buvo padaryti jūsų paskyrai:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Jei neatpažįstate šių pakitimų, imkitės saugumo užtikrinimo veiksmų. \"\n\"Paskyros pakitimai buvo įvykdyti iš:\\n\"\n\"\\n\"\n\"- IP adreses: %(ip)s\\n\"\n\"- Naršyklė: %(user_agent)s\\n\"\n\"- Data: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"\"\n\"Jūsų el. pašto adresas buvo pakeistas iš %(from_email)s į %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"El. Paštas Pasikeitė\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Jūsų el. paštas patvirtintas.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"El. Pašto Patvirtinimas\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Jūs gavote šį laišką, kadangi naudotojas %(user_display)s iš %(site_domain)s \"\n\"prijungė šį el. pašto adresą prie savo paskyros.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Jūsų el. pašto patvirtinimo kodas yra nurodytas žemiau. Prašome įvesti jį į \"\n\"atidarytos naršklės langą.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Patvirtinkite, kad tai yra teisinga, eidami į %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Prašome patvirtinti savo el. pašto adresą\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"El. pašto adresas %(deleted_email)s buvo pašalintas iš jūsų paskyros.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"El. Paštas Pašalintas\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Jūsų el. pašto patvirtinimo kodas yra nurodytas žemiau. Prašome įvesti jį į \"\n\"atidarytos naršyklės langą.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"Šis laiškas gali būti ignoruojamas jei šio veiksmo neiniciavote.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Prisijungimo Kodas\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Jūsų slaptažodis pakeistas.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Slaptažodis Pakeistas\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Jūsų slaptažodžio atstatymo kodas yra nurodytas žemiau. Prašome įvesti jį į \"\n\"atidarytos naršyklės langą.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Slaptažodžio atstatymo kodas\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Jūs gavote šį laišką, kadangi jūs arba kažkas kitas pateikė slaptažodžio \"\n\"keitimo užklausą paskyrai susietai su šiuo el. pašto adresu iš %\"\n\"(site_domain)s.\\n\"\n\"Jei jūs neteikėte slaptažodžio keitimo užklausos, galite ignoruoti šį \"\n\"laišką. Kad pakeistumėte savo slaptažodį sekite žemiau esančią nuorodą.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Primename, kad jūsų naudotojo vardas yra %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Slaptažodžio keitimo el. paštas\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Jūsų slaptažodis atstatytas.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Jūsų slaptažodis nustatytas.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Slaptažodžio Nustatymas\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Jūs gaunate šį laišką, nes kažkas bandė prisijungti prie paskyros su el. \"\n\"pašto adresu %(email)s, tačiau tokios paskyros duombazėje nėra.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"Jei tai buvote jūs, registruotis galite sekdami nuorodą apačioje.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Nežinoma Paskyra\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"El. Pašto Adresas\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Esamas el. pašto adresas\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Keičiama į\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Jūsų el. pašto adresas dar vis laukia patvirtinimo.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Atšaukti Keitimą\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Pakeista į\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Keisti El. Paštas Adresą\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Patvirtinkite el. pašto adresą\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Prašome patvirtinti, kad <a href=\\\"mailto:%(email)s\\\">%(email)s</a> yra \"\n\"%(user_display)s el. pašto adresas.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"%(email)s nepatvirtintas, nes šį el. paštą jau patvirtino kita paskyra.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Šios el. pašto patvirtinimo nuorodos galiojimas baigėsi arba nuoroda yra \"\n\"klaidinga. Prašome <a href=\\\"%(email_url)s\\\">pateikti naują el. pašto \"\n\"patvirtinimo užklausimą</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Jei dar nesusikūrėte paskyros, tuomet prašome pirmiausia \"\n\"%(link)ssusikurti%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Prisijunkite su prieigos raktu\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Atsiųskite man prisijungimo kodą\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Atsijungti\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Ar tikrai norite atsijungti?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Negalite ištrinti pirminio (%(email)s) el. pašto adreso.\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Patvirtinimo laiškas išsiųstas adresu %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"%(email)s patvirtintas.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"%(email)s el. pašto adresas ištrintas.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Sėkmingai prisijungėte kaip %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Atsijungėte.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Prisijungimo kodas buvo nusiųstas į %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Slaptažodis sėkmingai pakeistas.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Slaptažodis pakeistas sėkmingai.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Patvirtinimo kodas buvo nusiųstas į %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Patvirtinote telefono numerį %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Pirminis el. pašto adresas pakeistas sėkmingai.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Keisti slaptažodį\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Pamiršote slaptažodį?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Pamiršote slaptažodį? Įveskite savo el. pašto adresą žemiau ir mes išsiūsime \"\n\"jums laišką, kurio pagalba galėsite pasikeisti slaptažodį.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Atstatyti mano slaptažodį\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"Prašome susisiekti su mumis jei negalite atstatyti slaptažodžio.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Išsiuntėme jums patvirtinimo laišką. Prašome sekite nuorodą pateiktą laiške. \"\n\"Susisiekite su mumis jei negausite laiško per kelias minutes.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Klaidinga atpažinimo žymė\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Slaptažodžio atstatymo nuoroda klaidinga, taip gali būti dėl to, kad nuoroda \"\n\"jau buvo kartą panaudota.  Prašome <a \"\n\"href=\\\"%(passwd_reset_url)s\\\">pakartoti slaptažodžio atstatymą</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Jūsų slaptažodis pakeistas.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Nustatyti slaptažodį\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Keisti telefoną\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Dabartinis telefonas\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Jūsų telefono numeris dar vis laukia patvirtinimo.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Keisti telefoną\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Įrašykite slaptažodį:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Gausite specialų kodą prisijungimui be slaptažodžio.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Prašyti Kodo\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Kiti prisijungimo pasirinkimai\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Registracija\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Registruotis\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Jau turite paskyrą? Prašome %(link)sprisijungti%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Užsiregistruokite naudodami prieigos raktą\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Registracija su prieigos raktu\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Kiti pasirinkimai\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Registracija uždaryta\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Atsiprašome, tačiau registracija šiuo metu yra uždaryta.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Pastaba\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Jūs jau esate prisijungęs, kaip %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Įspėjimas:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Šiuo metu jūs neturite nustatyto el. pašto adreso. Rekomenduojame pridėti \"\n\"el. pašto adresą, kad gautumėte pranešimus, galėtumėte atstatyti slaptažodį \"\n\"ir pan.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Patvirtinkite savo el. pašto adresą\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Išsiuntėme jums laišką patvirtinimui. Sekite laiške pateiktą nuorodą, kad \"\n\"užbaigtumėte registraciją. Jei nematote laiško pagrindiniame skyriuje, \"\n\"patikrinkite šlamšto skyrių. Prašome susisiekti su mumis, jei laiško \"\n\"negavote per kelias minutes.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Šioje svetainės vietoje privalome gauti iš jūsų patvirtinimą,\\n\"\n\"kad jūs tikrai esate tas asmuo, kaip teigiate. Dėl šios priežasties\\n\"\n\"prašome patvirtinti el. pašto adreso nuosavybę. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Išsiuntėme jums patvirtinimo laišką.\\n\"\n\"Prašome sekite nuorodą pateiktą laiške. Jei laiško nematote, patikrinkite \"\n\"šlamšto skyrių. Susisiekite su mumis\\n\"\n\"jei negausite laiško per kelias minutes.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Pastaba:</strong> vis dar galite <a href=\\\"%(email_url)s\\\">pakeisti \"\n\"savo el. pašto adresą</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Žinutės:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Meniu:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Paskyros ryšiai\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Dviejų Faktorių Autentifikacija\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sesijos\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autorizuoti\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s nori pasiekti jūsų %(site_name)s paskyrą.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Įveskite įrenginio kodą\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Įveskite kodą, rodomą jūsų įrenginyje.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Tęsti\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Patvirtinkite įrenginį\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Prašome patvirtinti kodą, rodomą jūsų %(client_name)s, kad autorizuotumėte \"\n\"šį įrenginį.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Atmesti\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Įrenginys autorizuotas\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Sėkmingai autorizavote savo %(client_name)s įrenginį.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Įrenginys atmestas\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Jūsų %(client_name)s įrenginio autorizacija buvo atmesta.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Klaida\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Likti prisijungus\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Jūsų paskyra apsaugota dviejų veiksnių autentifikavimu. Prašome įvesti \"\n\"autentifikatoriaus kodą:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Sugeneruotas naujas dviejų veiksnių autentifikavimo atkūrimo kodų rinkinys.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Sugeneruoti nauji atkūrimo kodai\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Autentifikatoriaus programa aktyvuota.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Autentifikacijos Aplikacija Aktyvuota\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Autentifikatoriaus programa deaktyvuota.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Autentifikacijos Aplikacija Deaktyvuota\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Pridėtas naujas saugumo raktas.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Saugumo raktas pridėtas\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Saugumo raktas buvo pašalintas.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Saugumo raktas pašalintas\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Autentifikatoriaus programa\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Autentifikavimas naudojant autentifikatoriaus programą yra aktyvus.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Autentifikatoriaus programa nėra aktyvi.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Deaktyvuoti\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktyvuoti\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Saugumo raktai\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Pridėjote %(count)s saugumo raktą.\"\nmsgstr[1] \"Pridėjote %(count)s saugumo raktus.\"\nmsgstr[2] \"Pridėjote %(count)s saugumo raktų.\"\nmsgstr[3] \"Pridėjote %(count)s saugumo raktų.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Nepridėta jokių saugumo raktų.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Tvarkyti\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Pridėti\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Atkūrimo kodai\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"Yra %(unused_count)s iš %(total_count)s atkūrimo kodų.\"\nmsgstr[1] \"Yra %(unused_count)s iš %(total_count)s atkūrimo kodų.\"\nmsgstr[2] \"Yra %(unused_count)s iš %(total_count)s atkūrimo kodų.\"\nmsgstr[3] \"Yra %(unused_count)s iš %(total_count)s atkūrimo kodų.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Atkūrimo kodai nesukonfigūruoti.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Peržiūrėti\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Atsisiųsti\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Generuoti\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Sugeneruotas naujas atkūrimo kodų rinkinys.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Saugumo raktas pridėtas.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Saugumo raktas pašalintas.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Įveskite autentifikatoriaus kodą:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Ketinate sugeneruoti naują atkūrimo kodų rinkinį savo paskyrai.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Šis veiksmas panaikins jūsų esamus kodus.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Ar tikrai?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Nepanaudoti kodai\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Atsisiųsti kodus\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Generuoti naujus kodus\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Aktyvuoti autentifikatoriaus programą\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Norėdami apsaugoti savo paskyrą dviejų veiksnių autentifikavimu, \"\n\"nuskaitykite žemiau esantį QR kodą savo autentifikatoriaus programa. Tada \"\n\"įveskite programos sugeneruotą patvirtinimo kodą žemiau.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Autentifikatoriaus paslaptis\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Galite išsaugoti šį slaptą kodą ir naudoti jį autentifikatoriaus programos \"\n\"įdiegimui iš naujo vėliau.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Deaktyvuoti autentifikatoriaus programą\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Ketinate deaktyvuoti autentifikavimą, pagrįstą autentifikatoriaus programa. \"\n\"Ar tikrai?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Pasitikėti šia naršykle?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Jei pasirinksite pasitikėti šia naršykle, kitą kartą prisijungiant jūsų \"\n\"nebus prašoma patvirtinimo kodo.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Pasitikėti %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Nepasitikėti\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Pridėti Saugumo Raktą\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Pašalinti Saugumo Raktą\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Ar tikrai norite pašalinti šį saugumo raktą?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Naudojimas\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Prieigos raktas\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Saugumo raktas\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Šis raktas nenurodo, ar tai yra prieigos raktas.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Nenurodytas\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Pridėta %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Paskutinį kartą naudota %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Redaguoti\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Keisti Saugumo Raktą\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Išsaugoti\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Sukurti prieigos raktą\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Ketinate sukurti prieigos raktą savo paskyrai. Kadangi vėliau galėsite \"\n\"pridėti papildomų raktų, galite naudoti aprašomąjį pavadinimą, kad juos \"\n\"atskirtumėte.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Sukurti\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Šiai funkcijai reikalingas JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Trečiosios Šalies Prisijungimo Klaida\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"Įvyko nenumatyta klaida bandant prisijungti trčiosios šalies paskyra.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Galite prisijungti prie savo paskyros naudodami vieną iš galimų trečios \"\n\"šalies paskyrų:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"\"\n\"Šiuo metu jūs neturite nei vienos prijungtos trečiosios šalies paskyros.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Pridėti Trečiosios Šalies paskyrą\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"\"\n\"Trečiosios šalies paskyra iš %(provider)s buvo prijungta prie jūsų paskyros.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Trečiosios Šalies Paskyra Prijungta\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"Trečiosios šalies paskyra iš %(provider)s buvo atjungta nuo jūsų paskyros.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Trečiosios Šalies Paskyra Atjungta\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Prijungti %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Jūs tuojaus prijungsite naują trečiosios šalies paskyrą iš %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Prisijungkite Su %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Jūs tuojaus prisijungsite naudojantis trečiosios šalies paskyra iš \"\n\"%(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Prisijungimas atšauktas\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Nusprendėte atšaukti prisijungimą naudojant vieną iš esamų paskyrų.  Jei tai \"\n\"buvo klaida, prašome pakartoti <a href=\\\"%(login_url)s\\\">prisijungimą</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Trečiosios šalies paskyra buvo prijungta.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Trečiosios šalies paskyra buvo atjungta.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Jūs beveik prisijungėte prie %(site_name)s naudodami %(provider_name)s\\n\"\n\"paskyrą. Liko paskutinis žingsnis, užpildyti sekančią formą:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Arba naudokite trečiąją šalį\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Atsijungta nuo visų kitų sesijų.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Pradėta\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP Adresas\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Naršyklė\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Paskutinį kartą matyta\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Esamas\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Atjungti Kitas Sesijas\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Vartotojo Sesijos\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"sesijos raktas\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Paskyros ryšiai\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Slaptažodis turi būti sudarytas mažiausiai iš {0} simbolių.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Su jumis sveikinasi %(site_name)s\\n\"\n#~ \"\\n\"\n#~ \"Jūs gavote šį laišką, kadangi jūs arba kažkas kitas pateikė slaptažodžio \"\n#~ \"keitimo užklausą paskyrai susietai su šiuo el. pašto adresu iš \"\n#~ \"%(site_domain)s.\\n\"\n#~ \"Jei jūs neteikėte slaptažodžio keitimo užklausos, galite ignoruoti šį \"\n#~ \"laišką. Kad pakeistumėte savo slaptažodį sekite žemiau esančią nuorodą.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Šie el. pašto adresas yra susieti su jūsų paskyra:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Patvirtinkite el. pašto adresą\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Prašome prisijungti viena\\n\"\n#~ \"iš jūsų turimų trečios šalies paskyrų. Arba, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">susikurkite</a>\\n\"\n#~ \"naują %(site_name)s paskyrą ir prisijunkite žemiau:\"\n\n#~ msgid \"or\"\n#~ msgstr \"arba\"\n\n#~ msgid \"change password\"\n#~ msgstr \"keisti slaptažodį\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"OpenID prisijungimas\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Šis el. pašto adresas jau susietas su kita paskyra.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Išsiuntėme jums laišką. Prašome susisiekti su mums jei per kelias minutes \"\n#~ \"negausite laiško.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"Pateiktas prisijungimo vardas ir/arba slaptažodis yra neteisingi.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"Naudotojo vardui galima naudoti tik raides, skaičius ir @/./+/-/_.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"Šis naudotojo vardas jau užimtas. Prašome pasirinkti kitą.\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"Jūs patvirtinote, kad <a href=\\\"mailto:%(email)s\\\">%(email)s</a> yra %\"\n#~ \"(user_display)s naudotojo el. pašto adresas.\"\n"
  },
  {
    "path": "allauth/locale/lv/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2024-04-20 21:51+0200\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\"Language: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : \"\n\"2);\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Šis konts šobrīd ir neaktīvs.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Jūs nevarat noņemt savu primāro e-pasta adresi.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Šī e-pasta adrese jau ir piesaistīta šim kontam.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Nepareizs e-pasts un/vai parole.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Norādītais tālruņa numurs un/vai parole nav pareizi.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Lietotājs ar šādu e-pasta adresi jau ir reģistrēts.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Lūdzu ievadiet jūsu šobrīdējo paroli.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Nepareizs kods.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Nepareiza parole.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Nederīga vai novecojusi atslēga.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Nederīga pieteikšanās.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Paroles atjaunošanas marķieris bija nederīgs.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Jūs nevarat pievienot vairāk par %d e-pasta adresēm.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Lietotājs ar šādu tālruņa numuru jau ir reģistrēts.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"\"\n\"Pārāk daudz neveiksmīgi pieslēgšanās mēģinājumi. Mēģiniet vēlreiz vēlāk.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"E-pasta adrese nav piesaistīta nevienam lietotāja kontam.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Tālruņa numurs nav piesaistīts nevienam lietotāja kontam.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Jūsu primārajai e-pasta adresei jābūt apstiprinātai.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"Lietotājvārds nevar tikt izmantots. Lūdzu izvēlietis citu lietotājvārdu.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Nepareizs lietotāja vārds un/vai parole.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Lūdzu izvēlieties tikai vienu.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Jaunajai vērtībai jāatšķiras no pašreizējās.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Esiet pacietīgi, jūs sūtāt pārāk daudz pieprasījumu.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Izmantojiet savu paroli\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Izmantojiet autentifikatora lietotni vai kodu\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Izmantojiet drošības atslēgu\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} ir atzīmēts kā apstiprināts.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Neizdevās atzīmēt {email} kā apstiprinātu.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Atzīmēt izvēlētās e-pasta adreses kā apstiprinātas\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Konti\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-pasts\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"E-pasta adrese\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Ievadiet tālruņa numuru ar valsts kodu (piem. +1 ASV).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Tālrunis\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Katru reizi jums ir jāievada tā pati parole.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Parole\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Atcerēties mani\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Lietotājvārds\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Pieteikties\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Lietotājvārds, e-pasts vai tālrunis\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Lietotājvārds vai e-pasts\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Lietotājvārds vai tālrunis\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-pasts vai tālrunis\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Aizmirsāt paroli?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-pasts (vēlreiz)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"E-pasta adreses apstiprināšana\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-pasts (izvēles)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Lietotājvārds (izvēles)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Katru reizi jums ir jāievada tā pati e-pasta adrese.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Parole (vēlreiz)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Šobrīdējā parole\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Jaunā parole\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Jaunā parole (vēlreiz)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kods\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"lietotājs\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"e-pasta adrese\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"apstiprināts\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"primārā\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"e-pasta adreses\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"izveidots\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"nosūtīts\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"atslēga\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"e-pasta apstiprinājums\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"e-pasta apstiprinājumi\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Skatīt savu lietotāja ID\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Skatīt savu e-pasta adresi\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Skatīt savu pamata profila informāciju\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Piešķirt atļaujas\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Aizstājējzīmes nav atļautas, ja vien nav iespējota opcija 'Atļaut URI \"\n\"aizstājējzīmes'.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' satur vairāk nekā vienu aizstājējzīmi (*). Katram URI ir atļauta \"\n\"tikai viena aizstājējzīme.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Aizstājējzīmes ir atļautas tikai URI resursdatora daļā.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Autorizācijas kods\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Ierīces kods\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Klienta akreditācijas dati\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Atjaunošanas marķieris\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Konfidenciāls\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Publisks\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Tvērums(-i), ko klientam ir atļauts pieprasīt. Norādiet vienu vērtību katrā \"\n\"rindā, piem.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Gadījumā, ja klients nenorāda tvērumu, tiek izmantoti šie noklusējuma \"\n\"tvērumi. Norādiet vienu vērtību katrā rindā, piem.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Atļauto piešķīruma veidu saraksts. Norādiet vienu vērtību katrā rindā, \"\n\"piem.: authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Atļauto izcelsmes vietu saraksts starpdomēnu pieprasījumiem, viena katrā \"\n\"rindā.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Atļaut aizstājējzīmes (*) pāradresēšanas URI un CORS izcelsmē. Ja iespējots, \"\n\"URI var saturēt vienu zvaigznīti, lai atbilstu apakšdomēniem.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Atļauto atbilžu veidu saraksts. Norādiet vienu vērtību katrā rindā, piem.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"klients\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"klienti\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Jūs nevarat pievienot e-pasta adresi kontam, kas ir aizsargāts ar divfaktoru \"\n\"autentifikāciju.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Jūs nevarat deaktivizēt divfaktoru autentifikāciju.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Jūs nevarat ģenerēt atkopšanas kodus bez iespējotas divfaktoru \"\n\"autentifikācijas.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Jūs nevarat aktivizēt divfaktoru autentifikāciju, kamēr neesat apstiprinājis \"\n\"savu e-pasta adresi.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Galvenā atslēga\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Rezerves atslēga\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Atslēga nr. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Atkopšanas kodi\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP autentifikators\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Autentifikatora kods\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Bez paroles\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Bezparoles režīma iespējošana ļauj pieteikties, izmantojot tikai šo atslēgu, \"\n\"bet uzliek papildu prasības, piemēram, biometriju vai PIN aizsardzību.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Jau eksistē konts ar šo e-pasta adresi. Lūdzu vispirms ieejiet tajā kontā, \"\n\"tad pievienojiet savu %s kontu.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Nederīgs marķieris.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Jūsu kontam nav uzstādīta parole.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Jūsu kontam nav apstiprinātas e-pasta adreses.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Jūs nevarat atvienot savu pēdējo atlikušo trešās puses kontu.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Trešās puses konts jau ir piesaistīts citam kontam.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Sociālie konti\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"sniedzējs\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"pakalpojuma sniedzēja ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"vārds\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"klienta id\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"App ID, vai consumer key\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"secret key\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API secret, client secret, vai consumer secret\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Key\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"sociālā aplikācija\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"sociālās aplikācijas\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"pēdējā pieslēgšanās\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"reģistrācijas datums\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"papildus informācija\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"sociālais konts\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"sociālie konti\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) vai piekļūt marķierim (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"token secret\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) vai atjaunot marķieri (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"beidzas\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"sociālās aplikācijas marķieris\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"sociālās aplikācijas marķieri\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Nederīgi profila dati\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Pieteikties\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Atcelt\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Nederīga atbilde, iegūstot pieprasījuma marķieri no \\\"%s\\\". Atbilde bija: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Nederīga atbilde iegūstot pieejas marķieri no \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Netika saglabāts pieprasījuma marķieris priekš \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Netika saglabāts pieejas marķieris priekš  \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Nav pieejas privātam resursam \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Nederīga atbilde iegūstot pieprasījuma marķieri no \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Neaktīvs konts\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Šis konts ir neaktīvs.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Mēs esam nosūtījuši kodu uz %(recipient)s. Koda derīguma termiņš drīz \"\n\"beigsies, tāpēc lūdzu ievadiet to drīz.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Apstiprināt\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Pieprasīt jaunu kodu\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Apstiprināt piekļuvi\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Lūdzu autentificējieties atkārtoti, lai aizsargātu savu kontu.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Alternatīvas iespējas\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"E-pasta verifikācija\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Ievadiet e-pasta verifikācijas kodu\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Izmantot citu e-pasta adresi\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Ieiet\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Ievadiet pieteikšanās kodu\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Atjaunot paroli\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Ievadiet paroles atiestatīšanas kodu\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Tālruņa verifikācija\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Ievadiet tālruņa verifikācijas kodu\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Izmantot citu tālruņa numuru\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"E-pasta adreses\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Sekojošas e-pasta adreses ir piesaistītas jūsu kontam:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Apstiprināta\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Neapstiprināta\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Primārā\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Iestatīt kā primāro\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Pārsūtīt apstiprināšanu\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Noņemt\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Pievienot e-pasta adresi\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Pievienot e-pastu\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Vai jūs tiešām vēlaties noņemt izvēlēto e-pasta adresi?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Jūs saņemat šo e-pastu, jo jūs vai kāds cits mēģināja reģistrēt\\n\"\n\"kontu, izmantojot e-pasta adresi:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Tomēr konts ar šo e-pasta adresi jau pastāv. Gadījumā, ja esat\\n\"\n\"aizmirsuši par to, lūdzu izmantojiet paroles atjaunošanas procedūru, lai \"\n\"atgūtu\\n\"\n\"savu kontu:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Konts jau pastāv\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Sveiciens no %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Paldies, ka izmantojat %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"Jūs saņemat šo e-pastu, jo jūsu kontā tika veiktas šādas izmaiņas:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Ja jūs neatpazīstat šīs izmaiņas, lūdzu nekavējoties veiciet atbilstošus \"\n\"drošības pasākumus. Izmaiņas jūsu kontā radušās no:\\n\"\n\"\\n\"\n\"- IP adrese: %(ip)s\\n\"\n\"- Pārlūkprogramma: %(user_agent)s\\n\"\n\"- Datums: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Jūsu e-pasts ir nomainīts no %(from_email)s uz %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"E-pasts nomainīts\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Jūsu e-pasts ir apstiprināts.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"E-pasta apstiprināšana\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Jūs saņemat šo e-pasta vēstuli, jo lietotājs %(user_display)s ir norādījis \"\n\"jūsu e-pasta adresi, lai reģistrētu kontu vietnē %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Jūsu e-pasta verifikācijas kods ir norādīts zemāk. Lūdzu ievadiet to \"\n\"atvērtajā pārlūkprogrammas logā.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Lai apstiprinātu, ka tas ir pareizi, dodieties uz %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Lūdzu apstipriniet savu e-pasta adresi\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"E-pasta adrese %(deleted_email)s ir noņemta no jūsu konta.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"E-pasts noņemts\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Jūsu pieteikšanās kods ir norādīts zemāk. Lūdzu ievadiet to atvērtajā \"\n\"pārlūkprogrammas logā.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"Šo e-pastu var droši ignorēt, ja jūs neuzsākāt šo darbību.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Pieteikšanās kods\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Jūsu parole ir nomainīta.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Parole nomainīta\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Jūsu paroles atiestatīšanas kods ir norādīts zemāk. Lūdzu ievadiet to \"\n\"atvērtajā pārlūkprogrammas logā.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Paroles atiestatīšanas kods\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Jūs saņemat šo e-pastu, jo jūs vai kāds cits ir pieprasījis paroles \"\n\"atiestatīšanu jūsu kontam.\\n\"\n\"Jūs varat droši ignorēt šo e-pastu, ja jūs nepieprasījāt paroles \"\n\"atiestatīšanu. Noklikšķiniet uz zemāk esošās saites, lai atiestatītu paroli.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Gadījumā ja jūs aizmirsāt, tad jūsu lietotājvārds ir %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Paroles atjaunošanas e-pasts\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Jūsu parole ir atiestatīta.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Jūsu parole ir iestatīta.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Parole iestatīta\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Jūs saņemat šo e-pastu, jo jūs vai kāds cits mēģināja piekļūt kontam ar e-\"\n\"pastu %(email)s. Tomēr mūsu datubāzē nav ierakstu par šādu kontu.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"Ja tas bijāt jūs, varat reģistrēt kontu, izmantojot zemāk esošo saiti.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Nezināms konts\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"E-pasta adrese\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Pašreizējais e-pasts\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Mainīšana uz\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Jūsu e-pasta adrese vēl gaida verifikāciju.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Atcelt izmaiņas\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Mainīt uz\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Mainīt e-pastu\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Apstipriniet e-pasta adresi\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Lūdzu apstipriniet, ka <a href=\\\"mailto:%(email)s\\\">%(email)s</a> ir e-pasta \"\n\"adrese lietotājam %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"Nevar apstiprināt %(email)s, jo tā jau ir apstiprināta ar citu kontu.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Šī e-pasta apstiprināšanas saite ir beigusies vai ir nederīga. Lūdzu <a \"\n\"href=\\\"%(email_url)s\\\">pieprasiet jaunu e-pasta apstiprināšanas saiti</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Ja jūs vēl neesat izveidojuši kontu, tad lūdzu \"\n\"%(link)spiereģistrējaties%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Pieteikties ar piekļuves atslēgu\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Nosūtiet man pieteikšanās kodu\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Iziet\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Vai jūs tiešām vēlaties iziet?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Jūs nevarat noņemt savu primāro e-pasta adresi (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Apstiprinājuma e-pasts nosūtīts uz %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Jūs esat apstiprinājis %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Noņemta e-pasta adrese %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Veiksmīgi iegājuši kā %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Jūs esat izgājuši.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Pieteikšanās kods ir nosūtīts uz %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Parole veiksmīgi nomainīta.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Parole veiksmīgi uzstādīta.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Verifikācijas kods ir nosūtīts uz %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Jūs esat verificējuši tālruņa numuru %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Primārā e-pasta adrese uzstādīta.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Mainīt paroli\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Aizmirsāt paroli?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Aizmirsāt savu paroli? Ievadiet zemāk savu e-pasta adresi, un mēs jums \"\n\"nosūtīsim e-pastu, lai to atiestatītu.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Atjaunot manu paroli\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"Lūdzu sazinieties ar mums, ja jums ir kādas problēmas atjaunojot to.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Mēs esam jums nosūtījuši e-pastu. Ja neesat to saņēmuši, lūdzu pārbaudiet \"\n\"mēstuļu mapi. Sazinieties ar mums, ja nesaņemat to dažu minūšu laikā.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Nederīgs marķieris\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Paroles atjaunošanas links ir nederīgs, iespējams, tāpēc ka tas jau ir \"\n\"izmantots. Lūdzu pieprasiet <a href=\\\"%(passwd_reset_url)s\\\">jaunu paroles \"\n\"atjaunošanu</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Jūsu parole ir nomainīta.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Uzstādīt paroli\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Mainīt tālruni\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Pašreizējais tālrunis\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Jūsu tālruņa numurs vēl gaida verifikāciju.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Mainīt tālruni\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Ievadiet savu paroli:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Jūs saņemsiet īpašu kodu pieteikšanai bez paroles.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Pieprasīt kodu\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Citas pieteikšanās iespējas\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Reģistrēties\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Reģistrēties\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Jau ir konts? Tad lūdzu %(link)sspiedied šeit%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Reģistrēties ar piekļuves atslēgu\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Reģistrācija ar piekļuves atslēgu\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Citas iespējas\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Reģistrācija slēgta\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Mēs atvainojamies, bet reģistrācija šobrīd ir slēgta.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Piezīme\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Jūs jau esat ielogojies kā %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Brīdinājums:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Jums pašlaik nav iestatīta neviena e-pasta adrese. Jums patiešām vajadzētu \"\n\"pievienot e-pasta adresi, lai varētu saņemt paziņojumus, atiestatīt paroli \"\n\"utt.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Apstipriniet savu e-pasta adresi\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Mēs esam nosūtījuši jums verifikācijas e-pastu. Sekojiet norādītajai saitei, \"\n\"lai pabeigtu reģistrācijas procesu. Ja neredzat verifikācijas e-pastu \"\n\"galvenajā iesūtnē, pārbaudiet mēstuļu mapi. Sazinieties ar mums, ja \"\n\"nesaņemat verifikācijas e-pastu dažu minūšu laikā.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Šī vietnes daļa mums nosaka pārbaudīt, ka\\n\"\n\"jūs esat tas, kas jūs apgalvojat esam. Šim mērķim mēs pieprasām, lai jūs\\n\"\n\"apstipriniet savu e-pasta adreses piederību. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Mēs esam jums nosūtījuši e-pastu\\n\"\n\"verifikācijai. Lūdzu noklikšķiniet uz saites šajā e-pastā. Ja neredzat \"\n\"verifikācijas e-pastu galvenajā iesūtnē, pārbaudiet mēstuļu mapi. Pretējā \"\n\"gadījumā\\n\"\n\"sazinieties ar mums, ja nesaņemat to dažu minūšu laikā.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Piezīme:</strong> jūs joprojām varat <a \"\n\"href=\\\"%(email_url)s\\\">nomainīt savu e-pasta adresi</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Ziņojumi:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Izvēlne:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Konta savienojumi\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Divfaktoru autentifikācija\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sesijas\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autorizēt\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s vēlas piekļūt jūsu %(site_name)s kontam.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Ievadiet ierīces kodu\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Ievadiet kodu, kas tiek rādīts jūsu ierīcē.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Turpināt\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Apstiprināt ierīci\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Lūdzu apstipriniet kodu, kas rādīts jūsu %(client_name)s, lai autorizētu šo \"\n\"ierīci.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Noraidīt\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Ierīce autorizēta\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Jūs veiksmīgi autorizējāt savu %(client_name)s ierīci.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Ierīce noraidīta\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Autorizācija jūsu %(client_name)s ierīcei ir noraidīta.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Kļūda\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Palikt pieteicies\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Jūsu konts ir aizsargāts ar divfaktoru autentifikāciju. Lūdzu ievadiet \"\n\"autentifikatora kodu:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Jauns divfaktoru autentifikācijas atkopšanas kodu komplekts ir ģenerēts.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Jauni atkopšanas kodi ģenerēti\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Autentifikatora lietotne aktivizēta.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Autentifikatora lietotne aktivizēta\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Autentifikatora lietotne deaktivizēta.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Autentifikatora lietotne deaktivizēta\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Jauna drošības atslēga ir pievienota.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Drošības atslēga pievienota\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Drošības atslēga ir noņemta.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Drošības atslēga noņemta\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Autentifikatora lietotne\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Autentifikācija, izmantojot autentifikatora lietotni, ir aktīva.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Autentifikatora lietotne nav aktīva.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Deaktivizēt\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktivizēt\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Drošības atslēgas\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Esat pievienojis %(count)s drošības atslēgu.\"\nmsgstr[1] \"Esat pievienojis %(count)s drošības atslēgas.\"\nmsgstr[2] \"Esat pievienojis %(count)s drošības atslēgu.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Nav pievienota neviena drošības atslēga.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Pārvaldīt\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Pievienot\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Atkopšanas kodi\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"Ir pieejams %(unused_count)s no %(total_count)s atkopšanas kodiem.\"\nmsgstr[1] \"Ir pieejami %(unused_count)s no %(total_count)s atkopšanas kodiem.\"\nmsgstr[2] \"Ir pieejami %(unused_count)s no %(total_count)s atkopšanas kodiem.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Nav iestatīti atkopšanas kodi.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Skatīt\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Lejupielādēt\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Ģenerēt\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Jauns atkopšanas kodu komplekts ir ģenerēts.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Drošības atslēga pievienota.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Drošības atslēga noņemta.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Ievadiet autentifikatora kodu:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Jūs grasāties ģenerēt jaunu atkopšanas kodu komplektu savam kontam.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Šī darbība padarīs jūsu esošos kodus nederīgus.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Vai esat pārliecināti?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Neizmantotie kodi\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Lejupielādēt kodus\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Ģenerēt jaunus kodus\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Aktivizēt autentifikatora lietotni\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Lai aizsargātu savu kontu ar divfaktoru autentifikāciju, noskenējiet zemāk \"\n\"esošo QR kodu ar savu autentifikatora lietotni. Pēc tam ievadiet zemāk \"\n\"lietotnes ģenerēto verifikācijas kodu.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Autentifikatora noslēpums\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Jūs varat saglabāt šo noslēpumu un izmantot to, lai vēlāk pārinstalētu savu \"\n\"autentifikatora lietotni.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Deaktivizēt autentifikatora lietotni\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Jūs grasāties deaktivizēt autentifikāciju ar autentifikatora lietotni. Vai \"\n\"esat pārliecināti?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Uzticēties šai pārlūkprogrammai?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Ja izvēlēsieties uzticēties šai pārlūkprogrammai, nākamajā pieteikšanās \"\n\"reizē jums netiks prasīts verifikācijas kods.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Uzticēties %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Neuzticēties\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Pievienot drošības atslēgu\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Noņemt drošības atslēgu\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Vai tiešām vēlaties noņemt šo drošības atslēgu?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Lietojums\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Piekļuves atslēga\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Drošības atslēga\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Šī atslēga nenorāda, vai tā ir piekļuves atslēga.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Nenorādīts\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Pievienota %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Pēdējo reizi izmantota %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Rediģēt\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Rediģēt drošības atslēgu\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Saglabāt\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Izveidot piekļuves atslēgu\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Jūs grasāties izveidot piekļuves atslēgu savam kontam. Tā kā vēlāk varat \"\n\"pievienot papildu atslēgas, varat izmantot aprakstošu nosaukumu, lai \"\n\"atšķirtu atslēgas.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Izveidot\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Šī funkcionalitāte prasa JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Trešās puses pieteikšanās kļūme\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"Notikusi kļūme, mēģinot pieteikties ar jūsu trešās puses kontu.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Jūs varat pieteikties savā kontā, izmantojot jebkuru no šiem trešo pušu \"\n\"kontiem:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Jūsu kontam šobrīd nav piesaistīts neviens trešās puses konts.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Pievienot trešās puses kontu\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Trešās puses konts no %(provider)s ir pievienots jūsu kontam.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Trešās puses konts pievienots\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"Trešās puses konts no %(provider)s ir atvienots no jūsu konta.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Trešās puses konts atvienots\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Pievienot %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Jūs grasāties pievienot jaunu trešās puses kontu no %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Pieteikties caur %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Jūs grasāties pieteikties, izmantojot trešās puses kontu no %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Ieiešana pārtraukta\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Jūs nolēmāt pārtraukt ieiešanu mūsu lapa izmantojot vienu no jūsu kontiem. \"\n\"Ja šī ir kļūda, lūdzu dodaties uz <a href=\\\"%(login_url)s\\\">ieiet</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Trešās puses konts ir pievienots.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Trešās puses konts ir atvienots.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Jūs izmantosiet savu %(provider_name)s kontu, lai ieietu\\n\"\n\"%(site_name)s. Kā pēdējo soli, lūdzu aizpildiet sekojošo formu:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Vai izmantojiet trešo pusi\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Izrakstījāties no visām pārējām sesijām.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Sākta\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP adrese\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Pārlūkprogramma\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Pēdējo reizi redzēts\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Pašreizējā\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Izrakstīties no pārējām sesijām\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Lietotāja sesijas\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"sesijas atslēga\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Konta savienojumi\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Parolei jābūt vismaz {0} simbolus garai.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Sveiciens no %(site_name)s!\\n\"\n#~ \"\\n\"\n#~ \"Jūs saņemat šo e-pasta vēstuli tāpēc, ka jūs vai kāds cits ir pieprasījis \"\n#~ \"paroles atjaunošanu jūsu kontam lapā %(site_domain)s.\\n\"\n#~ \"Jūs varat droši ignorēt šo e-pasta vēstuli, ja jūs nepieprasījat paroles \"\n#~ \"atjaunošanu. Spiedied uz linka zemāk, lai atjaunotu jūsu paroli.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Sekojošas e-pasta adreses ir piesaistītas jūsu kontam:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Apstipriniet e-pasta adresi\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Lūdzu ieejiet iekšā ar vienu\\n\"\n#~ \"no jūsu eksistējošiem trešās puses kontiem. Vai <a \"\n#~ \"href=\\\"%(signup_url)s\\\">reģistrējieties</a>\\n\"\n#~ \"%(site_name)s kontam un ieejiet zemāk:\"\n\n#~ msgid \"or\"\n#~ msgstr \"vai\"\n\n#~ msgid \"change password\"\n#~ msgstr \"Nomainīt paroli\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Ieiet ar OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Šī e-pasta adrese jau ir piesaistīta citam kontam.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Mēs jums nosūtījām e-pasta vēstuli. Lūdzu sazinieties ar mums, ja dažu \"\n#~ \"minūšu laikā nesaņemat vēstuli.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"Nepareiza pieteikšanās informācija un/vai parole.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"Lietotājvārds var saturēt tikai burtus, ciparus un @/./+/-/_.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"Šis lietotājvārds jau ir aizņemts. Lūdzu izvēlaties citu.\"\n"
  },
  {
    "path": "allauth/locale/mn/LC_MESSAGES/django.po",
    "content": "# Mongolian Translation\n# Copyright (C) 2021\n# This file is distributed under the same license as the PACKAGE package.\n# Bilgutei Erdenebayar <beke0130@gmail.com>, 2021.\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: 0.1\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2024-04-20 21:32+0200\\n\"\n\"Last-Translator: Bilgutei Erdenebayar <beke0130@gmail.com>\\n\"\n\"Language-Team: Mongolian <beke0130@gmail.com>\\n\"\n\"Language: mn\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Энэ бүртгэл одоогоор идэвхгүй байна.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Та үндсэн имэйл хаягаа устгах боломжгүй.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Энэ имэйл хаяг энэ бүртгэлтэй холбогдсон байна.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Таны оруулсан имэйл хаяг болон/эсвэл нууц үг буруу байна.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Таны оруулсан утасны дугаар болон/эсвэл нууц үг буруу байна.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Өөр хэрэглэгч энэ имэйл хаягаар бүртгүүлсэн байна.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Одоогийн нууц үгээ оруулна уу.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Код буруу байна.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Нууц үг буруу байна.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Түлхүүр буруу эсвэл хугацаа нь дууссан.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Нэвтрэлт буруу байна.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Нууц үг шинэчлэх токен буруу байна.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Та %d-с илүү имэйл хаяг нэмэх боломжгүй.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Өөр хэрэглэгч энэ утасны дугаараар бүртгүүлсэн байна.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Хэт олон амжилтгүй нэвтрэх оролдлого. Дараа дахин оролдоорой.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Имэйл хаяг ямар ч хэрэглэгчийн бүртгэлтэй холбогдоогүй.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Утасны дугаар ямар ч хэрэглэгчийн бүртгэлтэй холбогдоогүй.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Таны үндсэн имэйл хаягийг баталгаажуулсан байх ёстой.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Хэрэглэгчийн нэрийг ашиглах боломжгүй. Өөр нэр сонгоно уу.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Таны оруулсан имэйл хаяг болон/эсвэл нууц үг буруу байна.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Зөвхөн нэгийг сонгоно уу.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Шинэ утга одоогийнхоос ялгаатай байх ёстой.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Тэвчээртэй байна уу, та хэт олон хүсэлт илгээж байна.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Нууц үгээ ашиглах\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Баталгаажуулагч апп эсвэл код ашиглах\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Аюулгүй байдлын түлхүүр ашиглах\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} баталгаажсан гэж тэмдэглэгдлээ.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"{email}-г баталгаажсан гэж тэмдэглэхэд алдаа гарлаа.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Сонгосон имэйл хаягуудыг баталгаажсан гэж тэмдэглэх\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Бүртгэлүүд\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"Имэйл хаяг\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Имэйл хаяг\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Улсын кодыг оруулсан утасны дугаар оруулна уу (жнь: АНУ-д +1).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Утас\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Та өмнө оруулсантай ижил нууц үг оруулах ёстой.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Нууц үг\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Намайг Санах\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Хэрэглэгчийн нэр\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Нэвтрэх\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Хэрэглэгчийн нэр, имэйл эсвэл утас\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Хэрэглэгчийн нэр эсвэл имэйл\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Хэрэглэгчийн нэр эсвэл утас\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Имэйл эсвэл утас\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Нууц үгээ мартсан уу?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"Имэйл (дахин)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Имэйл хаягийн баталгаажуулалт\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"Имэйл (заавал биш)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Хэрэглэгчийн нэр (заавал биш)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Та өмнө оруулсантай ижил имэйл бичих ёстой.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Нууц үг (дахин)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Одоогын Нууц Үг\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Шинэ Нууц Үг\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Шинэ Нууц Үг (дахин)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Код\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"хэрэглэгч\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"имэйл хаяг\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"баталгаажуулсан\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"үндсэн\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"имэйл хаягууд\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"үүсгэсэн\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"илгээсэн\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"түлхүүр\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"имэйл баталгаажуулалт\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"имэйл баталгаажуулалт\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Хэрэглэгчийн ID-гаа харах\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Имэйл хаягаа харах\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Үндсэн профайл мэдээллээ харах\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Зөвшөөрөл олгох\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"'URI орлуулагч тэмдэгтийг зөвшөөрөх' идэвхжүүлээгүй бол орлуулагч тэмдэгт \"\n\"(*) зөвшөөрөгдөхгүй.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' нэгээс олон орлуулагч тэмдэгт (*) агуулж байна. Нэг URI-д зөвхөн \"\n\"нэг орлуулагч тэмдэгт зөвшөөрөгдөнө.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Орлуулагч тэмдэгт зөвхөн URI-ийн хост нэрийн хэсэгт зөвшөөрөгдөнө.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Зөвшөөрлийн код\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Төхөөрөмжийн код\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Клиентийн итгэмжлэл\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Шинэчлэх токен\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Нууцлалтай\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Нийтийн\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Клиент хүсэлт гаргах боломжтой хүрээ. Мөр бүрт нэг утга оруулна уу, жнь: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Хэрэв клиент ямар ч хүрээ заагаагүй бол эдгээр анхдагч хүрээг ашиглана. Мөр \"\n\"бүрт нэг утга оруулна уу, жнь: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Зөвшөөрөгдсөн олголтын төрлүүдийн жагсаалт. Мөр бүрт нэг утга оруулна уу, \"\n\"жнь: authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Хөндлөн домэйн хүсэлтийн зөвшөөрөгдсөн эх үүсвэрүүдийн жагсаалт, мөр бүрт \"\n\"нэг.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"URI чиглүүлэлт болон CORS эх үүсвэрт орлуулагч тэмдэгт (*) зөвшөөрөх. \"\n\"Идэвхжүүлсэн үед URI-д дэд домэйнтэй таарахын тулд нэг од агуулж болно.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Зөвшөөрөгдсөн хариу төрлүүдийн жагсаалт. Мөр бүрт нэг утга оруулна уу, жнь: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"клиент\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"клиентүүд\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Хоёр хүчин зүйлийн баталгаажуулалтаар хамгаалагдсан бүртгэлд имэйл хаяг \"\n\"нэмэх боломжгүй.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Хоёр хүчин зүйлийн баталгаажуулалтыг идэвхгүй болгох боломжгүй.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Хоёр хүчин зүйлийн баталгаажуулалт идэвхжүүлээгүйгээр сэргээх код үүсгэх \"\n\"боломжгүй.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Имэйл хаягаа баталгаажуулаагүй бол хоёр хүчин зүйлийн баталгаажуулалтыг \"\n\"идэвхжүүлэх боломжгүй.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Мастер түлхүүр\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Нөөц түлхүүр\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Түлхүүр №{number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Сэргээх кодууд\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP Баталгаажуулагч\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Баталгаажуулагч код\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Нууц үггүй\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Нууц үггүй горимыг идэвхжүүлснээр зөвхөн энэ түлхүүрээр нэвтрэх боломжтой \"\n\"боловч биометрик эсвэл PIN хамгаалалт зэрэг нэмэлт шаардлагуудыг тавина.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Энэ имэйл хаягтай бүртгэл аль хэдийн байна. Эхлээд тэр бүртгэлд нэвтэрч, \"\n\"дараа нь %s бүртгэлээ холбоно уу.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Токен буруу байна.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Таны бүртгэлд нууц үг тохируулаагүй байна.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Таны бүртгэлд баталгаажсан имэйл хаяг алга.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Та сүүлчийн үлдсэн гуравдагч этгээдийн бүртгэлээ салгах боломжгүй.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Гуравдагч этгээдийн бүртгэл аль хэдийн өөр бүртгэлд холбогдсон байна.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Сошиал Бүртгэлүүд\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"үйлчилгээ үзүүлэгч\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"үйлчилгээ үзүүлэгчийн ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"нэр\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"клиент ID\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"Апп ID эсвэл хэрэглэгчийн түлхүүр\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"нууц түлхүүр\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API нууц, клиент нууц эсвэл хэрэглэгчийн нууц\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Түлхүүр\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"сошиал апп\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"сошиал апп-ууд\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"сүүлд нэвтэрсэн\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"бүртгүүлсэн огноо\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"нэмэлт өгөгдөл\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"сошиал хаяг\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"сошиал хаягууд\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"токен\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) эсвэл нэвтрэх токен (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"токен нууц\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) эсвэл шинэчлэх токен (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"дуусах хугацаа\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"сошиал апп токен\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"сошиал апп токенууд\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Профайл мэдээлэл буруу байна\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Нэвтрэх\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Болих\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\\\"%s\\\"-с request токен авах үед буруу хариу ирлээ. Хариу: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\"-с access токен авах үед буруу хариу.\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\"-д request токен хадгалагдаагүй.\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\"-д access токен хадгалагдаагүй.\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\" дээрх private resource-д хандах боломжгүй.\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\"-с request токен авах үед буруу хариу.\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Бүртгэл идэвхгүй\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Энэ бүртгэл идэвхгүй байна.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Бид %(recipient)s руу код илгээлээ. Кодын хугацаа удахгүй дуусах тул хурдан \"\n\"оруулна уу.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Баталгаажуулах\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Шинэ код хүсэх\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Хандалтыг баталгаажуулах\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Бүртгэлээ хамгаалахын тулд дахин баталгаажуулалт хийнэ үү.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Өөр сонголтууд\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Имэйл баталгаажуулалт\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Имэйл баталгаажуулалтын код оруулна уу\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Өөр имэйл хаяг ашиглах\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Нэвтрэх\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Нэвтрэх код оруулна уу\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Нууц үг шинэчлэх\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Нууц үг шинэчлэх код оруулна уу\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Утасны баталгаажуулалт\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Утасны баталгаажуулалтын код оруулна уу\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Өөр утасны дугаар ашиглах\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Имэйл Хаягууд\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Дараах и-мэйл хаягууд таны бүртгэлтэй холбоотой байна:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Баталгаажсан\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Баталгаажаагүй\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Үндсэн\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Үндсэн Болгох\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Баталгаажуулалтыг дахин илгээх\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Устгах\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Имэйл хаяг нэмэх\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Имэйл нэмэх\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Та үнэхээр сонгосон имэйл хаягаа устгахыг хүсэж байна уу?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Та эсвэл өөр хэн нэгэн дараах имэйл хаягаар\\n\"\n\"бүртгэл үүсгэхийг оролдсон тул энэ имэйлийг хүлээн авч байна:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Гэвч энэ имэйл хаягтай бүртгэл аль хэдийн байна. Хэрэв та үүнийг\\n\"\n\"мартсан бол нууц үг сэргээх процедурыг ашиглан\\n\"\n\"бүртгэлээ сэргээнэ үү:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Бүртгэл аль хэдийн байна\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"%(site_name)s-с мэнд хүргэж байна!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"%(site_name)s-г хэрэглэсэнд баярлалаа!%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Таны бүртгэлд дараах өөрчлөлт хийгдсэн тул энэ имэйлийг хүлээн авч байна:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Хэрэв та энэ өөрчлөлтийг таниагүй бол нэн даруй зохих аюулгүй байдлын арга \"\n\"хэмжээ авна уу. Таны бүртгэлийн өөрчлөлт дараахаас ирсэн:\\n\"\n\"\\n\"\n\"- IP хаяг: %(ip)s\\n\"\n\"- Хөтөч: %(user_agent)s\\n\"\n\"- Огноо: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Таны имэйл %(from_email)s-с %(to_email)s руу өөрчлөгдлөө.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Имэйл өөрчлөгдсөн\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Таны имэйл баталгаажлаа.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Имэйл баталгаажуулалт\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"%(user_display)s хэрэглэгч %(site_domain)s дээр бүртгэл үүсгэхийн тулд таны \"\n\"имэйл хаягийг оруулсан тул та энэ имэйлийг хүлээн авч байна.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Таны имэйл баталгаажуулах код доор байна. Нээлттэй хөтчийн цонхонд оруулна \"\n\"уу.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Зөв эсэхийг баталгаажуулахын тулд %(activate_url)s руу очно уу\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Имэйл хаягаа баталгаажуулна уу\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"%(deleted_email)s имэйл хаяг таны бүртгэлээс устгагдлаа.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Имэйл устгагдсан\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"Таны нэвтрэх код доор байна. Нээлттэй хөтчийн цонхонд оруулна уу.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"Хэрэв та энэ үйлдлийг хийгээгүй бол энэ имэйлийг үл тоомсорлож болно.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Нэвтрэх код\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Таны нууц үг өөрчлөгдлөө.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Нууц үг өөрчлөгдсөн\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Таны нууц үг шинэчлэх код доор байна. Нээлттэй хөтчийн цонхонд оруулна уу.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Нууц үг шинэчлэх код\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Та эсвэл өөр хэн нэгэн таны бүртгэлийн нууц үг шинэчлэх хүсэлт гаргасан тул \"\n\"энэ имэйлийг хүлээн авч байна.\\n\"\n\"Хэрэв та нууц үг шинэчлэх хүсэлт гаргаагүй бол энэ имэйлийг үл тоомсорлож \"\n\"болно. Нууц үгээ шинэчлэхийн тулд доорх холбоос дээр дарна уу.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Хэрэв та мартсан бол таны хэрэглэгчийн нэр %(username)s байна.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Нууц Үг Шинэчлэх Имэйл\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Таны нууц үг шинэчлэгдлээ.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Таны нууц үг тохируулагдлаа.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Нууц үг тохируулагдсан\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Та эсвэл өөр хэн нэгэн %(email)s имэйлтэй бүртгэлд хандахыг оролдсон тул энэ \"\n\"имэйлийг хүлээн авч байна. Гэвч бидний мэдээллийн санд ийм бүртгэл \"\n\"бүртгэгдээгүй байна.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"Хэрэв энэ нь та байсан бол доорх холбоосыг ашиглан бүртгүүлж болно.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Тодорхойгүй бүртгэл\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Имэйл хаяг\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Одоогийн имэйл\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Солигдож байна\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Таны имэйл хаяг баталгаажуулалт хүлээж байна.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Өөрчлөлтийг болих\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Солих\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Имэйл солих\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Имэйл Хаяг Баталгаажуулах\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"<a href=\\\"mailto:%(email)s\\\">%(email)s</a> нь %(user_display)s хэрэглэгчийн \"\n\"имэйл хаяг гэдгийг баталгаажуулна уу.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"%(email)s-г баталгаажуулах боломжгүй, учир нь өөр бүртгэл аль хэдийн \"\n\"баталгаажуулсан байна.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Энэ имэйл баталгаажуулах холбоосын хугацаа дууссан эсвэл хүчингүй байна. <a \"\n\"href=\\\"%(email_url)s\\\">Шинэ имэйл баталгаажуулах хүсэлт гаргана уу</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Хэрэв та бүртгэл үүсгээгүй байгаа бол эхлээд %(link)sбүртгүүлнэ \"\n\"үү%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Нэвтрэх түлхүүрээр нэвтрэх\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Надад нэвтрэх код илгээх\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Гарах\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Та холболт салгахдаа итгэлтэй байна уу?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Та үндсэн имэйл хаяг (%(email)s)-г устгах боломжгүй.\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"%(email)s-руу баталгаажуулах имэйл илгээсэн.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Та %(email)s-г баталгаажууллаа.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"%(email)s и-мэйл хаягийг устгасан.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"%(name)s нэрээр амжилттай нэвтэрлээ.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Та холболт салгалаа.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Нэвтрэх код %(recipient)s руу илгээгдлээ.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Нууц үг амжилттай өөрчлөгдлөө.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Нууц үгийг амжилттай тохирууллаа.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Баталгаажуулах код %(phone)s руу илгээгдлээ.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Та %(phone)s утасны дугаарыг баталгаажууллаа.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Үндсэн имэйл хаягийг тохируулсан.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Нууц үг солих\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Нууц Үг Мартсан?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Нууц үгээ мартсан уу? Доор имэйл хаягаа оруулбал бид танд нууц үг шинэчлэх \"\n\"имэйл илгээнэ.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Нууц Үг Шинэчлэх\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"Нууц үгээ шинэчлэхэд асуудал гарвал бидэнтэй холбогдоно уу.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Бид танд имэйл илгээлээ. Хэрэв хүлээн аваагүй бол спам хавтсаа шалгана уу. \"\n\"Хэдэн минутын дотор хүлээн аваагүй бол бидэнтэй холбоо барина уу.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Муу токен\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Нууц үг шинэчлэх холбоос хүчингүй байсан, үүнийг аль хэдийн ашигласан байж \"\n\"магадгүй. <a href=\\\"%(passwd_reset_url)s\\\">шинэ нууц үг шинэчлэх</a> хүсэлт \"\n\"гаргана уу.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Таны нууц үг одоо өөрчлөгдсөн байна.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Нууц үг тохируулах\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Утас солих\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Одоогийн утас\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Таны утасны дугаар баталгаажуулалт хүлээж байна.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Утас солих\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Нууц үгээ оруулна уу:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Та нууц үггүй нэвтрэхийн тулд тусгай код хүлээн авна.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Код хүсэх\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Бусад нэвтрэх сонголтууд\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Бүртгүүлэх\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Бүртгүүлэх\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"\"\n\"Бүртгэлтэй юу? Тэгвэл бүртгэлтэй хаягаар %(link)sнэвтрэнэ үү%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Нэвтрэх түлхүүрээр бүртгүүлэх\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Нэвтрэх түлхүүрээр бүртгүүлэх\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Бусад сонголтууд\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Бүртгэл хаалттай\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Уучлаарай, бүртгэл одоогоор хаалттай байна.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Анхаарна уу\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Та аль хэдийн %(user_display)s нэрээр нэвтэрсэн байна.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Анхааруулга:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Танд одоогоор тохируулсан имэйл хаяг байхгүй байна. Мэдэгдэл хүлээн авах, \"\n\"нууц үгээ шинэчлэх зэрэгт имэйл хаяг нэмэх хэрэгтэй.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Имэйл хаягаа баталгаажуулна уу\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Бид танд баталгаажуулах имэйл илгээлээ. Бүртгэлийг дуусгахын тулд өгөгдсөн \"\n\"холбоосыг дагана уу. Баталгаажуулах имэйл ирсэн эсэхийг харахгүй бол спам \"\n\"хавтсаа шалгана уу. Хэдэн минутын дотор хүлээн аваагүй бол бидэнтэй холбоо \"\n\"барина уу.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Сайтын энэ хэсэг нь таныг өөрийгөө мөн болохыг\\n\"\n\"баталгаажуулахыг биднээс шаарддаг. Энэ зорилгоор бид таныг\\n\"\n\"имэйл хаягийнхаа эзэмшигч мөн эсэхийг баталгаажуулахыг шаарддаг. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Бид танд баталгаажуулах имэйл илгээлээ.\\n\"\n\"Тэр имэйл дэх холбоос дээр дарна уу. Баталгаажуулах имэйл ирсэн эсэхийг \"\n\"харахгүй бол спам хавтсаа шалгана уу. Эсвэл\\n\"\n\"хэдэн минутын дотор хүлээн аваагүй бол бидэнтэй холбоо барина уу.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Анхааруулга:</strong> та <a href=\\\"%(email_url)s\\\">имэйл хаягаа \"\n\"өөрчлөх</a> боломжтой хэвээр байна.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Мэдэгдлүүд:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Цэс:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Бүртгэлийн холболтууд\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Хоёр хүчин зүйлийн баталгаажуулалт\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Сессионууд\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Зөвшөөрөх\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s таны %(site_name)s бүртгэлд хандахыг хүсч байна.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Төхөөрөмжийн код оруулна уу\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Төхөөрөмж дээрээ харагдаж буй кодыг оруулна уу.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Үргэлжлүүлэх\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Төхөөрөмж баталгаажуулах\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Энэ төхөөрөмжийг зөвшөөрөхийн тулд %(client_name)s дээр харуулсан кодыг \"\n\"баталгаажуулна уу.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Татгалзах\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Төхөөрөмж зөвшөөрөгдсөн\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Та %(client_name)s төхөөрөмжөө амжилттай зөвшөөрлөө.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Төхөөрөмж татгалзагдсан\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Таны %(client_name)s төхөөрөмжийн зөвшөөрөл татгалзагдлаа.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Алдаа\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Нэвтэрсэн хэвээр байх\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Таны бүртгэл хоёр хүчин зүйлийн баталгаажуулалтаар хамгаалагдсан байна. \"\n\"Баталгаажуулагч код оруулна уу:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"Хоёр хүчин зүйлийн баталгаажуулалтын шинэ сэргээх кодууд үүсгэгдлээ.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Шинэ сэргээх кодууд үүсгэгдсэн\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Баталгаажуулагч апп идэвхжлээ.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Баталгаажуулагч апп идэвхжсэн\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Баталгаажуулагч апп идэвхгүй боллоо.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Баталгаажуулагч апп идэвхгүй болсон\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Шинэ аюулгүй байдлын түлхүүр нэмэгдлээ.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Аюулгүй байдлын түлхүүр нэмэгдсэн\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Аюулгүй байдлын түлхүүр устгагдлаа.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Аюулгүй байдлын түлхүүр устгагдсан\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Баталгаажуулагч апп\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Баталгаажуулагч апп ашиглан баталгаажуулалт идэвхтэй байна.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Баталгаажуулагч апп идэвхгүй байна.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Идэвхгүй болгох\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Идэвхжүүлэх\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Аюулгүй байдлын түлхүүрүүд\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"%(count)s аюулгүй байдлын түлхүүр нэмлээ.\"\nmsgstr[1] \"%(count)s аюулгүй байдлын түлхүүр нэмлээ.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Аюулгүй байдлын түлхүүр нэмэгдээгүй байна.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Удирдах\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Нэмэх\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Сэргээх кодууд\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"%(total_count)s сэргээх кодоос %(unused_count)s боломжтой байна.\"\nmsgstr[1] \"%(total_count)s сэргээх кодоос %(unused_count)s боломжтой байна.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Сэргээх код тохируулагдаагүй байна.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Харах\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Татах\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Үүсгэх\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Шинэ сэргээх кодууд үүсгэгдлээ.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Аюулгүй байдлын түлхүүр нэмэгдлээ.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Аюулгүй байдлын түлхүүр устгагдлаа.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Баталгаажуулагч код оруулна уу:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Та бүртгэлийнхээ шинэ сэргээх кодуудыг үүсгэх гэж байна.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Энэ үйлдэл таны одоогийн кодуудыг хүчингүй болгоно.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Та итгэлтэй байна уу?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Ашиглаагүй кодууд\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Кодууд татах\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Шинэ кодууд үүсгэх\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Баталгаажуулагч апп идэвхжүүлэх\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Бүртгэлээ хоёр хүчин зүйлийн баталгаажуулалтаар хамгаалахын тулд доорх QR \"\n\"кодыг баталгаажуулагч аппаараа уншуулна уу. Дараа нь аппаас үүсгэсэн \"\n\"баталгаажуулах кодыг доор оруулна уу.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Баталгаажуулагчийн нууц\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Та энэ нууцыг хадгалж, дараа нь баталгаажуулагч аппаа дахин суулгахад \"\n\"ашиглаж болно.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Баталгаажуулагч апп идэвхгүй болгох\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Та баталгаажуулагч апп дээр суурилсан баталгаажуулалтыг идэвхгүй болгох гэж \"\n\"байна. Та итгэлтэй байна уу?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Энэ хөтөчид итгэх үү?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Хэрэв та энэ хөтөчид итгэхээр сонговол дараагийн удаа нэвтрэхэд \"\n\"баталгаажуулах код асуухгүй.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"%(period)s итгэх\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Итгэхгүй\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Аюулгүй байдлын түлхүүр нэмэх\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Аюулгүй байдлын түлхүүр устгах\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Та энэ аюулгүй байдлын түлхүүрийг устгахдаа итгэлтэй байна уу?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Хэрэглээ\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Нэвтрэх түлхүүр\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Аюулгүй байдлын түлхүүр\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Энэ түлхүүр нэвтрэх түлхүүр мөн эсэхийг заагаагүй байна.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Тодорхойгүй\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"%(created_at)s-д нэмэгдсэн\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Сүүлд ашигласан %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Засах\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Аюулгүй байдлын түлхүүр засах\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Хадгалах\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Нэвтрэх түлхүүр үүсгэх\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Та бүртгэлдээ нэвтрэх түлхүүр үүсгэх гэж байна. Дараа нь нэмэлт түлхүүрүүд \"\n\"нэмэх боломжтой тул тэдгээрийг ялгахын тулд тодорхойлох нэр ашиглаж болно.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Үүсгэх\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Энэ функц JavaScript шаарддаг.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Гуравдагч этгээдээр нэвтрэхэд алдаа гарлаа\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Таны гуравдагч этгээдийн бүртгэлээр нэвтрэхийг оролдох үед алдаа гарлаа.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Та дараах гуравдагч этгээдийн бүртгэлүүдийн аль нэгийг ашиглан өөрийн \"\n\"бүртгэлд нэвтэрч болно:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"\"\n\"Танд одоогоор энэ бүртгэлд холбогдсон гуравдагч этгээдийн бүртгэл байхгүй \"\n\"байна.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Гуравдагч этгээдийн бүртгэл нэмэх\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"%(provider)s-ийн гуравдагч этгээдийн бүртгэл таны бүртгэлд холбогдлоо.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Гуравдагч этгээдийн бүртгэл холбогдсон\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"%(provider)s-ийн гуравдагч этгээдийн бүртгэл таны бүртгэлээс салгагдлаа.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Гуравдагч этгээдийн бүртгэл салгагдсан\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"%(provider)s холбох\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Та %(provider)s-ийн шинэ гуравдагч этгээдийн бүртгэлийг холбох гэж байна.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"%(provider)s-р нэвтрэх\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Та %(provider)s-ийн гуравдагч этгээдийн бүртгэлээр нэвтрэх гэж байна.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Нэвтрэлт цуцлагдсан\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Та одоо байгаа бүртгэлийнхээ аль нэгийг ашиглан манай сайтад нэвтрэхээ \"\n\"цуцлахаар шийдсэн. Хэрэв энэ нь алдаа байсан бол <a \"\n\"href=\\\"%(login_url)s\\\"\\\">нэвтэрнэ үү</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Гуравдагч этгээдийн бүртгэл холбогдлоо.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Гуравдагч этгээдийн бүртгэл салгагдлаа.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Та %(site_name)s руу нэвтрэхийн тулд %(provider_name)s бүртгэлээ\\n\"\n\"ашиглах гэж байна. Эцсийн алхам болгон дараах маягтыг бөглөнө үү:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Эсвэл гуравдагч этгээд ашиглах\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Бусад бүх сессионоос гарлаа.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Эхэлсэн\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP хаяг\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Хөтөч\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Сүүлд харагдсан\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Одоогийн\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Бусад сессионоос гарах\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Хэрэглэгчийн сессионууд\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"сессионы түлхүүр\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Бүртгэлийн холболтууд\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Нууц үг хамгийн багадаа {0} тэмдэгттэй байх ёстой.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Та эсвэл өөр хэн нэгэн таны бүртгэлтэй нууц үгийг хүссэн тул нэ \"\n#~ \"имэйлийгхүлээн авч байна.\\n\"\n#~ \"Хэрэв та нууц үг шинэчлэх хүсэлт гаргаагүй бол энэ имэйлийг устгаж \"\n#~ \"болно.Нууц үгээ шинэчлэх бол доорх холбоос дээр дарна уу.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Дараах и-мэйл хаягууд таны бүртгэлтэй холбоотой байна:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Имэйл Хаяг Баталгаажуулах\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Одоо байгаа гуравдагч\\n\"\n#~ \"этгээдийн бүртгэлийн аль нэгээр нэвтэрнэ үү. Эсвэл %(site_name)s бүртгэлд \"\n#~ \"%(link)sбүртгүүлж%(end_link)sдоор нэвтэрнэ үү:\"\n\n#~ msgid \"or\"\n#~ msgstr \"эсвэл\"\n\n#~ msgid \"change password\"\n#~ msgstr \"нууц үг солих\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"OpenID-р Нэвтрэх\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Энэ имэйл хаяг өөр бүртгэлтэй холбогдсон байна.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Бид танд имэйл илгээсэн. Хэдхэн минутын дотор хүлээж авахгүй бол бидэнтэй \"\n#~ \"холбоо барина уу.\"\n"
  },
  {
    "path": "allauth/locale/nb/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR Free Software Foundation, Inc.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-06-15 19:17+0000\\n\"\n\"Last-Translator: Anders Birkenes <datagutten@datagutten.net>\\n\"\n\"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/allauth/\"\n\"django-allauth/nb_NO/>\\n\"\n\"Language: nb\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 5.12-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Denne kontoen er inaktiv.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Du kan ikke fjerne den primære e-postadressen.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Denne e-postadressen er allerede tilknyttet denne kontoen.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"E-postadressen og/eller passordet du oppgav er feil.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Telefonnummeret og/eller passordet du oppgav er feil.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"En bruker med denne e-postadressen er allerede registrert.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Vennligst skriv inn ditt passord.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Feil kode.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Feil passord.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Ugyldig eller utgått token.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Ugyldig pålogging.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Nøkkelen for tilbakestilling av passord var ugyldig.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Du kan ikke legge til mer enn %d epostadresser.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"En bruker med dette telefonnummeret er allerede registrert.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"For mange innloggingsforsøk. Vennligst prøv igjen senere.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Epostadressen er ikke tilknyttet noen brukerkonto.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Telefonnummeret er ikke tilknyttet noen brukerkonto.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Din primære e-postadresse må være verifisert.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Brukernavnet kan ikke benyttes. Vennligst velg et annet brukernavn.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Brukernavnet og/eller passordet du oppgav er feil.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Velg kun en.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Den nye verdien må være forskjellig fra den nåværende.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Vær tålmodig, du sender for mange forespørsler.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Bruk passordet ditt\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Bruk autentiseringsapp eller kode\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Bruk en sikkerhetsnøkkel\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Markerte {email} som verifisert.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Kunne ikke markere {email} som verifisert.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Marker den valgte epostadressen som bekreftet\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Kontoer\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-post\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"E-postadresse\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Skriv inn et telefonnummer inkludert landskode (f.eks. +47 for Norge).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Du må skrive det samme passordet hver gang.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Passord\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Husk meg\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Brukernavn\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Logg inn\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Brukernavn, e-post eller telefon\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Brukernavn eller e-post\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Brukernavn eller telefon\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-post eller telefon\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Glemt ditt passord?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-post (igjen)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Bekreftelse av e-postadresse\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-post (valgfritt)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Brukernavn (valgfritt)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Du må skrive inn samme e-post hver gang.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Passord (igjen)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Nåværende passord\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Nytt passord\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Nytt passord (igjen)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kode\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"bruker\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"e-postadresse\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"verifisert\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"primær\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"e-postadresser\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"opprettet\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"sendt\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"nøkkel\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"e-postbekreftelse\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"e-postbekreftelser\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Se din bruker-ID\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Se din e-postadresse\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Se din grunnleggende profilinformasjon\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Gi tillatelser\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Jokertegn er ikke tillatt med mindre 'Tillat URI-jokertegn' er aktivert.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' inneholder mer enn ett jokertegn (*). Bare ett jokertegn per URI er \"\n\"tillatt.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Jokertegn er bare tillatt i vertsnavndelen av URI-en.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Autorisasjonskode\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Enhetskode\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Klientlegitimasjon\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Oppdateringstoken\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Konfidensiell\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Offentlig\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Omfanget(-ene) klienten har lov til å be om. Oppgi én verdi per linje, \"\n\"f.eks.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Hvis klienten ikke angir noe omfang, brukes disse standardomfangene. Oppgi \"\n\"én verdi per linje, f.eks.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"En liste over tillatte bevilgningstyper. Oppgi én verdi per linje, f.eks.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"En liste over tillatte opphav for kryssopprinnelsesforespørsler, én per \"\n\"linje.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Tillat jokertegn (*) i omdirigerings-URI-er og CORS-opphav. Når aktivert kan \"\n\"URI-er inneholde en enkelt stjerne for å matche underdomener.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"En liste over tillatte responstyper. Oppgi én verdi per linje, f.eks.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"klient\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"klienter\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Du kan ikke legge til en e-postadresse til en konto beskyttet av \"\n\"tofaktorautentisering.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Du kan ikke deaktivere tofaktorautentisering.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Du kan ikke generere gjenopprettingskoder uten å ha tofaktorautentisering \"\n\"aktivert.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Du kan ikke aktivere tofaktorautentisering før du har verifisert e-\"\n\"postadressen din.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Hovednøkkel\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Reservenøkkel\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Nøkkel nr. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Gjenopprettingskoder\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP-autentiserer\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Autentiseringskode\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Passordløs\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Å aktivere passordløs drift lar deg logge inn med bare denne nøkkelen, men \"\n\"krever ytterligere sikkerhet som biometri eller PIN-beskyttelse.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"En konto med denne e-postadressen eksisterer allerede. Vennligst logg inn på \"\n\"den kontoen først, og koble deretter til din %s-konto.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Ugyldig token.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Kontoen din har ikke noe passord.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Din konto har ingen verifisert e-postadresse.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Du kan ikke koble fra din siste gjenværende tredjpartskonto.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Tredjepartskontoen er allerede tilknyttet en annen konto.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Sosiale kontoer\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"tilbyder\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"tilbyder-ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"navn\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"klient-ID\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"App-ID eller konsumentnøkkel\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"hemmelig nøkkel\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API-nøkkel, klient-nøkkel eller konsumentnøkkel\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Nøkkel\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"sosial applikasjon\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"sosiale applikasjoner\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"siste innlogging\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"ble med dato\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"ekstra data\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"sosialkonto\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"sosialkontoer\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"nøkkel\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) eller aksess token (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"hemmelig nøkkel\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) eller oppdateringsnøkkel (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"utgår den\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"sosial applikasjonsnøkkel\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"sosial applikasjonsnøkler\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Ugyldig profildata\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Logg inn\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Avbryt\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"Ugyldig svar ved henting av token fra \\\"%s\\\". Svaret var: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Ugyldig respons ved henting av tilgangsnøkkel fra \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Ingen etterspørselsnøkler lagret for \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Ingen tilgangsnøkler lagret for \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Ingen tilgang til private ressurser på \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Ugyldig respons ved henting av forespørselsnøkkel fra \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Inaktiv konto\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Denne kontoen er inaktiv.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Vi har sendt en kode til %(recipient)s. Koden utløper snart, så vennligst \"\n\"skriv den inn snart.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Bekreft\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Be om ny kode\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Bekreft tilgang\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Vennligst autentiser deg på nytt for å beskytte kontoen din.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Alternative valg\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"E-postverifisering\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Skriv inn e-postverifiseringskode\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Bruk en annen e-postadresse\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Logg inn\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Skriv inn innloggingskode\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Tilbakestilling av passord\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Skriv inn kode for tilbakestilling av passord\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Telefonverifisering\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Skriv inn telefonverifiseringskode\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Bruk et annet telefonnummer\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"E-postadresser\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Følgende e-postadresser er assosiert med din konto:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Verifisert\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Ikke verifisert\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Primær\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Sett som primær\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Send verifikasjon på nytt\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Fjern\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Legg til e-postadresse\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Legg til e-post\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Er du sikker på at du vil fjerne valgt e-postadresse?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Du mottar denne e-posten fordi du eller noen andre prøvde å registrere\\n\"\n\"en konto med e-postadressen:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Imidlertid eksisterer det allerede en konto med den e-postadressen. Hvis du \"\n\"har\\n\"\n\"glemt dette, vennligst bruk prosedyren for glemt passord for å gjenopprette\\n\"\n\"kontoen din:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Konto eksisterer allerede\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Hei fra %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Takk for at du bruker %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Du mottar denne e-posten fordi følgende endring ble gjort på kontoen din:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Hvis du ikke gjenkjenner denne endringen, vennligst ta nødvendige \"\n\"sikkerhetstiltak umiddelbart. Endringen på kontoen din stammer fra:\\n\"\n\"\\n\"\n\"- IP-adresse: %(ip)s\\n\"\n\"- Nettleser: %(user_agent)s\\n\"\n\"- Dato: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"E-posten din er endret fra %(from_email)s til %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"E-post endret\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"E-posten din er bekreftet.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"E-postbekreftelse\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Du mottar denne eposten fordi %(user_display)s har oppgitt din e-postadresse \"\n\"for å opprette en konto på %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Din e-postverifiseringskode er oppgitt nedenfor. Vennligst skriv den inn i \"\n\"det åpne nettleservinduet.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"For å bekrefte at dette stemmer, gå til %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Vennligst bekreft din e-postadresse\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"E-postadressen %(deleted_email)s er fjernet fra kontoen din.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"E-post fjernet\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Din innloggingskode er oppgitt nedenfor. Vennligst skriv den inn i det åpne \"\n\"nettleservinduet.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Denne e-posten kan trygt ignoreres hvis du ikke igangsatte denne handlingen.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Innloggingskode\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Passordet ditt er endret.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Passord endret\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Din kode for tilbakestilling av passord er oppgitt nedenfor. Vennligst skriv \"\n\"den inn i det åpne nettleservinduet.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Kode for tilbakestilling av passord\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Du mottar denne e-posten fordi du eller noen andre har bedt om tilbakestille \"\n\"passordet for din brukerkonto.\\n\"\n\"Meldingen kan trygt ignoreres om du ikke har bedt om å tilbakestille \"\n\"passord. Klikk på linken nedenfor for å tilbakestille ditt passord.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"I tilfelle du har glemt det: Brukernavnet ditt er %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"E-post for gjenopprettelse av passord\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Passordet ditt er tilbakestilt.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Passordet ditt er satt.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Passord satt\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Du mottar denne e-posten fordi du, eller noen andre, prøvde å få tilgang til \"\n\"en konto med e-post %(email)s. Vi har imidlertid ingen registrering av en \"\n\"slik konto i vår database.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Hvis det var deg, kan du registrere en konto ved å bruke lenken nedenfor.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Ukjent konto\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"E-postadresse\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Nåværende e-post\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Endres til\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"E-postadressen din venter fortsatt på verifisering.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Avbryt endring\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Endre til\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Endre e-post\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Bekreft e-postadresse\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Vennligst bekreft at <a href=\\\"mailto:%(email)s\\\">%(email)s</a> er en e-\"\n\"postadresse for bruker %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Kan ikke bekrefte %(email)s fordi den allerede er bekreftet for en annen \"\n\"konto.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Denne e-postbekreftelseslenken er utgått eller ugyldig. Vennligst <a \"\n\"href=\\\"%(email_url)s\\\">be om en ny e-postbekreftelse</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Hvis du ikke har opprettet en konto enda, kan du %(link)sregistrere \"\n\"deg%(end_link)s først.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Logg inn med en passnøkkel\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Send meg en innloggingskode\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Logg ut\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Er du sikker at du ønsker å logge ut?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Du kan ikke fjerne den primær e-postadressen (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Bekreftelsese-post er sendt til %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Du har bekreftet %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Fjern e-postadressen %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Logget inn som %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Du er logget ut.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"En innloggingskode er sendt til %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Passordet er endret.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Passordet er satt.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"En bekreftelseskode er sendt til %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Du har verifisert telefonnummer %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Primær e-postadresse er satt.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Endre Passord\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Glemt passord?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Glemt passordet ditt? Skriv inn e-postadressen din, så får du en epost som \"\n\"lar deg tilbakestille passordet.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Tilbakestill passord\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"Ta kontakt hvis du har problemer med å tilbakestille passordet ditt.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Vi har sendt deg en e-post. Hvis du ikke har mottatt den, vennligst sjekk \"\n\"søppelpostmappen din. Ellers kontakt oss hvis du ikke mottar den i løpet av \"\n\"noen få minutter.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Ugyldig token\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Passordgjenopprettelseslinken er ugyldig – muligens fordi den allerede er \"\n\"brukt.  Vennligst etterspør en <a href=\\\"%(passwd_reset_url)s\\\">ny \"\n\"tilbakestilling av passord</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Ditt passord er endret.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Sett passord\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Endre telefon\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Nåværende telefon\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Telefonnummeret ditt venter fortsatt på verifisering.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Endre telefon\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Skriv inn passordet ditt:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Du vil motta en spesiell kode for passordløs innlogging.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Be om kode\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Andre innloggingsalternativer\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Registrer deg\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Registrer deg\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Har du allerede en konto? Vennligst %(link)slogg inn%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Registrer deg med en passnøkkel\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Registrer med passnøkkel\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Andre alternativer\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Registrering stengt\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Beklager, men registrering er for tiden stengt.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Notat\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Du er allerede logget inn som %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Advarsel:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Du har for tiden ingen e-postadresse satt opp. Du bør legge til en e-\"\n\"postadresse slik at du kan motta varsler, tilbakestille passord osv.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Bekreft din e-postadresse\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Vi har sendt deg en e-post for verifisering. Følg lenken for å fullføre \"\n\"registreringen. Hvis du ikke ser verifiserings-e-posten i innboksen, sjekk \"\n\"søppelpostmappen. Vennligst kontakt oss hvis du ikke mottar verifiserings-e-\"\n\"posten innen noen minutter.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Denne delen av nettstedet krever at vi verifiserer at\\n\"\n\"du er den du sier du er. For dette formålet krever vi at du\\n\"\n\"verifiserer eierskap til din e-postadresse. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Vi har sendt deg en e-post for\\n\"\n\"bekreftelse. Vennligst klikk på lenken i e-posten. Hvis du ikke ser \"\n\"verifiserings-e-posten i innboksen din, sjekk søppelpostmappen.\\n\"\n\"Ellers kontakt oss hvis du ikke mottar den innen noen få minutter.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Merk:</strong> du kan fortsatt <a href=\\\"%(email_url)s\\\">endre din e-\"\n\"postadresse</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Meldinger:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Meny:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Kontotilkoblinger\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Tofaktorautentisering\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Økter\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autoriser\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s ønsker tilgang til din %(site_name)s-konto.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Skriv inn enhetskode\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Skriv inn koden som vises på enheten din.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Fortsett\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Bekreft enhet\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Vennligst bekreft koden som vises på din %(client_name)s for å autorisere \"\n\"denne enheten.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Avslå\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Enhet autorisert\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Du har autorisert %(client_name)s-enheten din.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Enhet avslått\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Autorisering for %(client_name)s-enheten din er avslått.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Feil\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Forbli innlogget\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Kontoen din er beskyttet av tofaktorautentisering. Vennligst skriv inn en \"\n\"autentiseringskode:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Et nytt sett med gjenopprettingskoder for tofaktorautentisering er generert.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Nye gjenopprettingskoder generert\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Autentiseringsapp aktivert.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Autentiseringsapp aktivert\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Autentiseringsapp deaktivert.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Autentiseringsapp deaktivert\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"En ny sikkerhetsnøkkel er lagt til.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Sikkerhetsnøkkel lagt til\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"En sikkerhetsnøkkel er fjernet.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Sikkerhetsnøkkel fjernet\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Autentiseringsapp\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Autentisering med en autentiseringsapp er aktiv.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Ingen autentiseringsapp er aktiv.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Deaktiver\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktiver\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Sikkerhetsnøkler\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Du har lagt til %(count)s sikkerhetsnøkkel.\"\nmsgstr[1] \"Du har lagt til %(count)s sikkerhetsnøkler.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Ingen sikkerhetsnøkler er lagt til.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Administrer\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Legg til\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Gjenopprettingskoder\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Det er %(unused_count)s av %(total_count)s gjenopprettingskoder tilgjengelig.\"\nmsgstr[1] \"\"\n\"Det er %(unused_count)s av %(total_count)s gjenopprettingskoder tilgjengelig.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Ingen gjenopprettingskoder er satt opp.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Vis\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Last ned\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Generer\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Et nytt sett med gjenopprettingskoder er generert.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Sikkerhetsnøkkel lagt til.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Sikkerhetsnøkkel fjernet.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Skriv inn en autentiseringskode:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\"Du er i ferd med å generere et nytt sett med gjenopprettingskoder for \"\n\"kontoen din.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Denne handlingen vil ugyldiggjøre dine eksisterende koder.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Er du sikker?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Ubrukte koder\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Last ned koder\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Generer nye koder\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Aktiver autentiseringsapp\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"For å beskytte kontoen din med tofaktorautentisering, skann QR-koden \"\n\"nedenfor med autentiseringsappen din. Skriv deretter inn verifiseringskoden \"\n\"generert av appen.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Autentiseringshemmelighet\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Du kan lagre denne hemmeligheten og bruke den til å installere \"\n\"autentiseringsappen på nytt senere.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Deaktiver autentiseringsapp\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Du er i ferd med å deaktivere autentisering via autentiseringsapp. Er du \"\n\"sikker?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Stol på denne nettleseren?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Hvis du velger å stole på denne nettleseren, vil du ikke bli bedt om en \"\n\"verifiseringskode neste gang du logger inn.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Stol på i %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Ikke stol på\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Legg til sikkerhetsnøkkel\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Fjern sikkerhetsnøkkel\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Er du sikker på at du vil fjerne denne sikkerhetsnøkkelen?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Bruk\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Passnøkkel\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Sikkerhetsnøkkel\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Denne nøkkelen indikerer ikke om den er en passnøkkel.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Uspesifisert\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Lagt til %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Sist brukt %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Rediger\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Rediger sikkerhetsnøkkel\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Lagre\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Opprett passnøkkel\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Du er i ferd med å opprette en passnøkkel for kontoen din. Siden du kan \"\n\"legge til flere nøkler senere, kan du bruke et beskrivende navn for å skille \"\n\"dem.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Opprett\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Denne funksjonaliteten krever JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Tredjeparts innlogging mislyktes\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Det oppstod en feil ved forsøk på å logge inn via din tredjepartskonto.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Du kan logge inn på kontoen din ved å bruke en av følgende tredjeparts-\"\n\"kontoer:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Du har for tiden ingen tredjeparts-kontoer tilkoblet denne kontoen.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Legg til en tredjepartskonto\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"En tredjepartskonto fra %(provider)s er koblet til kontoen din.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Tredjepartskonto tilkoblet\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"En tredjepartskonto fra %(provider)s er frakoblet kontoen din.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Tredjepartskonto frakoblet\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Koble til %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Du er i ferd med å koble til en ny tredjepartskonto fra %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Logg inn via %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Du er i ferd med å logge inn med en tredjepartskonto fra %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Innlogging kansellert\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Du bestemt deg for å kansellere innlogging til siden ved å bruke en av dine \"\n\"eksisterende kontoer. Om dette var ved en feil, vennligst fortsett til <a \"\n\"href=\\\"%(login_url)s\\\">innloggingen</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Tredjepartskontoen er tilkoblet.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Tredjepartskontoen er frakoblet.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Du er på vei til å bruke din %(provider_name)s konto for å logge inn på\\n\"\n\"%(site_name)s. Som et siste steg, vennligst fullfør følgende skjema:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Eller bruk en tredjepart\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Logget ut av alle andre økter.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Startet\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP-adresse\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Nettleser\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Sist sett\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Nåværende\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Logg ut andre økter\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Brukerøkter\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"øktnøkkel\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Kontotilkoblinger\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Passordet må være minst {0} tegn.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Hei fra %(site_name)s!\\n\"\n#~ \"\\n\"\n#~ \"Du mottar denne e-postadressen fordi du eller noen andre har etterspurt \"\n#~ \"et passord for din brukerkonto.\\n\"\n#~ \"Meldingen kan trygt ignoreres om du ikke foretok denne etterspørselen. \"\n#~ \"Klikk på linken nedenfor for å gjennopprette ditt passord.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Følgende e-postadresser er assosiert med din konto:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Bekreft e-postadresse\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Vennligst logg in med en\\n\"\n#~ \"av dine eksisterende tredjeparts kontoer på %(site_name)s. Eller, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">registrer deg</a>\\n\"\n#~ \"og logg inn nedenfor:\"\n\n#~ msgid \"or\"\n#~ msgstr \"eller\"\n\n#~ msgid \"change password\"\n#~ msgstr \"Endre passord\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"OpenID-innlogging\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Denne e-postadressen er tilknyttet en annen konto.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Vi har sendt deg en e-post. Vennligst kontakt oss om du ikke mottar den \"\n#~ \"innen et par minutter.\"\n"
  },
  {
    "path": "allauth/locale/nl/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR Free Software Foundation, Inc.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-07-25 20:26+0200\\n\"\n\"Last-Translator: Jos van Leeuwen <jos.van.leeuwen@proton.me>\\n\"\n\"Language-Team: Dutch <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/nl/>\\n\"\n\"Language: nl\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 5.11-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Dit account is momenteel inactief.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Je kunt je primaire e-mailadres niet verwijderen.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Dit e-mailadres is al aan dit account gekoppeld.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Het door jou opgegeven e-mailadres en/of wachtwoord is niet correct.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"\"\n\"Het door jou opgegeven telefoonnummer en/of wachtwoord is niet correct.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Er is al een gebruiker geregistreerd met dit e-mailadres.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Geef je huidige wachtwoord op.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Ongeldige code.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Ongeldig wachtwoord.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Ongeldige of verlopen sleutel.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Ongeldige login.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"De wachtwoordherstel-sleutel is niet geldig.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Je kunt niet meer dan %d e-mailadressen toevoegen.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Er is al een gebruiker geregistreerd met dit telefoonnummer.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Te veel inlogpogingen. Probeer het later nogmaals.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Dit e-mailadres is niet bij ons bekend.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Het telefoonnummer is niet aan een gebruikersaccount toegewezen.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Je primaire e-mailadres moet geverifieerd zijn.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Deze gebruikersnaam mag je niet gebruiken, kies een andere.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Je gebruikersnaam en/of wachtwoord zijn incorrect.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Selecteer er slechts één.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"De nieuwe waarde moet verschillen van de huidige waarde.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Wees geduldig, je gaat te snel.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Gebruik je wachtwoord\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Gebruik authenticator-app of code\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Gebruik een beveiligingssleutel\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} gemarkeerd als geverifieerd.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Kon {email} niet als geverifieerd markeren.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Markeer de geselecteerde email addressen als geverifieerd\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Accounts\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"E-mailadres\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Voer een telefoonnummer in, inclusief landcode (bijv. +31 voor NL).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefoon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Je moet hetzelfde wachtwoord twee keer intoetsen.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Wachtwoord\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Onthouden\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Gebruikersnaam\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Gebruikersnaam, e-mail, of telefoonnummer\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Gebruikersnaam of e-mail\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Gebruikersnaam of telefoonnummer\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-mail of telefoonnummer\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Wachtwoord vergeten?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-mail (bevestigen)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Bevestig e-mailadres\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-mail (optioneel)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Gebruikersnaam (optioneel)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Je moet hetzelfde e-mailadres twee keer intoetsen.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Wachtwoord (bevestigen)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Huidig wachtwoord\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Nieuw wachtwoord\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Nieuw wachtwoord (bevestigen)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Code\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"gebruiker\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"e-mailadres\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"geverifieerd\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"Primair\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"e-mailadressen\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"aangemaakt\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"verstuurd\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"sleutel\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"e-mailadres bevestiging\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"e-mailadres bevestigingen\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Bekijk je gebruikers-ID\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Bekijk je e-mailadres\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Bekijk je basisprofielinformatie\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Machtigingen verlenen\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Jokertekens zijn niet toegestaan tenzij 'URI-jokertekens toestaan' is \"\n\"ingeschakeld.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' bevat meer dan één jokerteken (*). Er is slechts één jokerteken per \"\n\"URI toegestaan.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Jokertekens zijn alleen toegestaan in het hostnaamgedeelte van de URI.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Autorisatiecode\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Apparaatcode\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Clientreferenties\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Vernieuwingstoken\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Vertrouwelijk\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Openbaar\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"De scope(s) die de client mag opvragen. Geef één waarde per regel, bijv.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Als de client geen scope opgeeft, worden deze standaard scopes gebruikt. \"\n\"Geef één waarde per regel, bijv.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Een lijst van toegestane grant types. Geef één waarde per regel, bijv.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Een lijst van toegestane origins voor cross-origin verzoeken, één per regel.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Jokertekens (*) toestaan in omleidings-URI's en CORS-origins. Wanneer \"\n\"ingeschakeld kunnen URI's een enkele asterisk bevatten om subdomeinen te \"\n\"matchen.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Een lijst van toegestane response types. Geef één waarde per regel, bijv.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"client\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"clients\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Je kunt geen e-mailadres toevoegen aan een account dat beveiligd is met twee-\"\n\"factor-authenticatie is.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Je kunt twee-factor-authenticatie niet deactiveren.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Je kunt geen herstelcodes genereren zonder dat twee-factor-authenticatie \"\n\"actief is.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Je moet eerst je e-mailadres verifiëren voordat je twee-factor-authenticatie \"\n\"kunt activeren.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Hoofdsleutel\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Reservesleutel\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Sleutel nr. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Herstelcodes\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP Authenticator\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Authenticator code\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Wachtwoordloos\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Door wachtwoordloos inloggen mogelijk te maken kun je je aanmelden met deze \"\n\"sleutel. Dit brengt extra vereisten met zich mee, zoals biometrische \"\n\"verificatie of PIN-bescherming.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Er bestaat al een account met dit e-mailadres. Meld je eerst aan met dit \"\n\"account, verbind daarna je %s account.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Ongeldige sleutel.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Je account heeft geen wachtwoord ingesteld.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Je account heeft geen geverifieerd e-mailadres.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Je kunt het laatste externe account niet verwijderen.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Dit externe account is al gekoppeld aan een ander account.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Sociale accounts\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"provider\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"provider ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"naam\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"client id\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"App ID, of consumer key\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"geheime sleutel\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API secret, client secret, of consumer secret\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Sleutel\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"social application\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"social applications\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"laatst ingelogd\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"datum toegetreden\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"extra data\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"social account\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"social accounts\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) of toegangs-token (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"token geheim\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) of ververs token (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"verloopt op\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"social applicatie token\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"social applicatie tokens\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Ongeldige profiel data\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Annuleren\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Ongeldig antwoord ontvangen tijdens het ophalen van een verzoeksleutel van \"\n\"\\\"%s\\\", antwoord: \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"\"\n\"Ongeldig antwoord ontvangen tijdens het ophalen van een toegangssleutel van \"\n\"\\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Geen verzoeksleutel opgeslagen voor \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Geen toegangssleutel opgeslagen voor \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Geen toegang tot privé data bij \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"\"\n\"Ongeldig antwoord ontvangen tijdens het ophalen van een verzoeksleutel van \"\n\"\\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Account inactief\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Dit account is niet actief\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"We hebben een code naar %(recipient)s gestuurd. De code verloopt binnenkort, \"\n\"dus voer hem snel in.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Bevestigen\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Nieuwe code aanvragen\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Toegang bevestigen\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Authenticeer opnieuw om de beveiliging van je account te waarborgen.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Andere opties\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"E-mailadres verificatie\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Voer de e-emailadres verificatie code in:\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Gebruik een ander e-mailadres\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Aanmelden\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Aanmeldcode invullen\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Nieuw wachtwoord\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Voer wachtwoordherstelcode in\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Telefoonverificatie\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Telefoonverificatiecode invoeren\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Gebruik een ander telefoonnummer\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"E-mailadressen\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"De volgende e-mailadressen zijn gekoppeld aan jouw account:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Geverifieerd\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Ongeverifieerd\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Primair\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Maak primair\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Stuur verificatie e-mail opnieuw\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Verwijder\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Voeg e-mailadres toe\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"E-mail toevoegen\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Wil je het geselecteerde e-mailadres echt verwijderen?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Je ontvangt deze e-mail omdat jij of iemand anders geprobeerd heeft een \"\n\"account\\n\"\n\"te registreren met dit e-mail adres:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Echter, er bestaat al een account met dit e-mail adres.  Als je dit \"\n\"vergeten\\n\"\n\"was, gebruik dan de wachtwoord vergeten procedure om de toegang tot je \"\n\"account\\n\"\n\"te herstellen:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Account bestaat al\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Hallo van %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Bedankt voor het gebruiken van %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"Je ontvangt deze e-mail vanwege de volgende wijziging aan je account:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Herken je deze wijziging niet? Neem dan onmiddelijk voorzorgsmaatregelen en \"\n\"beveilig je account. Deze wijzigingen komen van:\\n\"\n\"\\n\"\n\"- IP adres: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Datum: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Je email adres is gewijzigd van %(from_email)s naar %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"E-mailadres gewijzigd\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Je e-mailadres is bevestigd.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"E-mailadres bevestiging\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Je ontvangt deze e-mail omdat gebruiker %(user_display)s van\\n\"\n\"%(site_domain)s dit als e-mailadres heeft opgegeven om te koppelen\\n\"\n\"aan zijn of haar account.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Hieronder staat je e-mailadres verificatiecode. Vul deze in in het browser \"\n\"venster dat nog open staat.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Om te bevestigen dat dit correct is, bezoek: %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Bevestig je e-mailadres\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"Email adres %(deleted_email)s is ontkoppeld van je account.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"E-mailadres verwijderd\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Hieronder staat je aanmeldcode. Vul deze in in het browser venster dat nog \"\n\"open staat.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"Je kunt deze mail gerust negeren als je dit niet zelf gedaan hebt.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Aanmeldcode\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Je wachtwoord is gewijzigd.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Wachtwoord gewijzigd\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Je wachtwoordherstelcode staat hieronder. Voer deze code in je geopende \"\n\"browservenster in.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Wachtwoordherstelcode\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Je ontvangt deze mail omdat er een verzoek is ingelegd om je wachtwoord \"\n\"opnieuw\\n\"\n\"in te stellen. Je kunt deze mail gerust negeren als je dit niet zelf gedaan\\n\"\n\"hebt. Anders, klik op de volgende link om je wachtwoord opnieuw in te \"\n\"stellen.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Deze link hoort bij je account met gebruikersnaam %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Nieuw wachtwoord\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Je wachtwoord is opnieuw ingesteld.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Je wachtwoord is ingesteld.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Wachtwoord ingesteld\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Je ontvang deze e-mail omdat jij, of iemand anders, een poging gedaan heeft \"\n\"een account met e-mailadres %(email)s te gebruiken. Echter, dit account \"\n\"bestaat niet.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Als jij dit wel hebt gedaan, dan kun je je via de volgende link registreren.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Onbekend account\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"E-mailadres\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Huidig email\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Wordt veranderd in\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Je e-mailadres wacht op verificatie.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Annuleer wijziging\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Wijzig naar\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"E-mail wijzigen\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Bevestig e-mailadres\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Bevestig dat <a href=\\\"mailto:%(email)s\\\">%(email)s</a> een e-mailadres is \"\n\"voor gebruiker %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Het e-mail adres %(email)s kon niet worden geverifieerd omdat het gekoppeld \"\n\"is aan een ander account.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Deze e-mail verificatie link is verlopen of niet geldig. Dien een\\n\"\n\"<a href=\\\"%(email_url)s\\\">nieuw e-mail verificatie verzoek</a> in.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Als je nog geen account hebt %(link)sregistreer%(end_link)s je dan eerst.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Meld je aan met een passkey\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Stuur een aanmeldcode\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Afmelden\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Weet je zeker dat je wilt afmelden?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"You kunt je primaire e-mailadres (%(email)s) niet verwijderen.\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Bevestigings e-mail verzonden aan %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Je hebt het e-mailadres %(email)s bevestigd\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"E-mailadres %(email)s verwijderd.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Je bent nu ingelogd als %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Je bent afgemeld.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Er is een aanmeldcode verzonden naar %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Wachtwoord wijziging geslaagd.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Je wachtwoord is gewijzigd.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Er is een verificatiecode verzonden naar %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Je hebt telefoonnummer %(phone)s geverifieerd.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Primair e-mailadres ingesteld.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Wachtwoord wijzigen\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Wachtwoord vergeten?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Wachtwoord vergeten? Vul je e-mailadres in en we sturen je een e-mail \"\n\"waarmee je een nieuw wachtwoord kunt instellen.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Herstel mijn wachtwoord\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Neem a.u.b. contact met ons op als het niet lukt je wachtwoord opnieuw in te \"\n\"stellen.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Volg de link in de verificatie e-mail om de controle af te ronden. Neem \"\n\"a.u.b. contact met ons op als je de e-mail niet binnen enkele minuten \"\n\"ontvangt.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Ongeldige sleutel\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"De link om je wachtwoord opnieuw in te stellen is niet geldig. Mogelijk is \"\n\"deze al een keer gebruikt. <a href=\\\"%(passwd_reset_url)s\\\">Herstel je \"\n\"wachtwoord</a> opnieuw.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Je wachtwoord is gewijzigd.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Zet wachtwoord\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Telefoon wijzigen\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Huidig telefoonnummer\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Je telefoonnummer wacht op verificatie.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Telefoon wijzigen\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Voer je wachtwoord in:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Je ontvangt een speciale code om je zonder wachtwoord aan te melden.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Code aanvragen\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Andere aanmeld-opties\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Registreren\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Registreren\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Heb je al een account? %(link)sMeld je dan aan%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Registreren met een passkey\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Passkey registratie\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Andere opties\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Registratie gesloten\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Helaas, maar je kunt je momenteel niet registreren.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Notitie\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Je bent al ingelogd als %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Waarschuwing:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Het is raadzaam een e-mailadres toe te voegen zodat je notificaties kunt \"\n\"ontvangen, je wachtwoord opnieuw kunt instellen, enz.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Verifieer je e-mailadres\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"We hebben een e-mail verstuurd ter verificatie. Volg de link in deze mail om \"\n\"je registratie af te ronden. Neem a.u.b. contact met ons op als je deze e-\"\n\"mail niet binnen enkele minuten ontvangt.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Voor dit gedeelte van de site is het nodig dat we je identiteit\\n\"\n\"verifiëren. Via een verificatie e-mail kunnen we controleren dat je\\n\"\n\"daadwerkelijk toegang hebt tot het opgegeven e-mailadres.\"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Volg de link in de verificatie e-mail om de controle af te ronden. Neem \"\n\"a.u.b. contact met ons op als je de e-mail niet binnen enkele minuten \"\n\"ontvangt.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Merk op:</strong> je kunt altijd <a href=\\\"%(email_url)s\\\">je e-mail \"\n\"adres wijzigen</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Berichten:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menu:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Account Connecties\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Twee-factor-authenticatie\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sessies\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autoriseren\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s wil toegang tot je %(site_name)s account.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Voer apparaatcode in\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Voer de code in die op je apparaat wordt weergegeven.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Ga verder\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Apparaat bevestigen\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Bevestig de code die op je %(client_name)s wordt weergegeven om dit apparaat \"\n\"te autoriseren.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Weigeren\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Apparaat geautoriseerd\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Je hebt je %(client_name)s apparaat succesvol geautoriseerd.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Apparaat geweigerd\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Autorisatie voor je %(client_name)s apparaat is geweigerd.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Fout\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Ingelogd blijven\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Je account is beveiligd met twee-factor-authenticatie. Voer alstublieft een \"\n\"authenticatiecode in:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"Er zijn nieuwe herstelcodes gegenereerd.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Nieuwe herstelcodes gegenereerd\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Authenticator-app geactiveerd.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Authenticator-app geactiveerd\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Authenticator-app gedeactiveerd.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Authenticator-app gedeactiveerd\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Een nieuwe beveiligingssleutel is toegevoegd.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Beveiligingssleutel toegevoegd\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Een beveiligingssleutel is verwijderd.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Beveiligingssleutel verwijderd\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Authenticator-app\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Authenticatie middels een authenticator-app is actief.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Een authenticator-app is niet geactiveerd.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Deactiveer\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Activeer\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Beveiligingssleutels\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Je hebt %(count)s beveiligingssleutel toegevoegd.\"\nmsgstr[1] \"Je hebt %(count)s beveiligingssleutels toegevoegd.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Er zijn geen beveiligingssleutels gekoppeld.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Beheren\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Voeg toe\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Herstelcodes\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Er is nog %(unused_count)s van de %(total_count)s herstelcodes beschikbaar.\"\nmsgstr[1] \"\"\n\"Er zijn nog %(unused_count)s van de %(total_count)s herstelcodes beschikbaar.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Er zijn geen herstelcodes ingesteld.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Bekijk\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Downloaden\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Genereer\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Er zijn nieuwe herstelcodes gegenereerd.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Beveiligingssleutel toegevoegd.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Beveiligingssleutel verwijderd.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Voer een authenticator code in:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Je staat op het punt nieuwe herstelcodes te genereren voor je account.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Hierdoor zullen eerdere herstelcodes niet langer werken.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Weet je dit zeker?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Ongebruikte codes\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Codes downloaden\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Nieuwe codes genereren\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Activeer authenticator-app\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Beveilig je account met twee-factor-authenticatie. Scan eerst de \"\n\"onderstaande QR code met je authenticator app, en vul vervolgens de \"\n\"resulterende verificatie code in.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Authenticator geheim\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Je kunt deze code bewaren en later gebruiken om je authenticator app opnieuw \"\n\"te installeren.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Deactiveer authenticator-app\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Je staat op het punt authenticatie middels een authenticator-app te \"\n\"deactiveren. Wil je dit echt?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Vertrouw deze browser?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Als je ervoor kiest om deze browser te vertrouwen, wordt je de volgende keer \"\n\"dat je inlogt niet om een verificatiecode gevraagd.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Vertrouw voor %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Vertrouw niet\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Voeg beveiligingssleutel toe\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Verwijder beveiligingssleutel\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Weet je zeker dat je deze beveiligingssleutel wilt verwijderen?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Gebruik\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Passkey\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Beveiligingssleutel\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Het is onduidelijk of deze sleutel een passkey betreft.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Ongespecificeerd\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Toegevoegd op %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Laatst gebruikt %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Bewerken\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Bewerk beveiligingssleutel\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Opslaan\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Passkey aanmaken\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Je staat op het punt een passkey aan te maken. Aangezen je later extra \"\n\"sleutels kunt toevoegen kun je deze een herkenbare naam geven om de sleutels \"\n\"uit elkaar te kunnen houden.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Maak aan\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Deze functionaliteit vereist JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Aanmelden Mislukt\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Er is een fout opgetreden toen we je wilde inloggen via je externe account.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"Je kunt jezelf aanmelden met een van de volgende externe accounts:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Je hebt momenteel geen externe accounts gekoppeld.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Voeg een extern account toe\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Een extern account van %(provider)s is gekoppeld aan je account.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Extern account gekoppeld\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"Een extern account van %(provider)s is ontkoppeld van je account.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Extern account ontkoppeld\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Koppel %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Je staat op het punt om een nieuw account van %(provider)s aan je account te \"\n\"koppelen.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Aanmelden via %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Je staat op het punt om jezelf aan te melden via %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Aanmelden geannuleerd\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Je hebt het aanmelden via een extern account geannuleerd. Als dit een \"\n\"vergissing was, <a href=\\\"%(login_url)s\\\">meld je dan opnieuw aan</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Het externe account is gekoppeld.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Het externe account is ontkoppeld.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Om bij %(site_name)s in te kunnen loggen via %(provider_name)s hebben we de \"\n\"volgende gegevens nodig:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Of gebruik een derde partij\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Afgemeld van alle andere sessies.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Gestart op\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP adres\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Browser\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Laatst gezien op\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Huidig\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Elders uitloggen\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Gebruikerssessies\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"sessie sleutel\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Account Connecties\"\n\n#~ msgid \"Use security key or device\"\n#~ msgstr \"Gebruik een beveiligingssleutel\"\n\n#~ msgid \"Add Security Key or Device\"\n#~ msgstr \"Beveiligingssleutel toevoegen\"\n\n#~ msgid \"Add key or device\"\n#~ msgstr \"Beveiligingssleutel toevoegen\"\n\n#~ msgid \"Security Keys and Devices\"\n#~ msgstr \"Beveiligingssleutels\"\n\n#~ msgid \"You have not added any security keys/devices.\"\n#~ msgstr \"Je hebt geen beveiligingssleutels toegevoegd.\"\n\n#~ msgid \"Edit Security Key or Device\"\n#~ msgstr \"Bewerk beveiligingssleutel\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Het wachtwoord moet minimaal {0} tekens bevatten.\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Je ontvang deze e-mail omdat er een verzoek is ingelegd om het wachtwoord \"\n#~ \"te\\n\"\n#~ \"veranderen van account met e-mailadres %(email)s. Echter, dit account \"\n#~ \"bestaat\\n\"\n#~ \"niet.\\n\"\n#~ \"\\n\"\n#~ \"Je kunt deze e-mail negeren als jij dit verzoek niet zelf hebt ingelegd.\\n\"\n#~ \"\\n\"\n#~ \"Als jij dit wel hebt gedaan, dan kun je je via de volgende link \"\n#~ \"registreren.\"\n\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"De volgende e-mailadressen zijn gekoppeld aan jouw account:\"\n\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Wijzig e-mailadres\"\n\n#~ msgid \"\"\n#~ \"To safeguard the security of your account, please enter your password:\"\n#~ msgstr \"\"\n#~ \"Om de beveiliging van je account te waarborgen, voert eerst je wachtwoord \"\n#~ \"in:\"\n\n#, fuzzy\n#~ msgid \"Regenerate\"\n#~ msgstr \"Genereer\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Meld je aan met een van je bestaande externe accounts. Of, <a \\n\"\n#~ \"href=\\\"%(signup_url)s\\\">registreer</a> voor een %(site_name)s account en \"\n#~ \"meld je hiermee aan:\"\n\n#~ msgid \"or\"\n#~ msgstr \"of\"\n\n#~ msgid \"change password\"\n#~ msgstr \"Wachtwoord wijzigen\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Aanmelden via OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Dit e-mailadres is al geassocieerd met een ander account.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"We hebben je een e-mail verstuurd. Neem a.u.b. contact met ons op als je \"\n#~ \"deze niet binnen enkele minuten ontvangen hebt.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"Je login en wachtwoord komen niet overeen.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"\"\n#~ \"Gebruikersnamen mogen alleen letters, cijfers en @/./+/-/_ bevatten.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"Deze gebruikersnaam is al in gebruik. Kies a.u.b. een andere naam.\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"Je hebt bevestigd dat <a href=\\\"mailto:%(email)s\\\">%(email)s</a> een e-\"\n#~ \"mail adres is voor gebruiker %(user_display)s.\"\n\n#~ msgid \"Thanks for using our site!\"\n#~ msgstr \"Bedankt voor het gebruik van onze site!\"\n\n#~ msgid \"Confirmation email sent to %(email)s\"\n#~ msgstr \"Bevestigings e-mail verzonden aan %(email)s\"\n\n#~ msgid \"Delete Password\"\n#~ msgstr \"Verwijder wachtwoord\"\n\n#~ msgid \"\"\n#~ \"You may delete your password since you are currently logged in using \"\n#~ \"OpenID.\"\n#~ msgstr \"\"\n#~ \"Je kunt je wachtwoord verwijderen omdat je via OpenID bent ingelogd.\"\n\n#~ msgid \"delete my password\"\n#~ msgstr \"Verwijder mijn wachtwoord\"\n\n#~ msgid \"Password Deleted\"\n#~ msgstr \"Wachtwoord verwijderd\"\n"
  },
  {
    "path": "allauth/locale/pl/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR Free Software Foundation, Inc.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-08-20 01:01+0000\\n\"\n\"Last-Translator: Wolf <wolski.marex@gmail.com>\\n\"\n\"Language-Team: Polish <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/pl/>\\n\"\n\"Language: pl\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && \"\n\"(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && \"\n\"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\\n\"\n\"X-Generator: Weblate 5.13\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Konto jest obecnie nieaktywne.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Nie możesz usunąć podstawowego adresu e-mail.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Ten adres e-mail jest już powiązany z tym kontem.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Podany adres e-mail i/lub hasło są niepoprawne.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Podane numer telefonu i/lub hasło są niepoprawne.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"W systemie jest już zarejestrowany użytkownik o tym adresie e-mail.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Proszę wpisz swoje obecne hasło.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Błędny kod.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Niewłaściwe hasło.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Nieprawidłowy lub wygasły klucz.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Niewłaściwy login.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Token resetowania hasła był nieprawidłowy.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Nie możesz dodać więcej niż %d adresów e-mail.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"\"\n\"W systemie jest już zarejestrowany użytkownik o tym adresie numerze telefonu.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Zbyt wiele nieudanych prób logowania. Spróbuj ponownie później.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Adres e-mail nie jest powiązany z żadnym kontem użytkownika.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Numer telefonu nie jest powiązany z żadnym kontem użytkownika.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Twój podstawowy adres e-mail musi być zweryfikowany.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Nie możesz użyć tej nazwy użytkownika. Proszę wybierz inną.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Podana nazwa użytkownika i/lub hasło są niepoprawne.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Wybierz tylko jeden.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Nowa wartość musi być inna niż bieżąca.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Bądź cierpliwy, wysyłasz zbyt wiele próśb.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Użyj swojego hasła\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Użyj aplikacji Authenticator lub kodu\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Użyj klucza bezpieczeństwa\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Oznaczono adres {email} jako zweryfikowany.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Nie udało się oznaczyć adresu {email} jako zweryfikowanego.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Oznacz wybrane adresy e-mail jako zweryfikowane\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Konta\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Adres e-mail\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Wprowadź numer telefonu wraz z kodem kraju (np. +1 dla USA).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Musisz wpisać za każdym razem to samo hasło.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Hasło\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Pamiętaj mnie\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Nazwa użytkownika\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Nazwa użytkownika, e-mail lub numer telefonu\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Nazwa użytkownika lub e-mail\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Nazwa użytkownika lub numer telefonu\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-mail lub numer telefonu\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Zapomniałeś hasła?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-mail (ponownie)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Potwierdzenie adresu e-mail\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-mail (opcjonalnie)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Nazwa użytkownika (opcjonalnie)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Musisz wpisać za każdym razem ten sam e-mail.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Hasło (ponownie)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Obecne hasło\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Nowe hasło\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Nowe hasło (ponownie)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kod\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"użytkownik\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"adres e-mail\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"zweryfikowany\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"podstawowy\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"adresy e-mail\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"utworzono\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"wysłano\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"klucz\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"potwierdzenie adresu e-mail\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"potwierdzenia adresów e-mail\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Bezgłowy\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Wyświetl swój identyfikator użytkownika\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Wyświetl swoje adresy e-mail\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Wyświetl podstawowe informacje o swoim profilu\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Udziel uprawnień\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Znaki wieloznaczne nie są dozwolone, chyba że opcja 'Zezwalaj na znaki \"\n\"wieloznaczne w URI' jest włączona.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' zawiera więcej niż jeden znak wieloznaczny (*). Dozwolony jest \"\n\"tylko jeden znak wieloznaczny na URI.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"\"\n\"Znaki wieloznaczne są dozwolone tylko w części URI zawierającej nazwę hosta.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Kod autoryzacyjny\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Kod urządzenia\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Dane uwierzytelniające klienta\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Odśwież token\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Poufny\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Publiczny\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Zakres(y), o które klient może poprosić. Podaj jedną wartość w każdym \"\n\"wierszu, np.: openid(ENTER)profil(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Jeśli klient nie określi żadnego zakresu, używane są te domyślne zakresy. \"\n\"Podaj jedną wartość w każdym wierszu, np.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Lista dozwolonych typów uprawnień. Podaj jedną wartość w każdym wierszu, \"\n\"np.: authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"Lista dozwolonych źródeł dla żądań międzydomenowych, jedno na wiersz.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Zezwalaj na znaki wieloznaczne (*) w URI przekierowań i źródłach CORS. Po \"\n\"włączeniu URI mogą zawierać pojedynczą gwiazdkę w celu dopasowania subdomen.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Lista dozwolonych typów odpowiedzi. Podaj jedną wartość w każdym wierszu, \"\n\"np.: kod(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"klient\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"klienci\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Nie można dodać adresu e-mail do konta chronionego dwuskładnikową \"\n\"autoryzacją.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Nie można dezaktywować uwierzytelniania dwuskładnikowego.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Nie można wygenerować kodów odzyskiwania bez włączonego uwierzytelniania \"\n\"dwuskładnikowego.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Nie możesz aktywować uwierzytelniania dwuskładnikowego dopóki nie \"\n\"zweryfikujesz swojego adresu e-mail.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Klucz główny\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Klucz zapasowy\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Numer klucza {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Kody odzyskiwania\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"Autentykator TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"Web Authentication\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Kod uwierzytelniający\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Bez hasła\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Włączenie logowania bez hasła pozwala na logowanie się przy użyciu tylko \"\n\"tego klucza, wiąże się jednak z koniecznością spełnienia dodatkowych \"\n\"wymagań, takich jak ochrona biometryczna lub PIN.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Istnieje już konto dla tego adresu email. Zaloguj się najpierw na to konto, \"\n\"a następnie połącz swoje konto %s.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Nieprawidłowy token.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Twoje konto nie posiada hasła.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Twoje konto nie ma zweryfikowanego adresu e-mail.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Nie możesz odłączyć ostatniego dostępnego konta innej firmy.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"To konto innej firmy jest już połączone z innym kontem.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Konta społecznościowe\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"dostawca usług\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"identyfikator dostawcy\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"nazwa\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"id klienta\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"ID aplikacji lub klucz odbiorcy\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"klucz prywatny\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"Klucz prywatny API, klienta lub odbiorcy\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Klucz\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"aplikacja społecznościowa\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"aplikacje społecznościowe\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"Unique Identification Number\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"Ostatnie logowanie\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"data dołączenia\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"dodatkowe dane\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"konto społecznościowe\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"konta społecznościowe\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) lub token dostępu (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"sekretny token\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) lub odświerz token (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"wygasa\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"token aplikacji społecznościowej\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"tokeny aplikacji społecznościowych\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Nieprawidłowe dane profilu\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Anuluj\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Nieprawidłowa odpowiedź podczas uzyskiwania tokenu żądania od „%s”. \"\n\"Odpowiedź brzmiała: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Błędna odpowiedź podczas pobierania tokena autoryzacji z \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Brak tokena zapisanego dla \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Brak zapisanego tokena autoryzacji \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Brak dostępu do prywatnych zasobów na \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Błędna odpowiedź podczas pobierania tokena z \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Konto nieaktywne\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"To konto jest nieaktywne.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Wysłaliśmy kod do %(recipient)s. Kod wkrótce wygaśnie, więc prosimy o jego \"\n\"szybkie wprowadzenie.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Potwierdź\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Poproś o nowy kod\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Potwierdź dostęp\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Aby zabezpieczyć swoje konto, dokonaj ponownego uwierzytelnienia.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Opcje alternatywne\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Weryfikacja adresu e-mail\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Wprowadź kod weryfikacyjny e-mail\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Użyj innego adresu e-mail\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Zaloguj\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Wprowadź kod logowania\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Resetowanie hasła\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Wprowadż kod resetowania hasła\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Weryfikacja telefoniczna\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Wprowadź kod weryfikacyjny telefonu\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Użyj innego numeru telefonu\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Adresy e-mail\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Poniższe adresy e-mail są powiązane z Twoim kontem:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Zweryfikowany\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Brak weryfikacji\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Podstawowy\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Uczyń podstawowym\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Prześlij ponownie wiadomość weryfikacyjną\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Usuń\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Dodaj adres e-mail\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Dodaj e-mail\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Czy naprawdę chcesz usunąć wybrany adres e-mail?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Otrzymujesz tę wiadomość e-mail, ponieważ Ty lub ktoś inny próbował założyć\\n\"\n\"konto przy użyciu adresu e-mail:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Konto o tym adresie e-mail już istnieje. Jeśli\\n\"\n\"o tym zapomniałeś, skorzystaj z procedury odzyskiwania hasła, aby odzyskać\\n\"\n\"swoje konto:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Konto już istnieje\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Witamy z %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Dziękujemy za korzystanie z %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Otrzymujesz tę wiadomość e-mail, ponieważ na Twoim koncie wprowadzono \"\n\"następującą zmianę:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Jeśli nie rozpoznajesz tej zmiany, natychmiast podejmij odpowiednie środki \"\n\"bezpieczeństwa. Zmiana na Twoim koncie pochodzi z:\\n\"\n\"\\n\"\n\"- Adres IP: %(ip)s\\n\"\n\"- Przeglądarka: %(user_agent)s\\n\"\n\"- Data: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Twój adres e-mail został zmieniony z %(from_email)s na %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Zmieniono adres e-mail\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Twój adres e-mail został potwierdzony.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Potwierdzenie e-mailem\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Otrzymujesz tę wiadomość e-mail, ponieważ użytkownik %(user_display)s podał \"\n\"Twój adres e-mail w celu zarejestrowania konta w domenie %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Poniżej znajduje się kod weryfikacyjny Twojego adresu e-mail. Wprowadź go w \"\n\"otwartym oknie przeglądarki.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Aby potwierdzić poprawność, przejdź do %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Proszę potwierdź adresy e-mail\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"Adresy e-mail %(deleted_email)s został usunięty z Twojego konta.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"e-mail usunięty\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Poniżej znajduje się Twój kod logowania. Wprowadź go w otwartym oknie \"\n\"przeglądarki.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Jeśli nie podjąłeś tej czynności, możesz bezpiecznie zignorować tę wiadomość.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Kod logowania\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Zmieniono Twoje hasło.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Hasło zmienione\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Poniżej znajduje się kod resetowania hasła. Wprowadź go w otwartym oknie \"\n\"przeglądarki.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Kod resetowania hasła\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Otrzymujesz tę wiadomość e-mail, ponieważ Ty lub ktoś inny poprosił o \"\n\"zresetowanie hasła do Twojego konta użytkownika.\\n\"\n\"Możesz ją bezpiecznie zignorować, jeśli nie prosiłeś o zresetowanie hasła. \"\n\"Kliknij poniższy link, aby zresetować hasło.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"\"\n\"Na wszelki wypadek przypominamy, że Twoja nazwa użytkownika to %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"E-mail z resetowaniem hasła\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Twoje hasło zostało zresetowane.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Twoje hasło zostało ustawione .\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Hasło ustawione\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Otrzymujesz tę wiadomość e-mail, ponieważ Ty lub ktoś inny próbował uzyskać \"\n\"dostęp do konta o adresie e-mail %(email)s. Jednak w naszej bazie danych nie \"\n\"ma żadnego wpisu o takim koncie.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"Jeśli to Ty, możesz założyć konto korzystając z poniższego linku.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Nieznane konto\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Adresy email\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Obecny adres e-mail\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Zmiana na\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Twój adres e-mail nadal oczekuje na weryfikację.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Anuluj zmianę\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Zmień na\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Zmień e-mail\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Potwierdź adres e-mail\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Potwierdź, że <a href=\\\"mailto:%(email)s\\\">%(email)s</a> jest adresem e-mail \"\n\"użytkownika %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Nie można potwierdzić adresu %(email)s, ponieważ został on już potwierdzony \"\n\"z innego konta.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Ten link potwierdzający e-mail wygasł lub jest nieprawidłowy. Proszę <a \"\n\"href=\\\"%(email_url)s\\\">wysłać nową prośbę o potwierdzenie e-mailem</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Jeżeli nie masz jeszcze konta, to proszę %(link)szarejestruj się%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Zaloguj się za pomocą klucza dostępu\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Wyślij mi kod logowania\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Wyloguj się\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Czy na pewno chcesz się wylogować ?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Nie możesz usunąć podstawowego adresu e-mail (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"E-mail z potwierdzeniem został wysłany na adres %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Adres %(email)s został potwierdzony.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Adres e-mail %(email)s został usunięty.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Zalogowano jako %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Wylogowano.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Kod logowania został wysłany do %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Hasło zostało zmienione.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Hasło zostało ustawione.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Kod weryfikacyjny został wysłany na numer %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Zweryfikowałeś numer telefonu %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Podstawowy adres e-mail został ustawiony.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Zmień hasło\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Nie pamiętasz hasła?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Zapomniałeś hasła? Wpisz poniżej swój adres e-mail, a wyślemy Ci wiadomość e-\"\n\"mail umożliwiającą jego zresetowanie.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Zresetuj moje hasło\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Skontaktuj się z nami, jeśli masz problem ze zresetowaniem swojego hasła.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Wysłaliśmy Ci wiadomość e-mail. Jeśli jej nie otrzymałeś, sprawdź folder ze \"\n\"spamem. Jeśli nie otrzymasz jej w ciągu kilku minut, skontaktuj się z nami.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Nieprawidłowy klucz\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Link do resetowania hasła był nieprawidłowy, prawdopodobnie dlatego, że \"\n\"został już użyty. Poproś o <a href=\\\"%(passwd_reset_url)s\\\">nowe \"\n\"zresetowanie hasła</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Twoje hasło zostało zmienione.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Ustaw hasło\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Zmień telefon\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Obecny telefon\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Twój numer telefonu nadal oczekuje na weryfikację.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Zmień telefon\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Wprowadż hasło:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Otrzymasz specjalny kod umożliwiający logowanie bez podawania hasła.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Kod żądania\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Inne opcje logowania\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Zarejestruj się\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Zarejestruj się\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Masz już konto? Jeżeli tak, to %(link)szaloguj się%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Zarejestruj się za pomocą klucza dostępu\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Rejestracja za pomocą klucza dostępu\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Inne opcje\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Rejestracja zamknięta\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Przepraszamy, ale w tej chwili rejestracja jest zamknięta.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Uwaga\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Jesteś już zalogowany/-a jako %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Ostrzeżenie:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Obecnie nie masz skonfigurowanego adresu e-mail. Powinieneś go dodać, aby \"\n\"otrzymywać powiadomienia, resetować hasło itp.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Zweryfikuj swój adres e-mail\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Wysłaliśmy do Ciebie wiadomość e-mail z prośbą o weryfikację. Kliknij podany \"\n\"link, aby dokończyć proces rejestracji. Jeśli nie widzisz wiadomości \"\n\"weryfikacyjnej w swojej głównej skrzynce odbiorczej, sprawdź folder ze \"\n\"spamem. Skontaktuj się z nami, jeśli nie otrzymasz wiadomości weryfikacyjnej \"\n\"w ciągu kilku minut.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Ta część witryny wymaga od nas weryfikacji,\\n\"\n\"że jesteś tym, za kogo się podajesz. W tym celu wymagamy od Ciebie\\n\"\n\"potwierdzenia własności Twojego adresu e-mail. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Wysłaliśmy do Ciebie wiadomość e-mail w celu\\n\"\n\"weryfikacji. Kliknij link w tej wiadomości. Jeśli nie widzisz wiadomości \"\n\"weryfikacyjnej w głównej skrzynce odbiorczej, sprawdź folder ze spamem. W \"\n\"przeciwnym razie,\\n\"\n\"jeśli nie otrzymasz jej w ciągu kilku minut, skontaktuj się z nami.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Uwaga:</strong> nadal możesz <a href=\\\"%(email_url)s\\\">zmienić swój \"\n\"adres e-mail</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Wiadomości:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menu:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Połączone konta\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Autoryzacja dwuskładnikowa\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sesje\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"autoryzuj\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s chce uzyskać dostęp do Twojego konta %(site_name)s.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Wprowadź kod urządzenia\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Wprowadź kod wyświetlony na Twoim urządzeniu.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Kontynuuj\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Potwierdź urządzenie\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Potwierdź kod wyświetlony na %(client_name)s, aby autoryzować to urządzenie.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Odmów\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Urządzenie autoryzowane\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Pomyślnie autoryzowałeś urządzenie %(client_name)s .\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Urządzenie odrzucone\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Autoryzacja Twojego urządzenia %(client_name)s została odrzucona.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Błąd\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Pozostań zalogowany\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Twoje konto jest chronione przez uwierzytelnianie dwuskładnikowe. Proszę \"\n\"wprowadzić kod uwierzytelniający:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Wygenerowano nowy zestaw kodów odzyskiwania uwierzytelniania \"\n\"dwuskładnikowego.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Wygenerowano nowe kody odzyskiwania\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Aplikacja autoryzacyjna została aktywowana.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Aplikacja uwierzytelniająca aktywowana\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Aplikacja autoryzacyjna została dezaktywowana.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Aplikacja uwierzytelniająca została dezaktywowana\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Dodano nowy klucz bezpieczeństwa.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Dodano klucz bezpieczeństwa\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Twoje hasło zostało usunięte.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Usunięto klucz bezpieczeństwa\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Aplikacja autoryzacyjna\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Autoryzacja za pomocą aplikacji autoryzacyjnej jest aktywna.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Aplikacja autoryzacyjna nie jest aktywna.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Dezaktywuj\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktywuj\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Klucze bezpieczeństwa\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Dodałeś klucz bezpieczeństwa %(count)s.\"\nmsgstr[1] \"Dodałeś klucze bezpieczeństwa %(count)s.\"\nmsgstr[2] \"Dodałeś klucze bezpieczeństwa %(count)s.\"\nmsgstr[3] \"Dodałeś klucze bezpieczeństwa %(count)s.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Nie dodano żadnych kluczy bezpieczeństwa.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Zarządzaj\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Dodaj\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Kody odzyskiwania\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Dostępny jest %(unused_count)s z %(total_count)s kodów odzyskiwania.\"\nmsgstr[1] \"\"\n\"Dostępnych jest %(unused_count)s z %(total_count)s kodów odzyskiwania.\"\nmsgstr[2] \"\"\n\"Dostępnych jest %(unused_count)s z %(total_count)s kodów odzyskiwania.\"\nmsgstr[3] \"\"\n\"Dostępnych jest %(unused_count)s z %(total_count)s kodów odzyskiwania.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Nie ustawiono żadnych kodów odzyskiwania.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Widok\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Pobierz\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Generuj\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Wygenerowano nowy zestaw kodów odzyskiwania.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Dodano klucz bezpieczeństwa.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Usunięto klucz bezpieczeństwa.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Wprowadź kod uwierzytelniający:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Zaraz wygenerujesz nowy zestaw kodów odzyskiwania dla Twojego konta.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Ta czynność spowoduje unieważnienie istniejących kodów.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Jesteś pewny?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Niewykorzystane kody\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Pobierz kody\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Wygeneruj nowe kody\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Aktywuj aplikację uwierzytelniającą\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Aby zabezpieczyć swoje konto za pomocą uwierzytelniania dwuskładnikowego, \"\n\"zeskanuj poniższy kod QR za pomocą aplikacji uwierzytelniającej. Następnie \"\n\"wprowadź poniżej kod weryfikacyjny wygenerowany przez aplikację.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Tajny klucz uwierzytelniający\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Możesz przechować ten sekret i użyć go później do ponownej instalacji \"\n\"aplikacji uwierzytelniającej.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Wyłącz aplikację uwierzytelniającą\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Zamierzasz wyłączyć uwierzytelnianie oparte na aplikacji Authenticator. \"\n\"Jesteś pewien?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Czy ufasz tej przeglądarce?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Jeśli zdecydujesz się zaufać tej przeglądarce, przy następnym logowaniu nie \"\n\"zostaniesz poproszony o podanie kodu weryfikacyjnego.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Zaufaj przez %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Nie ufaj\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Dodaj klucz bezpieczeństwa\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Usuń klucz bezpieczeństwa\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Czy na pewno chcesz usunąć ten klucz bezpieczeństwa?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Stosowanie\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Klucz uniwersalny\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Klucz bezpieczeństwa\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Klucz ten nie wskazuje, czy jest kluczem dostępu.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Nieokreślony\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Dodano w %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Ostatnio użyte %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Edytuj\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Edytuj klucz bezpieczeństwa\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Zapisz\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Utwórz klucz dostępu\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Zamierzasz utworzyć klucz dostępu do swojego konta. Ponieważ później możesz \"\n\"dodać kolejne klucze, możesz użyć opisowej nazwy, aby je rozróżnić.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Utwórz\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Do korzystania z tej funkcjonalności wymagany jest JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Błąd logowania za pośrednictwem strony trzeciej\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Wystąpił błąd podczas próby logowania za pośrednictwem konta innej firmy.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Możesz zalogować się na swoje konto przy użyciu dowolnego z następujących \"\n\"kont osób trzecich:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Obecnie nie masz żadnych kont innych firm połączonych z tym kontem.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Dodaj konto innej firmy\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Do Twojego konta zostało podłączone konto innej firmy od %(provider)s.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Połączono konto innej firmy\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"Konto innej firmy od %(provider)s zostało odłączone od Twojego konta.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Konto firmy trzeciej odłączone\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Połącz z %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Zamierzasz podłączyć nowe konto innej firmy od %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Zaloguj się za pomocą %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Zamierzasz zalogować się przy użyciu konta zewnętrznego dostawcy \"\n\"%(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Logowanie anulowane\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Wybrano anulowanie logowania przez jedno z istniejących kont. Jeżeli to była \"\n\"pomyłka, proszę przejdź do <a href=\\\"%(login_url)s\\\">zaloguj</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Konto firmy trzeciej zostało połączone.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Konto osoby trzeciej zostało odłączone.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Masz zamiar użyć konta %(provider_name)s do zalogowania się w \\n\"\n\"%(site_name)s. Jako ostatni krok, proszę wypełnij formularz:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Lub skorzystaj z serwisów społecznościowych\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Wylogowano ze wszystkich pozostałych sesji.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Rozpoczęto o\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"Adres IP\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Przeglądarka\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Ostatnio widziany w\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Obecne\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Wyloguj się z innych sesji\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Sesje użytkowników\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"Klucz sesji\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Połączone konta\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Hasło musi składać się z co najmniej {0} znaków.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Otrzymujesz tę wiadomość, ponieważ Ty lub ktoś inny poprosił o \"\n#~ \"zresetowanie hasła do Twojego konta.\\n\"\n#~ \"Niniejszą wiadomość możesz spokojnie zignorować, jeżeli prośba nie \"\n#~ \"pochodziła od Ciebie. Kliknij w link poniżej, aby zresetować hasło.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Poniższe adresy e-mail są powiązane z Twoim kontem:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Potwierdź adres e-mail\"\n\n#~ msgid \"\"\n#~ \"To safeguard the security of your account, please enter your password:\"\n#~ msgstr \"Dla bezpieczeństwa konta, prosimy o podanie hasła:\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Proszę zaloguj się jednym\\n\"\n#~ \"z Twoich zewnętrznych kont. Lub %(link)szarejestruj się</a> \\n\"\n#~ \"w %(site_name)s i zaloguj poniżej:\"\n\n#~ msgid \"or\"\n#~ msgstr \"lub\"\n\n#~ msgid \"change password\"\n#~ msgstr \"zmień hasło\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Zaloguj przez OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Ten adres e-mail jest już powiązany z innym kontem.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Wysłaliśmy Ci e-mail. Proszę skontaktuj się z nami, jeśli go nie \"\n#~ \"otrzymasz w ciągu paru minut.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"Login i/lub hasło, które podałeś, są niepoprawne.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"\"\n#~ \"Nazwa użytkownika może zawierać tylko litery, cyfry oraz znaki @/./+/-/_.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"Nazwa użytkownika jest już w użyciu. Proszę wybierz inną.\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"Potwierdziłeś, że adres <a href=\\\"mailto:%(email)s\\\">%(email)s</a> jest \"\n#~ \"adresem e-mail użytkownika %(user_display)s.\"\n\n#~ msgid \"Thanks for using our site!\"\n#~ msgstr \"Dziękujemy za używanie naszej strony!\"\n\n#~ msgid \"Socialaccount\"\n#~ msgstr \"Konta społecznościowe\"\n\n#~ msgid \"Key (Stack Exchange only)\"\n#~ msgstr \"Klucz (tylko dla Stack Exchange)\"\n\n#~ msgid \"Confirmation email sent to %(email)s\"\n#~ msgstr \"Wiadomość z potwierdzeniem została wysłana na adres %(email)s\"\n\n#~ msgid \"Delete Password\"\n#~ msgstr \"Skasuj hasło\"\n\n#~ msgid \"\"\n#~ \"You may delete your password since you are currently logged in using \"\n#~ \"OpenID.\"\n#~ msgstr \"Możesz skasować swoje hasło jeśli używasz OpenID.\"\n\n#~ msgid \"delete my password\"\n#~ msgstr \"skasuj moje hasło\"\n\n#~ msgid \"Password Deleted\"\n#~ msgstr \"Hasło Skasowane\"\n"
  },
  {
    "path": "allauth/locale/pt_BR/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n# Translators:\n# Renato De Giovanni <renato@cria.org.br>, 2022\n# cacarrara <caiocarrara@gmail.com>, 2014\n# Fábio C. Barrionuevo da Luz <bnafta@gmail.com>, 2013-2014\n# Rodrigo <rprior@infranology.com.br>, 2013\n# Rodrigo <rprior@infranology.com.br>, 2013-2014\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: django-allauth\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2026-02-12 01:09+0000\\n\"\n\"Last-Translator: Lisandro Guerra Simões Pires <lisandro.digital@gmail.com>\\n\"\n\"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/\"\n\"allauth/django-allauth/pt_BR/>\\n\"\n\"Language: pt_BR\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 5.16-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Esta conta está atualmente inativa.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Você não pode remover seu endereço de e-mail principal.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Este endereço de e-mail já está associado a esta conta.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"O endereço de e-mail e/ou senha especificados estão incorretos.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"O número de telefone e/ou senha especificados estão incorretos.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Um usuário já está registrado com este endereço de e-mail.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Por favor, digite sua senha atual.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Código incorreto.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Senha incorreta.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Chave inválida ou expirada.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Conexão inválida.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"O token de redefinição de senha era inválido.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Você não pode adicionar mais de %d endereços de e-mail.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Um usuário já está registrado com este número de telefone.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Muitas tentativas de login falharam. Tente novamente mais tarde.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"O endereço de e-mail não está atribuído a nenhuma conta de usuário.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"O número de telefone não está atribuído a nenhuma conta de usuário\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Seu endereço de e-mail principal deve ser verificado.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"Nome de usuário não pode ser utilizado. Por favor, use outro nome de usuário.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"O nome de usuário e/ou senha especificados estão incorretos.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Escolha apenas um, por favor.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"O novo valor deve ser diferente do atual.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Seja paciente, você está enviando muitas requisições.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Use sua senha\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Use um aplicativo autenticador ou código\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Use uma chave de segurança\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Marcado {email} como verificado.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Falha ao marcar {email} como verificado.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Marcar os endereços de e-mail selecionados como verificados\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Contas\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Endereço de e-mail\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Entre com um número de telefone incluindo o código de país (ex. +55 para \"\n\"Brasil).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefone\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Você deve digitar a mesma senha todas as vezes.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Senha\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Lembrar de Mim\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Nome de usuário\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Nome de usuário, e-mail ou telefone\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Nome de usuário ou e-mail\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Nome de usuário ou telefone\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-mail ou telefone\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Esqueceu sua senha?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-mail (novamente)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Confirmação de endereço de e-mail\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-mail (opcional)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Nome de usuário (opcional)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Você deve digitar o mesmo e-mail todas as vezes.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Senha (novamente)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Senha atual\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Nova senha\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Nova senha (novamente)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Código\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"usuário\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"endereço de e-mail\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"verificado\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"principal\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"endereços de e-mail\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"criado\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"enviado\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"chave\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"confirmação de e-mail\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"confirmações de e-mail\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Ver seu ID de usuário\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Ver seu endereço de e-mail\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Ver suas informações básicas de perfil\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Conceder permissões\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Caracteres curinga não são permitidos a menos que 'Permitir curingas em \"\n\"URIs' esteja habilitado.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"A URI '{}' contém mais de um curinga (*). Apenas um curinga por URI é \"\n\"permitido.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Curingas são permitidos apenas na parte do nome de host da URI.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Código de autorização\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Código de dispositivo\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Credenciais do cliente\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Token de atualização\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Confidencial\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Público\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"O(s) escopo(s) que o cliente pode solicitar. Forneça um valor por linha, \"\n\"ex.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Caso o cliente não especifique nenhum escopo, estes escopos padrão são \"\n\"utilizados. Forneça um valor por linha, ex.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Uma lista de tipos de concessão permitidos. Forneça um valor por linha, ex.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Uma lista de origens permitidas para requisições cross-origin, uma por linha.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Permitir curingas (*) em URIs de redirecionamento e origens CORS. Quando \"\n\"habilitado, URIs podem conter um único asterisco para corresponder a \"\n\"subdomínios.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Uma lista de tipos de resposta permitidos. Forneça um valor por linha, ex.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"cliente\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"clientes\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Você não pode adicionar um endereço de e-mail a uma conta protegida por \"\n\"autenticação de dois fatores.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Você não pode desativar a autenticação de dois fatores.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Você não pode gerar códigos de recuperação sem ter a autenticação de dois \"\n\"fatores ativada.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Você não pode ativar a autenticação de dois fatores até que tenha verificado \"\n\"seu endereço de e-mail.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Chave mestre\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Chave de backup\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Chave nº {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Códigos de recuperação\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"Autenticador TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Código do autenticador\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Sem senha\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Ativar a operação sem senha permite que você faça login apenas com esta \"\n\"chave, mas impõe requisitos adicionais, como biometria ou proteção com PIN.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Uma conta já existe com este endereço de e-mail. Faça login nessa conta \"\n\"primeiro e depois conecte sua conta %s.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Token inválido.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Sua conta não tem senha configurada.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Sua conta não tem um endereço de e-mail verificado.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Você não pode desconectar sua última conta de terceiros conectada.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"A conta de terceiros já está conectada a uma conta diferente.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Contas sociais\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"provedor\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ID do provedor\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"nome\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"ID do cliente\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"ID do aplicativo ou chave do consumidor\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"chave secreta\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"Segredo da API, segredo do cliente ou segredo do consumidor\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Chave\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"aplicativo social\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"aplicativos sociais\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"último login\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"data de entrada\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"dados adicionais\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"conta social\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"contas sociais\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) ou token de acesso (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"segredo do token\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) ou token de atualização (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"expira em\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"token de aplicativo social\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"tokens de aplicativos sociais\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Dados de perfil inválidos\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Resposta inválida ao obter o token de solicitação de \\\"%s\\\". A resposta foi: \"\n\"%s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Resposta inválida ao obter o token de acesso de \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Nenhum token de solicitação salvo para \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Nenhum token de acesso salvo para \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Sem acesso a recursos privados em \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Resposta inválida ao obter o token de solicitação de \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Conta inativa\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Esta conta está inativa.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Enviamos um código para %(recipient)s. O código expira em breve, então \"\n\"insira-o logo.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Confirmar\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Solicitar novo código\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Confirmar acesso\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Por favor, reautentique para proteger sua conta.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Opções alternativas\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Verificação de e-mail\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Insira o código de verificação de e-mail\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Usar um endereço de e-mail diferente\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Entrar\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Insira o código de entrada\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Redefinição de senha\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Insira o código de redefinição de senha\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Verificação de telefone\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Insira o código de verificação de telefone\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Usar um número de telefone diferente\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Endereços de e-mail\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Os seguintes endereços de e-mail estão associados à sua conta:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Verificado\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Não verificado\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Principal\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Tornar principal\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Reenviar verificação\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Remover\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Adicionar endereço de e-mail\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Adicionar e-mail\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Você realmente deseja remover o endereço de e-mail selecionado?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Você está recebendo este e-mail porque você ou outra pessoa tentou se \"\n\"inscrever para\\n\"\n\"uma conta usando o endereço de e-mail:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"No entanto, uma conta com este endereço de e-mail já existe. Caso você \"\n\"tenha\\n\"\n\"esquecido disso, por favor use o procedimento de recuperação de senha para\\n\"\n\"recuperar sua conta:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Conta já existente\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Olá da %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Obrigado por usar %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Você está recebendo este e-mail porque a seguinte alteração foi feita em sua \"\n\"conta:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Se você não reconhece essa alteração, por favor tome as devidas precauções \"\n\"de segurança imediatamente. A alteração em sua conta se origina de:\\n\"\n\"\\n\"\n\"- Endereço IP: %(ip)s\\n\"\n\"- Navegador: %(user_agent)s\\n\"\n\"- Data: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Seu e-mail foi alterado de %(from_email)s para %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"E-mail alterado\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Seu e-mail foi confirmado.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Confirmação de e-mail\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Você está recebendo este e-mail porque o usuário %(user_display)s forneceu \"\n\"seu\\n\"\n\"endereço de e-mail para registrar uma conta em %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Seu código de verificação de e-mail está listado abaixo. Por favor, insira-o \"\n\"na janela do seu navegador aberta.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Para confirmar que isso está correto, acesse %(activate_url)s.\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Por favor, confirme seu endereço de e-mail.\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"O endereço de e-mail %(deleted_email)s foi removido de sua conta.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"E-mail removido\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Seu código de entrada está listado abaixo. Por favor, insira-o na janela do \"\n\"seu navegador aberta.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Este e-mail pode ser ignorado com segurança se você não iniciou esta ação.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Código de entrada\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Sua senha foi alterada.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Senha alterada\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Seu código de redefinição de senha está listado abaixo. Por favor, insira-o \"\n\"na janela do seu navegador aberta.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Código de redefinição de senha\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Você está recebendo este e-mail porque você ou outra pessoa solicitou a \"\n\"redefinição de senha para sua conta de usuário.\\n\"\n\"Este e-mail pode ser ignorado com segurança se você não solicitou a \"\n\"redefinição de senha. Clique no link abaixo para redefinir sua senha.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Caso tenha esquecido, seu nome de usuário é %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"E-mail de redefinição de senha\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Sua senha foi redefinida.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Sua senha foi definida.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Senha definida\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Você está recebendo este e-mail porque você, ou outra pessoa, tentou acessar \"\n\"uma conta com o e-mail %(email)s. No entanto, não temos nenhum registro de \"\n\"tal conta em nosso banco de dados.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"Se foi você, pode se inscrever para uma conta usando o link abaixo.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Conta desconhecida\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Endereço de e-mail\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"E-mail atual\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Alterando para\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Seu endereço de e-mail ainda está aguardando verificação.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Cancelar alteração\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Alterar para\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Alterar e-mail\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Confirmar endereço de e-mail\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Por favor, confirme que <a href=\\\"mailto:%(email)s\\\">%(email)s</a> é um \"\n\"endereço de e-mail para o usuário %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Incapaz de confirmar %(email)s porque já foi confirmado por uma conta \"\n\"diferente.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Este link de confirmação de e-mail expirou ou é inválido. Por favor, <a \"\n\"href=\\\"%(email_url)s\\\">emita uma nova solicitação de confirmação de e-mail</\"\n\"a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Se você ainda não criou uma conta, por favor, %(link)scadastre-\"\n\"se%(end_link)s primeiro.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Entrar com uma chave de segurança\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Envie-me um código de entrada\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Sair\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Tem certeza de que deseja sair?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Você não pode remover seu endereço de e-mail principal (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"E-mail de confirmação enviado para %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Você confirmou %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Endereço de e-mail removido %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Conectado com sucesso como %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Você saiu.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Um código de entrada foi enviado para %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Senha alterada com sucesso.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Senha definida com sucesso.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Um código de verificação foi enviado para %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Você verificou o número de telefone %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Endereço de e-mail principal definido.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Alterar senha\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Esqueceu a senha?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Esqueceu sua senha? Insira seu endereço de e-mail abaixo e nós enviaremos um \"\n\"e-mail permitindo que você a redefina.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Redefinir minha senha\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Por favor, entre em contato conosco se tiver algum problema ao redefinir sua \"\n\"senha.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Enviamos um e-mail para você. Se você não o recebeu, por favor, verifique \"\n\"sua pasta de spam. Caso contrário, entre em contato conosco se não o receber \"\n\"em alguns minutos.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Token inválido\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"O link de redefinição de senha era inválido, possivelmente porque já foi \"\n\"utilizado. Por favor, solicite uma <a href=\\\"%(passwd_reset_url)s\\\">nova \"\n\"redefinição de senha</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Sua senha foi alterada.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Definir senha\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Alterar telefone\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Telefone atual\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Seu número de telefone ainda está aguardando verificação.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Alterar telefone\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Insira sua senha:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Você receberá um código especial para uma entrada sem senha.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Solicitar código\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Outras opções de entrada\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Cadastrar-se\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Cadastrar-se\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Já tem uma conta? Então, por favor, %(link)ssign in%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Cadastrar-se usando uma chave de segurança\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Cadastro com chave de segurança\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Outras opções\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Cadastro fechado\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Desculpe, mas o cadastro está atualmente fechado.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Nota\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Você já está conectado como %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Aviso:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Atualmente, você não tem nenhum endereço de e-mail configurado. Você deve \"\n\"realmente adicionar um endereço de e-mail para que possa receber \"\n\"notificações, redefinir sua senha, etc.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Verifique seu endereço de e-mail\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Enviamos um e-mail para você para verificação. Siga o link fornecido para \"\n\"finalizar o processo de cadastro. Se você não encontrar o e-mail de \"\n\"verificação em sua caixa de entrada principal, verifique sua pasta de spam. \"\n\"Entre em contato conosco se não receber o e-mail de verificação dentro de \"\n\"alguns minutos.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Esta parte do site exige que verifiquemos que você é quem afirma ser. Para \"\n\"esse fim, exigimos que você\\n\"\n\"verifique a propriedade do seu endereço de e-mail. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Enviamos um e-mail para você para verificação. Por favor, clique no link \"\n\"dentro desse e-mail. Se você não encontrar o e-mail de verificação em sua \"\n\"caixa de entrada principal, verifique sua pasta de spam. Caso contrário, \"\n\"entre em contato conosco se não o receber dentro de alguns minutos.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Nota:</strong> você ainda pode <a href=\\\"%(email_url)s\\\">alterar seu \"\n\"endereço de e-mail</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Mensagens:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menu:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Conexões de conta\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Autenticação de dois fatores\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sessões\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autorizar\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s deseja acessar sua conta %(site_name)s.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Insira o código do dispositivo\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Insira o código exibido no seu dispositivo.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Continuar\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Confirmar dispositivo\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Por favor, confirme o código exibido no seu %(client_name)s para autorizar \"\n\"este dispositivo.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Negar\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Dispositivo autorizado\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Você autorizou com sucesso seu dispositivo %(client_name)s.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Dispositivo negado\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"A autorização para o seu dispositivo %(client_name)s foi negada.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Erro\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Manter conectado\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Sua conta está protegida por autenticação de dois fatores. Por favor, insira \"\n\"um código do autenticador:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Um novo conjunto de códigos de recuperação da autenticação de dois fatores \"\n\"foi gerado.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Novos códigos de recuperação gerados\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Aplicativo autenticador ativado.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Aplicativo autenticador ativado\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Aplicativo autenticador desativado.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Aplicativo autenticador desativado\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Uma nova chave de segurança foi adicionada.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Chave de segurança adicionada\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Uma chave de segurança foi removida.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Chave de segurança removida\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Aplicativo autenticador\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"A autenticação usando um aplicativo autenticador está ativa.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Um aplicativo autenticador não está ativo.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Desativar\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Ativar\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Chaves de segurança\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Você adicionou %(count)s chave de segurança.\"\nmsgstr[1] \"Você adicionou %(count)s chaves de segurança.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Nenhuma chave de segurança foi adicionada.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Gerenciar\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Adicionar\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Códigos de recuperação\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Há %(unused_count)s de %(total_count)s códigos de recuperação disponíveis.\"\nmsgstr[1] \"\"\n\"Há %(unused_count)s de %(total_count)s códigos de recuperação disponíveis.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Nenhum código de recuperação configurado.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Visualizar\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Baixar\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Gerar\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Um novo conjunto de códigos de recuperação foi gerado.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Chave de segurança adicionada.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Chave de segurança removida.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Insira um código do autenticador:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\"Você está prestes a gerar um novo conjunto de códigos de recuperação para \"\n\"sua conta.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Esta ação invalidará seus códigos existentes.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Você tem certeza?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Códigos não utilizados\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Baixar códigos\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Gerar novos códigos\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Ativar aplicativo autenticador\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Para proteger sua conta com autenticação de dois fatores, escaneie o código \"\n\"QR abaixo com seu aplicativo autenticador. Em seguida, insira o código de \"\n\"verificação gerado pelo aplicativo abaixo.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Segredo do autenticador\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Você pode armazenar este segredo e usá-lo para reinstalar seu aplicativo \"\n\"autenticador posteriormente.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Desativar aplicativo autenticador\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Você está prestes a desativar a autenticação baseada em aplicativo \"\n\"autenticador. Você tem certeza?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Confiar neste navegador?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Se você optar por confiar neste navegador, não será solicitado um código de \"\n\"verificação na próxima vez que entrar.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Confiar por %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Não confiar\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Adicionar chave de segurança\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Remover chave de segurança\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Tem certeza de que deseja remover esta chave de segurança?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Chave de segurança\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Chave de segurança\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Esta chave não indica se é uma chave de segurança.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Não especificado\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Adicionado em %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Último uso em %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Editar\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Editar chave de segurança\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Salvar\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Criar chave de segurança\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Você está prestes a criar uma chave de segurança para sua conta. Como você \"\n\"pode adicionar chaves adicionais posteriormente, pode usar um nome \"\n\"descritivo para diferenciar as chaves.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Criar\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Esta funcionalidade requer JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Falha no login de terceiros\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"Ocorreu um erro ao tentar fazer login via sua conta de terceiros.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Você pode fazer login em sua conta usando qualquer uma das seguintes contas \"\n\"de terceiros:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Atualmente, você não tem contas de terceiros conectadas a esta conta.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Adicionar uma conta de terceiros\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Uma conta de terceiros de %(provider)s foi conectada à sua conta.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Conta de terceiros conectada\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"Uma conta de terceiros de %(provider)s foi desconectada de sua conta.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Conta de terceiros desconectada\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Conectar %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Você está prestes a conectar uma nova conta de terceiros de %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Entrar via %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Você está prestes a fazer login usando uma conta de terceiros de \"\n\"%(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Login cancelado\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Você decidiu cancelar o login em nosso site usando uma de suas contas \"\n\"existentes. Se isso foi um erro, por favor, continue para <a \"\n\"href=\\\"%(login_url)s\\\">fazer login</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"A conta de terceiros foi conectada.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"A conta de terceiros foi desconectada.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Você está prestes a usar sua conta %(provider_name)s para fazer login em\\n\"\n\"%(site_name)s. Como passo final, por favor, complete o formulário a seguir:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Ou use uma conta de terceiros\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Saiu de todas as outras sessões.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Iniciado em\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"Endereço IP\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Navegador\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Última visualização em\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Atual\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Sair de outras sessões\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Sessões de usuário\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"chave da sessão\"\n"
  },
  {
    "path": "allauth/locale/pt_PT/LC_MESSAGES/django.po",
    "content": "# Portuguese from Portugal translation for django-allauth.\n# Copyright (C) 2023\n# This file is distributed under the same license as the django-allauth package.\n#\n# Translators:\n# Fábio Santos, 2012\n# Emanuel Angelo <emanuel.angelo@gmail.com>, 2023.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: django-allauth\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-08-04 13:01+0000\\n\"\n\"Last-Translator: ssantos <ssantos@web.de>\\n\"\n\"Language-Team: Portuguese (Portugal) <https://hosted.weblate.org/projects/\"\n\"allauth/django-allauth/pt_PT/>\\n\"\n\"Language: pt_PT\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 5.13-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Esta conta está atualmente inativa.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Não pode remover o seu endereço de e-mail principal.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Este endereço de email já está associado a esta conta.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"\"\n\"O endereço de email e/ou a palavra-passe que especificou não estão corretos.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"\"\n\"O número de telefone e/ou a palavra-passe que especificou não estão corretos.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Já existe um utilizador registado com este endereço de email.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Por favor insira a sua palavra-passe atual.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Código errado.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Palavra-passe errada.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Chave inválida ou expirada.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Login inválido.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"O código para redefinir a palavra-passe era inválido.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Não pode adicionar mais do que %d endereços de email.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Já existe um utilizador registado com este número de telefone.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"\"\n\"Demasiadas tentativas falhadas para iniciar sessão. Tente novamente mais \"\n\"tarde.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"O endereço de email não está associado a nenhuma conta.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"O número de telefone não está associado a nenhuma conta.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"O seu endereço de email primário tem de ser verificado.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Esse nome de utilizador não pode ser utilizado. Por favor, use outro.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"\"\n\"O nome de utilizador e/ou a palavra-passe que especificou não estão corretos.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Por favor, selecione apenas um.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"O valor novo deve ser diferente do atual.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Seja paciente, está a enviar muitos requerimentos.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Utilizar palavra-passe\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Use uma app autenticadora ou código\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Use uma chave de segurança\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Marcado {email} como verificado.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Marcar {email} como verificado falhou.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Marcar endereços de e-mail selecionados como verificados\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Contas\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"Email\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Endereço de email\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Digite um número de telefone incluindo o código do país (por exemplo, +351 \"\n\"para Portugal).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefone\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Tem que escrever a mesma palavra-passe em ambos os campos.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Palavra-passe\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Lembrar-me\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Nome de utilizador\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Iniciar sessão\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Nome de utilizador, email ou telefone\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Nome de utilizador ou email\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Nome de utilizador ou telefone\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Email ou telefone\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Esqueceu-se da sua palavra-passe?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"Email (novamente)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Confirmação do endereço de email\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"Email (opcional)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Nome de utilizador (opcional)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"deve escrever o mesmo endereço de email em ambos os campos.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Palavra-passe (novamente)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Palavra-passe atual\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Nova palavra-passe\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Nova palavra-passe (novamente)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Código\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"utilizador\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"endereço de email\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"verificado\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"primário\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"endereços de email\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"criado\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"enviado\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"chave\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"confirmação de email\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"confirmações de email\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Visualizar o seu ID de utilizador\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Ver o seu endereço de email\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Ver as suas informações básicas de perfil\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Conceder permissões\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Os caracteres universais não são permitidos a menos que 'Permitir caracteres \"\n\"universais em URIs' esteja ativado.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"O URI '{}' contém mais do que um carácter universal (*). Apenas um carácter \"\n\"universal por URI é permitido.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"\"\n\"Os caracteres universais só são permitidos na parte do nome de anfitrião do \"\n\"URI.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Código de autorização\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Código de dispositivo\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Credenciais de cliente\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Atualizar o token\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Confidencial\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Público\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"O(s) escopo(s) que o cliente pode solicitar. Fornecer um valor por linha, \"\n\"por exemplo: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Caso o cliente não especifique qualquer escopo, esses escopos predefinidos \"\n\"são usados. Forneça um valor por linha, por exemplo: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Uma lista de tipos de concessão permitidos. Forneça um valor por linha, por \"\n\"exemplo: author_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Uma lista de origens permitidas para pedidos cross-origin, uma por linha.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Permitir caracteres universais (*) em URIs de redirecionamento e origens \"\n\"CORS. Quando ativado, os URIs podem conter um único asterisco para \"\n\"corresponder a subdomínios.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Uma lista de tipos de resposta permitidos. Forneça um valor por linha, por \"\n\"exemplo: code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"cliente\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"clientes\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Não pode adicionar um endereço de email a uma conta que esteja protegida por \"\n\"autenticação de dois factores.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Não pode desativar a autenticação de dois fatores.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Não pode gerar códigos de recuperação sem ter a autenticação de dois fatores \"\n\"ativada.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Não pode ativar a autenticação de dois factores enquanto não verificar o seu \"\n\"endereço de email.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Chave mestre\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Chave de backup\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Chave nº {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Códigos de recuperação\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"Autenticador TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Código do autenticador\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Sem palavra-passe\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Ativar a operação sem palavra-passe permite que faça login apenas com esta \"\n\"chave, mas impõe requisitos adicionais, como biometria ou proteção com PIN.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Já existe uma conta com este endereço de email. Por favor, inicie a sessão \"\n\"com essa conta e depois associe a sua conta %s.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Token inválido.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"A sua conta não tem uma palavra-passe definida.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"A sua conta não tem um endereço de email verificado.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Não pode desconectar a sua última conta de terceiros conectada.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"A conta de terceiros já está conectada a uma conta diferente.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Contas de redes sociais\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"fornecedor\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ID do fornecedor\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"nome\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"ID do cliente\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"ID da aplicação ou chave do consumidor\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"chave secreta\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"segredo da API, segredo do cliente ou segredo do consumidor\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Chave\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"aplicação social\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"aplicações sociais\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"último início de sessão\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"data da inscrição\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"dados extra\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"conta social\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"contas sociais\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"código\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) ou código de acesso (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"código secreto\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) ou código de refrescamento (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"expira em\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"código da aplicação social\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"códigos da aplicação social\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Dados de perfil inválidos\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Resposta inválida ao obter o código de requisição de \\\"%s\\\". A resposta foi: \"\n\"%s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Resposta inválida ao obter o código de acesso de \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Nenhum código de requisição gravado para \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Nenhum código de acesso gravado para \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Sem acesso a recursos privados em \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Resposta inválida ao obter o código de requisição de \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Conta desabilitada\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Esta conta está desabilitada.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Enviamos um código para %(recipient)s. O código expira brevemente, então por \"\n\"favor insira-o logo.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Confirmar\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Solicitar novo código\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Confirmar acesso\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Por favor, reautentique para proteger a sua conta.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Opções alternativas\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Verificação de e-mail\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Insira o código de verificação de e-mail\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Usar um endereço de email diferente\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Iniciar sessão\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Insira o código de entrada\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Redefinição da palavra-passe\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Introduzir código de redefinição da palavra-passe\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Verificação de telefone\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Digite o código de verificação do telefone\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Use um número de telefone diferente\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Endereços de email\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Os endereços de email seguintes estão associados à sua conta:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Verificado\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Não verificado\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Primário\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Torná-lo primário\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Re-enviar verificação\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Remover\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Adicionar endereço de email\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Adicionar email\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Deseja mesmo remover o endereço de email marcado?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Está a receber este email porque você, ou alguém,\\n\"\n\"tentou criar uma conta usando o endereço de email:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"No entanto já existe uma conta com este endereço de email.\\n\"\n\"Caso se tenha esquecido disto, use o procedimento de recuperação\\n\"\n\"de palavra-passe esquecida para recuperar a sua conta:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"A conta já existe\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Olá de %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Obrigado por usar %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"Recebe este e-mail porque a seguinte alteração foi feita à sua conta:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Se não reconhece esta alteração, por favor tome as devidas precauções de \"\n\"segurança imediatamente. A alteração na sua conta origina de:\\n\"\n\"\\n\"\n\"- Endereço IP: %(ip)s\\n\"\n\"- Navegador: %(user_agent)s\\n\"\n\"- Data: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"O seu e-mail foi alterado de %(from_email)s para %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"E-mail alterado\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"O seu e-mail foi confirmado.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Confirmação de e-mail\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Está a receber este email porque o utilizador %(user_display)s forneceu o \"\n\"seu endereço de email para criar uma conta em %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"O seu código de verificação de e-mail está listado abaixo. Por favor, insira-\"\n\"o na janela do seu navegador aberta.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Para confirmar que isto é correto, vá para %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Confirme o seu endereço de email\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"O endereço de e-mail %(deleted_email)s foi removido da sua conta.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"E-mail removido\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"O seu código de entrada está listado abaixo. Por favor, insira-o na janela \"\n\"do seu navegador aberta.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"Este e-mail pode ser ignorado com segurança se não iniciou esta ação.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Código de entrada\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"A sua palavra-passe foi alterada.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Palavra-passe alterada\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"O seu código de redefinição de palavra-passe está listado abaixo. Por favor, \"\n\"insira-o na janela do navegador aberto.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Código de redefinição da palavra-passe\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Está a receber este email porque você, ou alguém, pediu para redefinir a \"\n\"palavra-passe da sua conta.\\n\"\n\"Pode ignorar este email com segurança, caso não tenha feito tal pedido. \"\n\"Clique na ligação abaixo para redefinir a sua palavra-passe.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Caso se tenha esquecido, o seu nome de utilizador é %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Email com pedido de redefinição da palavra-passe\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"A sua palavra-passe foi redefinida.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"A sua palavra-passe foi definida.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Palavra-passe definida\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Recebe este e-mail porque você, ou outra pessoa, tentou aceder uma conta com \"\n\"o e-mail %(email)s. No entanto, não temos nenhum registo de tal conta no \"\n\"nosso banco de dados.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Se foi você, pode inscrever-se para uma conta através da ligação abaixo.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Conta desconhecida\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Endereço de email\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"E-mail atual\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"A alterar para\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"A seu endereço de e-mail ainda aguarda uma verificação.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Cancelar alteração\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Alterar para\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Alterar email\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Confirmar endereço de email\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Por favor, confirme que <a href=\\\"mailto:%(email)s\\\">%(email)s</a> é um \"\n\"endereço de email do utilizador %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Não foi possível confirmar %(email)s porque já foi confirmado numa conta \"\n\"diferente.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Esta ligação de verificação de email expirou ou é inválida. Por favor, <a \"\n\"href=\\\"%(email_url)s\\\">peça uma nova verificação de email.</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Se ainda não criou uma conta, então por favor %(link)sinscreva-\"\n\"se%(end_link)s primeiro.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Entrar com uma chave de segurança\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Envie-me um código de login\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Terminar sessão\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Tem certeza de que quer terminar a sessão?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Não pode remover o seu endereço de email primário (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Email de confirmação enviado para %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Confirmou %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Removeu o endereço de email %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Iniciou a sessão como %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Terminou a sessão.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Um código de login foi enviado para %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Palavra-passe alterada com sucesso.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Palavra-passe definida com sucesso.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Um código de verificação foi enviado para %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Você verificou o número de telefone %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Endereço de email primário definido.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Alterar palavra-passe\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Esqueceu-se da sua palavra-passe?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Esqueceu-se da sua palavra-passe? Insira o seu endereço de email abaixo e \"\n\"enviar-lhe-emos um email para que a possa redefinir.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Redefinir a minha palavra-passe\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"Contacte-nos se tiver dificuldades em redefinir a sua palavra-passe.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Enviámos-lhe um email. Se o não tiver recebido, verifique a pasta do spam. \"\n\"Se não o encontrar, contacte-nos, se não o receber dentro dos próximos \"\n\"minutos.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Código errado\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"A ligação para redefinir a palavra-passe era inválida, provavelmente por já \"\n\"ter sido usada. Faça um <a href=\\\"%(passwd_reset_url)s\\\">novo pedido para \"\n\"redefinir a palavra-passe</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"A sua palavra-passe está alterada.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Definir palavra-passe\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Alterar telefone\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Telefone atual\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"O seu número de telefone continua pendente de verificação.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Alterar telefone\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Insira a sua palavra-passe:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Receberá um código especial para um login sem palavra-passe.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Solicitar código\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Outras opções de entrada\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Inscrição\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Inscrever-se\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Já tem uma conta? Então %(link)sinicie a sessão%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Cadastrar-se usando uma chave de segurança\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Cadastro com chave de segurança\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Outras opções\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"As inscrições estão fechadas\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Lamentamos, mas as inscrições estão fechadas.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Nota\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Já tem a sessão iniciada como %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Aviso:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Neste momento não tem qualquer endereço de email definido. Devia mesmo \"\n\"adicionar um endereço de email para que possa receber notificações, \"\n\"redefinir a sua palavra-passe, etc.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Verifique o seu endereço de email\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Enviámos-lhe um email para verificação. Siga a ligação fornecida para \"\n\"finalizar a inscrição. Se não encontrar o email de verificação na sua caixa \"\n\"de correio, verifique a pasta do spam. Contacte-nos se não receber o email \"\n\"de verificação nos próximos minutos.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Esta parte da aplicação requer que verifiquemos que\\n\"\n\"você é quem diz ser. Para esse fim, pedimos que comprove\\n\"\n\"ter a posse do seu endereço de email. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Enviámos-lhe um email para.\\n\"\n\"verificação. Clique na ligação que está nesse email. Se não encontrar o \"\n\"email de verificação na sua caixa de entrada, verifique a sua pasta do spam. \"\n\"Caso contrário,\\n\"\n\"contacte-nos se não o receber dentro dos próximos minutos.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Nota:</strong> ainda pode <a href=\\\"%(email_url)s\\\">alterar o seu \"\n\"endereço de email</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Mensagens:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menu:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Ligações da conta\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Autenticação de dois componentes\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sessões\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autorizar\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s quer aceder a sua conta %(site_name)s.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Introduzir código do dispositivo\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Digite o código exibido no seu dispositivo.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Continuar\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Confirmar dispositivo\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Por favor, confirme o código exibido no seu %(client_name)s para autorizar \"\n\"este dispositivo.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Rejeitar\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Dispositivo autorizado\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Você autorizou com sucesso o seu dispositivo %(client_name)s.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Dispositivo rejeitado\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"A autorização para o seu dispositivo %(client_name)s foi rejeitado.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Erro\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Manter sessão iniciada\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"A sua conta está protegida por autenticação de dois factores. Insira o \"\n\"código do autenticador:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Um novo conjunto de códigos de recuperação da autenticação de dois fatores \"\n\"foi gerado.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Novos códigos de recuperação gerados\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Autenticador habilitado.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"App autenticadora ativada\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Autenticador desabilitado.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"App autenticadora desativada\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Uma nova chave de segurança foi adicionada.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Chave de segurança adicionada\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Uma chave de segurança foi removida.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Chave de segurança removida\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Autenticador\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"A autenticação usando um autenticador está habilitada.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Não há um autenticador habilitado.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Desabilitar\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Habilitar\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Chaves de segurança\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Você adicionou %(count)s chave de segurança.\"\nmsgstr[1] \"Você adicionou %(count)s chaves de segurança.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Nenhuma chave de segurança foi adicionada.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Gerir\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Adicionar\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Códigos de recuperação\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Há %(unused_count)s código de recuperação disponível de um total de \"\n\"%(total_count)s.\"\nmsgstr[1] \"\"\n\"Há %(unused_count)s códigos de recuperação disponíveis de um total de \"\n\"%(total_count)s.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Não há códigos de recuperação definidos.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Visualizar\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Descarregar\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Gerar\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Foi gerado um novo conjunto de códigos de recuperação.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Chave de segurança adicionada.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Chave de segurança removida.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Introduza um código do autenticador:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\"Está prestes a gerar um novo conjunto de códigos de recuperação para a sua \"\n\"conta.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Esta ação vai invalidar os seus códigos existentes.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Tem a certeza?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Códigos não utilizados\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Descarregar códigos\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Gerar novos códigos\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Habilitar autenticador\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Para proteger a sua conta com autenticação de dois fatores, digitalize o \"\n\"código QR abaixo com o seu autenticador. Depois, insira o código de \"\n\"verificação gerado pela aplicação, em baixo.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Segredo do autenticador\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Pode guardar este segredo e utilizá-lo para reinstalar o seu autenticador \"\n\"numa data posterior.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Desabilitar o autenticador\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Está prestes a desabilitar a autenticação baseada num autenticador. Tem a \"\n\"certeza?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Confiar neste navegador?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Se optar por confiar neste navegador, não será solicitado um código de \"\n\"verificação na próxima vez que entrar.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Confiança por %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Não confiar\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Adicionar chave de segurança\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Remover chave de segurança\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Tem certeza de que deseja remover esta chave de segurança?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Chave de segurança\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Chave de segurança\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Esta chave não indica se é uma chave de segurança.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Não especificado\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Adicionado em %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Último uso em %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Editar\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Editar chave de segurança\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Gravar\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Criar chave de segurança\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Está prestes a criar uma chave de segurança para a sua conta. Como pode \"\n\"adicionar chaves adicionais posteriormente, pode usar um nome descritivo \"\n\"para diferenciar as chaves.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Criar\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Esta funcionalidade requer JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Falha no login de terceiros\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"Ocorreu um erro ao tentar fazer login via a sua conta de terceiros.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"Pode iniciar a sessão usando uma das seguintes contas externas:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Atualmente, não tem contas de terceiros conectadas a esta conta.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Adicionar uma conta externa\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Uma conta de terceiros de %(provider)s foi conectada à sua conta.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Conta de terceiros conectada\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"Uma conta de terceiros de %(provider)s foi desconectada da sua conta.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Conta de terceiros desconectada\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Conectar %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Está prestes a conectar uma nova conta externa de %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Iniciar sessão via %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Está prestes a iniciar sessão usando uma conta externa de %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Início de sessão cancelado\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Você decidiu cancelar o início da sessão na nossa aplicação usando uma das \"\n\"suas contas existentes. Se o fez por engano, <a \"\n\"href=\\\"%(login_url)s\\\">inicie a sessão</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"A conta de terceiros foi conectada.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"A conta de terceiros foi desconectada.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Está prestes a usar a sua conta %(provider_name)s para iniciar sessão em\\n\"\n\"%(site_name)s. Para finalizar, por favor complete o seguinte formulário:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Ou use uma conta de terceiros\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Saiu de todas as outras sessões.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Iniciado em\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"Endereço IP\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Navegador\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Última visualização em\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Atual\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Sair de outras sessões\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Sessões de utilizador\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"chave da sessão\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Ligações da conta\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"A palavra-passe tem que ter um mínimo de {0} caracteres.\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Está a receber este email porque você, ou alguém, pediu uma palavra-passe \"\n#~ \"para a sua conta.\\n\"\n#~ \"No entanto não temos qualquer registo de um utilizador com o endereço de \"\n#~ \"email\\n\"\n#~ \"%(email)s na nossa base de dados.\\n\"\n#~ \"\\n\"\n#~ \"Este email pode ser ignorado em segurança se não fez tal pedido.\\n\"\n#~ \"\\n\"\n#~ \"Se foi você, pode criar uma conta usando a ligação abaixo.\"\n\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"O endereço de email seguinte está associado à sua conta:\"\n\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Alterar endereço de email\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Por favor, inicie a sessão com uma\\n\"\n#~ \"das suas contas externas. Ou então %(link)sinscreva-se</a>\\n\"\n#~ \"em %(site_name)s e inicie a sessão abaixo:\"\n\n#~ msgid \"or\"\n#~ msgstr \"ou\"\n\n#~ msgid \"\"\n#~ \"To safeguard the security of your account, please enter your password:\"\n#~ msgstr \"\"\n#~ \"Para salvaguardar a segurança da sua conta, insira a sua palavra-passe:\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Iniciar sessão com OpenID\"\n"
  },
  {
    "path": "allauth/locale/ro/LC_MESSAGES/django.po",
    "content": "# DJANGO-ALLAUTH.\n# Copyright (C) 2016\n# This file is distributed under the same license as the django-allauth package.\n#\n# Translators:\n# Steve Kossouho <steve.kossouho@yahoo.fr>, 2016.\n# Gilou <contact+dev@gilouweb.com>, 2019\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: django-allauthrr\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2024-04-20 21:34+0200\\n\"\n\"Last-Translator: Gilou <contact+dev@gilouweb.com>\\n\"\n\"Language-Team: \\n\"\n\"Language: ro_RO\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n==0 || (n!=1 && n%100>=1 && \"\n\"n%100<=19) ? 1 : 2);\\n\"\n\"X-Generator: Poedit 3.0\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Acest cont este in prezent inactiv.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Nu poți elimina adresa ta principală de e-mail.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Aceasta adresa de e-mail este deja asociata acestui cont.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Adresa de e-mail si / sau parola sunt incorecte.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Numărul de telefon și/sau parola specificate nu sunt corecte.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Un utilizator este deja inregistrat cu aceasta adresa de e-mail.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Te rugam tasteaza parola actuala.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Cod incorect.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Parolă incorectă.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Cheie invalidă sau expirată.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Autentificare invalidă.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Link-ul de resetare a parolei nu era valid.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Nu poti adauga mai mult de %d adrese de e-mail.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Un utilizator este deja înregistrat cu acest număr de telefon.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Prea multe incercări de conectare esuate. Incearca mai tarziu.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Adresa de e-mail nu este atribuită niciunui cont de utilizator.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Numărul de telefon nu este atribuit niciunui cont de utilizator.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"\"\n\"Adresa de e-mail trebuie mai intai confirmata inainte de a o seta ca adresa \"\n\"principala. Acceseaza link-ul din e-mailul de verificare.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"Numele de utilizator nu este disponibil. Te rugam alege alt nume de \"\n\"utilizator.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Numele de utilizator si / sau parola sunt incorecte.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Te rugăm selectează doar una.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Noua valoare trebuie să fie diferită de cea curentă.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Ai răbdare, trimiți prea multe cereri.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Folosește-ți parola\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Folosește aplicația de autentificare sau codul\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Folosește o cheie de securitate\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Adresa {email} a fost marcată ca verificată.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Nu s-a reușit marcarea adresei {email} ca verificată.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Marchează adresele de e-mail selectate ca verificate\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Conturi\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Adresa de e-mail\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Introdu un număr de telefon inclusiv codul de țară (de ex. +40 pentru \"\n\"România).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Trebuie sa tastezi aceeași parolă de fiecare data.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Parola\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Tine-ma minte\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Nume de utilizator\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Autentificare\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Nume de utilizator, e-mail sau telefon\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Nume de utilizator sau e-mail\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Nume de utilizator sau telefon\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-mail sau telefon\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Ai uitat parola?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-mail (confirma)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Confirmarea adresei de e-mail\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-mail (optional)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Nume de utilizator (opțional)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Trebuie sa tastezi aceeasi adresa de e-mail de fiecare data.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Parola (confirma)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Parola actuala\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Parola noua\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Parola noua (confirma)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Cod\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"utilizator\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"adresa de e-mail\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"verificata\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"principala\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"adrese de e-mail\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"creata\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"trimis\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"cheie\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"confirmare e-mail\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"confirmari e-mail\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Vizualizează-ți ID-ul de utilizator\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Vizualizează-ți adresa de e-mail\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Vizualizează-ți informațiile de bază ale profilului\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Acordă permisiuni\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Caracterele wildcard nu sunt permise decât dacă opțiunea 'Permite caractere \"\n\"wildcard în URI' este activată.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI-ul '{}' conține mai mult de un caracter wildcard (*). Este permis un \"\n\"singur wildcard per URI.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"\"\n\"Caracterele wildcard sunt permise doar în partea de hostname a URI-ului.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Cod de autorizare\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Cod de dispozitiv\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Acreditări client\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Token de reîmprospătare\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Confidențial\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Public\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Domeniul(-urile) pe care clientul are voie să le solicite. Furnizează o \"\n\"valoare per linie, de ex.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"În cazul în care clientul nu specifică niciun domeniu, se folosesc aceste \"\n\"domenii implicite. Furnizează o valoare per linie, de ex.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"O listă de tipuri de acordare permise. Furnizează o valoare per linie, de \"\n\"ex.: authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"O listă de origini permise pentru cereri cross-origin, una per linie.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Permite caractere wildcard (*) în URI-urile de redirecționare și originile \"\n\"CORS. Când este activat, URI-urile pot conține un singur asterisc pentru a \"\n\"potrivi subdomenii.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"O listă de tipuri de răspuns permise. Furnizează o valoare per linie, de \"\n\"ex.: code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"client\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"clienți\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Nu poți adăuga o adresă de e-mail la un cont protejat prin autentificarea cu \"\n\"doi factori.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Nu poți dezactiva autentificarea cu doi factori.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Nu poți genera coduri de recuperare fără a avea autentificarea cu doi \"\n\"factori activată.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Nu poți activa autentificarea cu doi factori până nu ți-ai verificat adresa \"\n\"de e-mail.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Cheie principală\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Cheie de rezervă\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Cheia nr. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Coduri de recuperare\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"Autentificator TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Cod de autentificare\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Fără parolă\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Activarea operării fără parolă îți permite să te conectezi folosind doar \"\n\"această cheie, dar impune cerințe suplimentare precum biometrie sau \"\n\"protecție PIN.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Există deja un cont cu această adresă de e-mail. Te rugăm să te conectezi \"\n\"mai întâi la acel cont, apoi să conectezi contul tău %s.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Token invalid.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Contul tau nu are o parola setata.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Contul tau nu are o adresa de e-mail confirmata.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Nu poți deconecta ultimul tău cont terț rămas.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Contul terț este deja conectat la un alt cont.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Retele de socializare\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"furnizor\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ID furnizor\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"nume\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"id client\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"ID-ul aplicatiei sau cheia consumatorului\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"cheie secreta\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API secret, client secret sau consumator secret\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Cheie\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"aplicatie sociala\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"aplicatii sociale\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"ultima logare\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"data inscrierii\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"date suplimentare\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"retea de socializare\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"retele de socializare\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) sau token de acces (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"token secret\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) token de reimprospatare (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"expira la\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"token pentru aplicatia de socializare\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"token-uri pentru aplicatiile de socializare\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Date de profil invalide\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Autentificare\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Anulează\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Raspuns invalid la obtinerea token-ului de solicitare de la \\\"%s\\\". \"\n\"Raspunsul a fost: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Raspuns invalid la obtinerea token-ului de acces de la \\\"% s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Nu s-a salvat niciun token de solicitare pentru \\\"% s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Nu s-a salvat niciun token de acces pentru \\\"% s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Nu exista acces la resurse private la \\\"% s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Raspuns invalid la obtinerea token-ului de solicitare de la \\\"% s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Cont inactiv\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Acest cont este inactiv.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Am trimis un cod la %(recipient)s. Codul expiră în curând, așa că te rugăm \"\n\"să-l introduci cât mai repede.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Confirma\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Solicită un cod nou\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Confirmă accesul\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Te rugăm să te reautentifici pentru a-ți proteja contul.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Opțiuni alternative\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Verificare e-mail\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Introdu codul de verificare a e-mailului\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Folosește o altă adresă de e-mail\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Conecteaza-te\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Introdu codul de conectare\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Reseteaza parola\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Introdu codul de resetare a parolei\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Verificare telefon\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Introdu codul de verificare a telefonului\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Folosește un alt număr de telefon\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Adrese de e-mail\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Urmatoarele adrese de e-mail sunt asociate contului tau:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Verificata\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Neverificata\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Principala\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Seteaza ca principala\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Retrimite e-mail verificare\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Elimina adresa\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Adauga adresa de e-mail\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Adauga e-mail\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Sigur doresti sa elimini aceasta adresa de e-mail?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Primești acest e-mail deoarece tu sau altcineva a încercat să înregistreze\\n\"\n\"un cont folosind adresa de e-mail:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Totuși, un cont cu această adresă de e-mail există deja. În cazul în care \"\n\"ai\\n\"\n\"uitat de acest lucru, te rugăm să folosești procedura de recuperare a \"\n\"parolei pentru\\n\"\n\"a-ți recupera contul:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Contul există deja\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Salutari de la %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Iti multumim ca folosesti %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Primești acest e-mail deoarece următoarea modificare a fost efectuată asupra \"\n\"contului tău:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Dacă nu recunoști această modificare, te rugăm să iei măsuri de securitate \"\n\"imediat. Modificarea contului tău provine de la:\\n\"\n\"\\n\"\n\"- Adresă IP: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Data: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"E-mailul tău a fost schimbat de la %(from_email)s la %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"E-mail schimbat\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"E-mailul tău a fost confirmat.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Confirmare e-mail\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Primești acest e-mail deoarece utilizatorul %(user_display)s a folosit \"\n\"adresa ta de e-mail pentru a înregistra un cont pe %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Codul tău de verificare a e-mailului este listat mai jos. Te rugăm să-l \"\n\"introduci în fereastra de browser deschisă.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Pentru a confirma că este corect, accesează %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Te rugam confirma adresa de e-mail\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"Adresa de e-mail %(deleted_email)s a fost eliminată din contul tău.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"E-mail eliminat\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Codul tău de conectare este listat mai jos. Te rugăm să-l introduci în \"\n\"fereastra de browser deschisă.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Acest e-mail poate fi ignorat în siguranță dacă nu ai inițiat această \"\n\"acțiune.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Cod de conectare\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Parola ta a fost schimbată.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Parolă schimbată\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Codul tău de resetare a parolei este listat mai jos. Te rugăm să-l introduci \"\n\"în fereastra de browser deschisă.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Cod de resetare a parolei\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Primești acest e-mail deoarece tu sau altcineva a solicitat o resetare de \"\n\"parolă pentru contul tău.\\n\"\n\"Dacă nu ai solicitat resetarea parolei, poți ignora acest e-mail în \"\n\"siguranță. Accesează linkul de mai jos pentru a-ți reseta parola.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"In cazul in care ai uitat, numele tau de utilizator este %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"E-mail pentru resetarea parolei\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Parola ta a fost resetată.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Parola ta a fost setată.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Parolă setată\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Primești acest e-mail deoarece tu sau altcineva a încercat să acceseze un \"\n\"cont cu e-mailul %(email)s. Totuși, nu avem nicio înregistrare a unui astfel \"\n\"de cont în baza noastră de date.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Dacă ai fost tu, te poți înregistra pentru un cont folosind linkul de mai \"\n\"jos.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Cont necunoscut\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Adresă de e-mail\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"E-mail curent\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Se schimbă la\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Adresa ta de e-mail este încă în așteptarea verificării.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Anulează schimbarea\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Schimbă la\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Schimbă e-mailul\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Confirma adresa de e-mail\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Te rugam confirma ca <a href=\\\"mailto:%(email)s\\\">%(email)s</a> este o \"\n\"adresa de e-mail a utilizatorului %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Nu se poate confirma %(email)s deoarece este deja confirmată de un alt cont.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Link-ul de confirmare a adresei de e-mail a expirat sau este invalid. Te \"\n\"rugam <a href=\\\"%(email_url)s\\\">solicita un nou link de confirmare</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Daca nu ai un cont inca, te rugam %(link)sinregistreaza-te%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Conectează-te cu o cheie de acces\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Trimite-mi un cod de conectare\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Deconecteaza-te\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Esti sigur(a) ca vrei sa te deconectezi?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"\"\n\"Nu poti elimina adresa de e-mail  (%(email)s). \\n\"\n\"Aceasta este setata ca adresa principala de e-mail.\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Confirma e-mailul trimis catre %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Ai confirmat %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Adresa de e-mail eliminata %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Esti conectat(a) ca %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Te-ai deconectat.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Un cod de conectare a fost trimis la %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Parola a fost schimbata cu success.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Parola a fost setata cu success.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Un cod de verificare a fost trimis la %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Ai verificat numărul de telefon %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Adresa principala de e-mail a fost setata.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Schimba parola\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Ai uitat parola?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Ți-ai uitat parola? Introdu adresa de e-mail mai jos și îți vom trimite un e-\"\n\"mail care îți va permite să o resetezi.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Reseteaza parola\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Te rugam contacteaza-ne daca intampini dificultati in resetarea parolei.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Ți-am trimis un e-mail. Dacă nu l-ai primit, verifică folderul de spam. \"\n\"Contactează-ne dacă nu îl primești în câteva minute.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Token invalid\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Link-ul de resetare a parolei este invalid, posibil din cauza ca a fost deja \"\n\"folosit. Te rugam solicita <a href=\\\"%(passwd_reset_url)s\\\">un nou link de \"\n\"resetare a parolei</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Parola ta a fost schimbata cu succes.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Seteaza parola\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Schimbă telefonul\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Telefon curent\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Numărul tău de telefon este încă în așteptarea verificării.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Schimbă telefonul\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Introdu parola ta:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Vei primi un cod special pentru conectare fără parolă.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Solicită cod\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Alte opțiuni de conectare\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Inregistrare\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Inregistreaza-te\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Ai deja un cont? Te rugam %(link)sconecteaza-te%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Înregistrează-te cu o cheie de acces\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Înregistrare cu cheie de acces\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Alte opțiuni\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Inregistrare blocata\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Ne pare rau, posibilitatea inregistrarii este momentan blocata.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Nota\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Ești deja conectat ca %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Avertizare:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"În prezent nu ai configurată nicio adresă de e-mail. Ar trebui să adaugi o \"\n\"adresă de e-mail pentru a primi notificări, a-ți reseta parola, etc.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Verifica-ti adresa de e-mail\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Ți-am trimis un e-mail pentru verificare. Accesează linkul furnizat pentru a \"\n\"finaliza procesul de înregistrare. Dacă nu vezi e-mailul de verificare în \"\n\"inbox, verifică folderul de spam. Te rugăm să ne contactezi dacă nu primești \"\n\"e-mailul de verificare în câteva minute.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Această secțiune a site-ului necesită verificarea faptului că\\n\"\n\"ești cine pretinzi a fi. În acest scop, îți cerem să\\n\"\n\"verifici proprietatea asupra adresei tale de e-mail. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Ți-am trimis un e-mail pentru\\n\"\n\"verificare. Te rugăm să accesezi linkul din e-mail. Dacă nu vezi e-mailul de \"\n\"verificare în inbox, verifică folderul de spam. Altfel\\n\"\n\"contactează-ne dacă nu îl primești în câteva minute.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Nota:</strong> poti in continuare <a href=\\\"%(email_url)s\\\">sa-ti \"\n\"schimbi adresa de e-mail</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Mesaje:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Meniu:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Conexiuni\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Autentificare cu doi factori\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sesiuni\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autorizează\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s dorește acces la contul tău %(site_name)s.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Introdu codul dispozitivului\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Introdu codul afișat pe dispozitivul tău.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Continuă\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Confirmă dispozitivul\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Te rugăm confirmă codul afișat pe %(client_name)s pentru a autoriza acest \"\n\"dispozitiv.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Refuză\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Dispozitiv autorizat\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Ai autorizat cu succes dispozitivul tău %(client_name)s.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Dispozitiv refuzat\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Autorizarea pentru dispozitivul tău %(client_name)s a fost refuzată.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Eroare\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Rămâi conectat\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Contul tău este protejat prin autentificarea cu doi factori. Te rugăm \"\n\"introdu un cod de autentificare:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Un nou set de coduri de recuperare pentru autentificarea cu doi factori a \"\n\"fost generat.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Coduri de recuperare noi generate\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Aplicația de autentificare a fost activată.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Aplicație de autentificare activată\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Aplicația de autentificare a fost dezactivată.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Aplicație de autentificare dezactivată\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"O nouă cheie de securitate a fost adăugată.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Cheie de securitate adăugată\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"O cheie de securitate a fost eliminată.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Cheie de securitate eliminată\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Aplicație de autentificare\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Autentificarea prin aplicație de autentificare este activă.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Nicio aplicație de autentificare nu este activă.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Dezactivează\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Activează\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Chei de securitate\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Ați adăugat %(count)s cheie de securitate.\"\nmsgstr[1] \"Ați adăugat %(count)s chei de securitate.\"\nmsgstr[2] \"Ați adăugat %(count)s de chei de securitate.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Nu au fost adăugate chei de securitate.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Administrează\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Adaugă\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Coduri de recuperare\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Este %(unused_count)s din %(total_count)s coduri de recuperare disponibil.\"\nmsgstr[1] \"\"\n\"Sunt %(unused_count)s din %(total_count)s coduri de recuperare disponibile.\"\nmsgstr[2] \"\"\n\"Sunt %(unused_count)s din %(total_count)s de coduri de recuperare \"\n\"disponibile.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Nu sunt configurate coduri de recuperare.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Vizualizează\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Descarcă\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Generează\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Un nou set de coduri de recuperare a fost generat.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Cheie de securitate adăugată.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Cheie de securitate eliminată.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Introdu un cod de autentificare:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\"Ești pe cale să generezi un nou set de coduri de recuperare pentru contul \"\n\"tău.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Această acțiune va invalida codurile tale existente.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Ești sigur(ă)?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Coduri neutilizate\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Descarcă coduri\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Generează coduri noi\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Activează aplicația de autentificare\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Pentru a-ți proteja contul cu autentificarea cu doi factori, scanează codul \"\n\"QR de mai jos cu aplicația ta de autentificare. Apoi, introdu codul de \"\n\"verificare generat de aplicație.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Secret autentificator\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Poți stoca acest secret și să-l folosești pentru a reinstala aplicația de \"\n\"autentificare ulterior.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Dezactivează aplicația de autentificare\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Ești pe cale să dezactivezi autentificarea prin aplicație de autentificare. \"\n\"Ești sigur(ă)?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Ai încredere în acest browser?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Dacă alegi să ai încredere în acest browser, nu ți se va cere un cod de \"\n\"verificare data viitoare când te conectezi.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Ai încredere pentru %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Nu am încredere\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Adaugă cheie de securitate\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Elimină cheie de securitate\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Ești sigur(ă) că vrei să elimini această cheie de securitate?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Utilizare\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Cheie de acces\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Cheie de securitate\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Această cheie nu indică dacă este o cheie de acces.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Nespecificat\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Adăugată pe %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Utilizată ultima dată %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Editează\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Editează cheie de securitate\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Salvează\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Creează cheie de acces\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Ești pe cale să creezi o cheie de acces pentru contul tău. Deoarece poți \"\n\"adăuga chei suplimentare ulterior, poți folosi un nume descriptiv pentru a \"\n\"le diferenția.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Creează\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Această funcționalitate necesită JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Autentificarea prin cont terț a eșuat\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"A apărut o eroare la încercarea de autentificare prin contul tău terț.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Te poți conecta la contul tău folosind oricare dintre următoarele conturi \"\n\"terțe:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"În prezent nu ai niciun cont terț conectat la acest cont.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Adaugă un cont terț\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Un cont terț de la %(provider)s a fost conectat la contul tău.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Cont terț conectat\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"Un cont terț de la %(provider)s a fost deconectat de la contul tău.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Cont terț deconectat\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Conectează %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Ești pe cale să conectezi un nou cont terț de la %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Conectează-te prin %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Ești pe cale să te conectezi folosind un cont terț de la %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Conectare anulata\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Ai decis sa anulezi procesul de conectare la contul tau. Daca ai anulat din \"\n\"greseala, te rugam acceseaza link-ul <a href=\\\"%(login_url)s\\\">conecteaza-te \"\n\"la contul tau</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Contul terț a fost conectat.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Contul terț a fost deconectat.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Esti pe cale de a folosi contul %(provider_name)s pentru a te conecta la\\n\"\n\"%(site_name)s. Pentru finalizarea procesului, te rugam completeaza urmatorul \"\n\"formular:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Sau folosește un cont terț\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Deconectat din toate celelalte sesiuni.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Începută la\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"Adresă IP\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Browser\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Ultima activitate\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Curent\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Deconectează celelalte sesiuni\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Sesiuni utilizator\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"cheie sesiune\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Conexiuni\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Parola trebuie să aibă minimum {0} caractere.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Ai primit acest e-mail pentru ca tu sau altcineva a solicitat o resetare \"\n#~ \"de parola.\\n\"\n#~ \"Daca nu ai fost tu cel care a solicitat resetarea parolei, te rugam sa \"\n#~ \"ignori acest e-mail.\\n\"\n#~ \"Pentru resetarea parolei acceseaza linkul de mai jos.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Urmatoarele adrese de e-mail sunt asociate contului tau:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Confirma adresa de e-mail\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Te rugam conecteaza-te cu unul\\n\"\n#~ \"din conturile de mai jos. Sau %(link)screeaza un cont</a>\\n\"\n#~ \"%(site_name)s si apoi conecteaza-te folosind formularul de mai jos:\"\n\n#~ msgid \"or\"\n#~ msgstr \"sau\"\n\n#~ msgid \"change password\"\n#~ msgstr \"schimba parola\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Conectare OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Aceasta adresa de e-mail este deja asociata altui cont.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Ti-am trimis un e-mail. Daca nu-l gasesti in \\\"inbox\\\", te rugam verifica \"\n#~ \"si folderul \\\"spam\\\".\\n\"\n#~ \"Te rugam contacteaza-ne daca nu-l primesti in cateva minute.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"L'identifiant ou le mot de passe sont incorrects.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"\"\n#~ \"Un pseudonyme ne peut contenir que des lettres, des chiffres, ainsi que \"\n#~ \"@/./+/-/_.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"Ce pseudonyme est déjà utilisé, merci d'en choisir un autre.\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"Vous avez confirmé que l'adresse e-mail de l'utilsateur %(user_display)s \"\n#~ \"est <a href=\\\"mailto:%(email)s\\\">%(email)s</a>.\"\n\n#~ msgid \"Thanks for using our site!\"\n#~ msgstr \"Merci d'utiliser notre site !\"\n"
  },
  {
    "path": "allauth/locale/ru/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-07-25 20:26+0200\\n\"\n\"Last-Translator: Anastasia Goryacheva <a.e.goryacheva@gmail.com>\\n\"\n\"Language-Team: Russian <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/ru/>\\n\"\n\"Language: ru\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && \"\n\"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || \"\n\"(n%100>=11 && n%100<=14)? 2 : 3);\\n\"\n\"X-Generator: Weblate 5.12-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Учетная запись неактивна.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Вы не можете удалить свой основной адрес электронной почты.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Этот адрес электронной почты уже связан с этой учетной записью.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Указанные вами адрес электронной почты и/или пароль неверны.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Номер телефона и/или пароль неверны.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Пользователь с таким адресом электронной почты уже зарегистрирован.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Пожалуйста, введите свой текущий пароль.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Неверный код.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Неверный пароль.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Недействительный или просроченный ключ.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Недействительный логин.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Код сброса пароля оказался недействительным.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Вы не можете добавить более %d адресов электронной почты.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Пользователь с таким номером телефона уже зарегистрирован.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"\"\n\"Слишком много неудачных попыток входа в систему. Повторите попытку позже.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Адрес электронной почты не закреплен ни за одной учетной записью.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Номер телефона не привязан ни к одной учетной записи пользователя.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Ваш основной адрес электронной почты должен быть подтвержден.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Такое имя пользователя не может быть использовано, выберите другое.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Имя пользователя и/или пароль неверны.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Пожалуйста, выберите только один вариант.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Новое значение должно отличаться от текущего.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Пожалуйста, подождите, вы отправляете слишком много запросов.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Используйте ваш пароль\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Используйте приложение-аутентификатор или код\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Используйте ключ безопасности\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Адрес {email} отмечен как подтверждённый.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Не удалось отметить {email} как подтверждённый.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Отметить выбранные адреса электронной почты как подтверждённые\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Аккаунты\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Адрес электронной почты\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Введите номер телефона, включая код страны (например, +7 для России или \"\n\"Казахстана).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Номер телефона\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Вы должны ввести одинаковый пароль дважды.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Пароль\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Запомнить меня\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Имя пользователя\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Войти\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Имя пользователя, электронная почта или номер телефона\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Имя пользователя или e-mail\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Имя пользователя или номер телефона\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Электронная почта или номер телефона\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Забыли свой пароль?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-mail (ещё раз)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Подтверждение адреса электронной почты\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-mail (опционально)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Имя пользователя (опционально)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Вы должны ввести одинаковый e-mail дважды.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Пароль (ещё раз)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Текущий пароль\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Новый пароль\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Новый пароль (ещё раз)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Код\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"пользователь\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"адрес электронной почты\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"подтвержден\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"основной\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"адреса электронной почты\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"создано\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"отправлено\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"ключ\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"подтверждение email адреса\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"подтверждения email адресов\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Безголовый\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Просмотреть ваш идентификатор пользователя\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Просмотреть ваш адрес электронной почты\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Просмотреть основную информацию вашего профиля\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Предоставить разрешения\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Подстановочные знаки (*) не разрешены, если не включена опция «Разрешить \"\n\"подстановочные знаки в URI».\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' содержит более одного подстановочного знака (*). Допускается только \"\n\"один подстановочный знак на URI.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Подстановочные знаки (*) допускаются только в части имени хоста URI.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Код авторизации\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Код устройства\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Учётные данные клиента\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Токен обновления\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Конфиденциальный\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Публичный\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Области (scopes), которые клиент имеет право запрашивать. Укажите одно \"\n\"значение на строку, например: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Если клиент не указал области действия, используются эти области по \"\n\"умолчанию. Укажите одно значение на строку, например: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Список разрешённых типов авторизации. Укажите одно значение на строку, \"\n\"например: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Список разрешённых источников для кросс-доменных запросов, по одному на \"\n\"строку.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Разрешить подстановочные знаки (*) в URI перенаправления и источниках CORS. \"\n\"При включении URI могут содержать одну звёздочку для совпадения с \"\n\"поддоменами.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Список разрешённых типов ответов. Укажите одно значение на строку, например: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"клиент\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"клиенты\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Вы не можете добавить адрес электронной почты в учетную запись, защищенную \"\n\"двухфакторной аутентификацией.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Вы не можете отключить двухфакторную аутентификацию.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Вы не можете генерировать коды восстановления, если не включена \"\n\"двухфакторная аутентификация.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Вы не сможете активировать двухфакторную аутентификацию, пока не подтвердите \"\n\"свой адрес электронной почты.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Основной ключ\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Запасной ключ\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Ключ №{number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"Многофакторная аутентификация (MFA)\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Коды восстановления\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"Аутентификатор TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"Ключ WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Код аутентификатора\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Без пароля\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Включение режима работы без пароля позволяет вам войти в систему, используя \"\n\"только этот ключ, но предъявляет дополнительные требования, такие как защита \"\n\"биометрией или PIN-кодом.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Учетная запись с таким адресом электронной почты уже существует.Пожалуйста, \"\n\"сначала войдите в эту учетную запись, а затем подключите %s.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Недействительный токен.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Для вашего аккаунта не установлен пароль.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"В вашей учетной записи нет подтвержденного адреса электронной почты.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"\"\n\"Вы не можете отключить свою последнюю оставшуюся стороннюю учетную запись.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"\"\n\"Учетная запись стороннего сервиса уже подключена к другой учетной записи.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Аккаунты в социальных сетях\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"провайдер\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"провайдер ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"имя\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"id клиента\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"ID приложения или ключ потребителя\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"секретный ключ\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"Секретный ключ API, клиента или потребителя\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Ключ\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"социальное приложение\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"социальные приложения\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"UID пользователя\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"дата последнего входа в систему\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"дата регистрации\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"дополнительные данные\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"аккаунт социальной сети\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"аккаунты социальных сетей\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"токен\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) или access token (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"секретный токен\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) или refresh token (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"истекает\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"токен социального приложения\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"токены социальных приложений\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Неверные данные профиля\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Вход\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Отмена\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"Неверный ответ во время получения запроса от \\\"%s\\\". Ответ был: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Неверный ответ при получении токена доступа от \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Нет сохраненного ключа запроса для \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Нет сохраненного ключа доступа для \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Доступ к ресурсам закрыт \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Неверный ответ во время получения запроса от \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Аккаунт неактивен\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Этот аккаунт неактивен.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Мы отправили код на адрес %(recipient)s. Срок действия кода скоро истечет, \"\n\"поэтому, пожалуйста, введите его как можно скорее.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Подтвердить\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Запросить новый код\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Подтвердите доступ\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"\"\n\"Пожалуйста, пройдите повторную аутентификацию, чтобы обезопасить свою \"\n\"учетную запись.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Альтернативные варианты\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Подтверждение электронной почты\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Введите код подтверждения электронной почты\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Использовать другой адрес электронной почты\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Войти\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Введите код для входа в систему\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Сброс пароля\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Введите код для сброса пароля\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Подтверждение номера телефона\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Введите код подтверждения номера телефона\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Использовать другой номер телефона\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Адреса электронной почты\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"С вашей учетной записью связаны следующие адреса электронной почты:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Подтвержден\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Не подтвержден\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Основной\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Сделать основным\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Отправить подтверждение ещё раз\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Удалить\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Добавить адрес электронной почты\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Добавить E-mail\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Вы действительно хотите удалить выбранный адрес электронной почты?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Вы получили это письмо, потому что вы или кто-то другой пытались \"\n\"зарегистрировать учетную запись,\\n\"\n\"используя адрес электронной почты:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Однако учетная запись с таким адресом электронной почты уже существует.\\n\"\n\"В случае, если вы забыли об этом, воспользуйтесь процедурой \\\"Забыли \"\n\"пароль\\\",\\n\"\n\"чтобы восстановить свою учетную запись:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Учетная запись уже существует\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Вас приветствует %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Благодарим вас за использование сайта «%(site_name)s!»\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Вы получили это письмо, потому что в вашей учетной записи были сделаны \"\n\"следующие изменения:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Если вы не заметили этого изменения, пожалуйста, немедленно примите \"\n\"надлежащие меры безопасности. Изменения в вашей учетной записи произошли с:\\n\"\n\"\\n\"\n\"- IP-адреса: %(ip)s\\n\"\n\"- Браузера: %(user_agent)s\\n\"\n\"- Дата: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"\"\n\"Ваш адрес электронной почты был изменен с %(from_email)s на %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Электронная почта изменена\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Ваш адрес электронной почты был подтвержден.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Подтверждение по электронной почте\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Вы получили это письмо, потому что пользователь %(user_display)s указал ваш \"\n\"адрес электронной почты для регистрации учетной записи на сайте \"\n\"%(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Ваш регистрационный код указан ниже. Пожалуйста, введите его в открытом окне \"\n\"вашего браузера.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Для подтверждения перейдите на %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Пожалуйста, подтвердите Ваш адрес электронной почты\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"\"\n\"Адрес электронной почты %(deleted_email)s был удалён из вашей учётной записи.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Email удалён\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Ваш регистрационный код указан ниже. Пожалуйста, введите его в открытом окне \"\n\"вашего браузера.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Это письмо можно спокойно проигнорировать, если вы не инициировали это \"\n\"действие.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Код для входа\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Ваш пароль изменён.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Пароль Изменён\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Ваш код для сброса пароля указан ниже. Пожалуйста, введите его в открытом \"\n\"окне вашего браузера.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Код для сброса пароля\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Вы получили это письмо, потому что вы или кто-то другой запросили сброс \"\n\"пароля для вашей учетной записи.\\n\"\n\"Если это были не вы, просто проигнорируйте это письмо. Нажмите на ссылку \"\n\"ниже, чтобы сбросить пароль.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Если вы вдруг забыли, ваше имя пользователя: %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Письмо для сброса пароля\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Ваш пароль был сброшен.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Ваш пароль был установлен.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Пароль Установлен\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Вы получили это электронное письмо, потому что вы или кто-то другой пытался \"\n\"получить доступ к учетной записи с помощью электронной почты %(email)s. \"\n\"Однако в нашей базе данных нет никаких записей о такой учетной записи.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Если это были вы, вы можете зарегистрировать учетную запись, перейдя по \"\n\"ссылке ниже.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Неизвестный аккаунт\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Адрес электронной почты\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Текущий e-mail\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Изменить на\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Ваш адрес электронной почты ожидает подтверждения.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Отменить изменения\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Изменить на\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Изменить E-mail\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Подтвердите адрес электронной почты\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Пожалуйста, подтвердите <a href=\\\"mailto:%(email)s\\\">%(email)s</a> для \"\n\"пользователя %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Невозможно подтвердить %(email)s, потому что он уже прикреплен к другой \"\n\"учетной записи.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Ссылка некорректна или срок её действия истек. Пожалуйста, <a \"\n\"href=\\\"%(email_url)s\\\">отправьте новый запрос на подтверждение электронной \"\n\"почты</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Если у вас ещё нет учётной записи, пожалуйста, сначала \"\n\"%(link)sзарегистрируйтесь%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Войти с ключом доступа\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Пришлите мне код для входа\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Выйти\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Вы уверены, что хотите выйти?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"\"\n\"Вы не можете удалить свой основной адрес электронной почты (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Подтверждающее письмо отправлено на %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Адрес %(email)s подтверждён.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Удален адрес электронной почты %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Успешный вход под именем %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Вы вышли.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"\"\n\"Код для входа был отправлен по электронной почте на адрес %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Пароль успешно изменён.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Пароль успешно установлен.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Код подтверждения был отправлен на %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Вы только что подтвердили номер телефона %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Установлен основной адрес электронной почты.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Изменить пароль\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Забыли пароль?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Забыли свой пароль? Введите Ваш адрес электронной почты ниже, и мы отправим \"\n\"Вам письмо, чтобы вы могли его сбросить.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Сбросить мой пароль\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"Свяжитесь с нами, если у вас возникли сложности со сменой пароля.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Мы отправили вам письмо. Если вы его не получили, проверьте папку \\\"Спам\\\". \"\n\"Свяжитесь с нами, если вы не получили письмо в течение нескольких минут.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Неправильный ключ\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Ссылка на сброс пароля неверна, вероятно, она уже была использована. Для \"\n\"нового сброса пароля <a href=\\\"%(passwd_reset_url)s\\\">перейдите по ссылке</\"\n\"a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Ваш пароль изменён.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Установить пароль\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Изменить номер телефона\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Текущий номер телефона\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Ваш номер телефона по-прежнему ожидает подтверждения.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Изменить номер телефона\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Введите пароль:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Вы получите специальный код для входа в систему без пароля.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Код запроса\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Другие варианты входа\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Регистрация\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Зарегистрируйтесь\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Уже зарегистрированы? %(link)sВойдите%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Зарегистрироваться, используя ключ доступа\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Регистрация с ключом доступа\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Другие варианты\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Регистрация закрыта\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Мы сожалеем, но в текущий момент регистрация закрыта.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Заметка\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Вы уже вошли как %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Внимание:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Сейчас у вас нет прикрепленного адрес электронной почты. Рекомендуем \"\n\"добавить, чтобы иметь возможность получать уведомления, сбрасывать пароль и \"\n\"и т.д.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Подтвердите Ваш адрес электронной почты\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Мы отправили вам письмо с подтверждением. Перейдите по указанной ссылке, \"\n\"чтобы завершить процесс регистрации. Если вы не видите письмо с \"\n\"подтверждением в вашем основном почтовом ящике, проверьте папку \"\n\"\\\"Спам\\\".Пожалуйста, свяжитесь с нами, если вы не получите письмо с \"\n\"подтверждением в течение нескольких минут.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Эта часть сайта требует от нас подтверждения того, что\\n\"\n\"вы являетесь тем, за кого себя выдаете. Для этого нам необходимо\\n\"\n\"подтвердить собственность вашего адреса электронной почты. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Мы отправили вам письмо\\n\"\n\"для проверки. Пожалуйста, перейдите по ссылке. Если вы не видите письмо с \"\n\"подтверждением в вашем основном почтовом ящике, проверьте папку \\\"Спам\\\".\\n\"\n\"В противном случае свяжитесь с нами, если вы не получите его в течение \"\n\"нескольких минут.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Заметка:</strong> вы можете <a href=\\\"%(email_url)s\\\">изменить свой \"\n\"адрес электронной почты</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Сообщения:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Меню:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Прикрепленные аккаунты\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Двухфакторная аутентификация\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Сеансы\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Авторизовать\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"\"\n\"%(client_name)s хочет получить доступ к вашей учётной записи %(site_name)s.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Введите код устройства\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Введите код, отображаемый на вашем устройстве.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Продолжить\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Подтвердить устройство\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Пожалуйста, подтвердите код, показанный на вашем %(client_name)s, чтобы \"\n\"авторизовать это устройство.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Отклонить\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Устройство авторизовано\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Вы успешно авторизовали ваше устройство %(client_name)s.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Устройство отклонено\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Авторизация для вашего устройства %(client_name)s была отклонена.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Ошибка\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Оставаться в системе\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Ваша учетная запись защищена двухфакторной аутентификацией. Пожалуйста, \"\n\"введите код аутентификатора:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Сгенерирован новый набор кодов восстановления двухфакторной аутентификации.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Сгенерированы Новые Коды Восстановления\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Активировано приложение Аутентификатор.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Активировано приложение для проверки подлинности\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Приложение Аутентификатор деактивировано.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Приложение для проверки подлинности отключено\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Был создан новый ключ доступа.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Создан ключ доступа\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Ключ доступа был удален.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Ключ доступа удален\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Приложение аутентификатор\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Аутентификация с помощью приложения-аутентификатора активна.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Приложение аутентификатора неактивно.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Деактивировать\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Активировать\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Ключи доступа\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Вы создали %(count)s ключ доступа.\"\nmsgstr[1] \"Вы создали %(count)s клюей доступа.\"\nmsgstr[2] \"Вы создали %(count)s ключей доступа.\"\nmsgstr[3] \"Вы создали %(count)s ключ доступа.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Ключи доступа ещё не были созданы.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Управлять\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Добавить\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Коды восстановления\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"Доступно %(unused_count)s из %(total_count)s кодов восстановления.\"\nmsgstr[1] \"Доступнен %(unused_count)s из %(total_count)s кодов восстановления.\"\nmsgstr[2] \"Доступны %(unused_count)s из %(total_count)s кодов восстановления.\"\nmsgstr[3] \"Доступны %(unused_count)s из %(total_count)s кодов восстановления.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Коды восстановления не установлены.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Посмотреть\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Скачать\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Генерировать\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Был создан новый набор кодов восстановления.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Ключ доступа создан.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Ключ доступа удален.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Введите код аутентификатора:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\"Вы собираетесь сгенерировать новый набор кодов восстановления для вашей \"\n\"учетной записи.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Это действие аннулирует существующие коды.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Вы уверены?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Неиспользуемые коды\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Скачать коды\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Генерировать новые коды\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Активировать приложение Аутентификатор\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Чтобы защитить свою учетную запись с помощью двухфакторной аутентификации, \"\n\"отсканируйте приведенный ниже QR-код с помощью приложения-аутентификатора. \"\n\"Затем введите проверочный код, сгенерированный приложением ниже.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Код аутентификатора\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Вы можете сохранить этот секрет ключ и использовать его для повторной \"\n\"установки приложения аутентификатора в будущем.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Отключите приложение Аутентификатор\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Вы собираетесь отключить аутентификацию с использованием приложения \"\n\"Аутентификатор. Вы уверены?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Доверять этому браузеру?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Если вы решите доверять этому браузеру, у вас не будут запрашивать \"\n\"проверочный код при следующем входе в систему.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Доверять в течение %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Не доверять\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Создать ключ доступа\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Удалить ключ доступа\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Вы уверены, что хотите удалить этот ключ доступа?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Использование\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Ключ доступа (passkey)\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Ключ безопасности (Security key)\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Этот ключ не указывает, является ли он паролем доступа.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Не указано\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Добавлено %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Последний раз использовалось %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Редактировать\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Редактировать ключ безопасности\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Сохранить\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Создать ключ доступа (passkey)\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Вы собираетесь создать ключ доступа (passkey) для своей учётной записи. \"\n\"Поскольку вы сможете добавить дополнительные ключи позже, рекомендуется \"\n\"использовать описательное название, чтобы различать их.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Создать\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Для этой функции требуется JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Ошибка входа через внешний сервис\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"При попытке войти через учетную запись стороннего сервиса произошла ошибка.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"Вы можете авторизоваться, используя следующие сервисы:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"\"\n\"В настоящее время у вас нет учетных записей сторонних сервисов, связанных с \"\n\"этой учетной записью.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Добавить внешний аккаунт\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"\"\n\"К вашей учетной записи была подключена сторонняя учетная запись от \"\n\"%(provider)s.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Подключена учетная запись стороннего сервиса\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"Сторонняя учетная запись от %(provider)s была отключена от вашей учетной \"\n\"записи.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Учетная запись стороннего сервиса отключена\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Соединение с %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Вы собираетесь подключить новый сторонний аккаунт из %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Вход через %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Вы собираетесь войти, используя стороннюю учетную запись из %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Авторизация отменена\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Вы прервали авторизацию, используя один из ваших аккаунтов. Если это было \"\n\"ошибкой, перейдите к <a href=\\\"%(login_url)s\\\">авторизации</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Учетная запись стороннего сервиса подключена.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Сторонняя учетная запись была отключена.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Вы используете %(provider_name)s для авторизации на \\n\"\n\"%(site_name)s. Чтобы завершить, заполните следующую форму:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Или использовать сторонний\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Выйти из всех остальных сеансов.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Начато в\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP-адрес\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Браузер\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Последний вход в\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Текущий\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Выйти из других сеансов\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Сеансы пользователей\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"ключ сеанса\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Прикрепленные аккаунты\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Минимальное количество символов в пароле: {0}.\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Вы получили это письмо, потому что вы или кто-то другой запросили сброс \"\n#~ \"пароля для вашей учетной записи.Однако нашей базе данных ничего не \"\n#~ \"известно о пользователес электронной почтой %(email)s.\\n\"\n#~ \"\\n\"\n#~ \"Если это были не вы, просто проигнорируйте это письмо.\\n\"\n#~ \"Если же это всё-таки были вы, вы можете зарегистрировать аккаунт по \"\n#~ \"ссылке ниже.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Следующие e-mail адреса прикреплены к вашему аккаунту:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Подтвердите e-mail адрес.\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Пожалуйста, войдите с одним\\n\"\n#~ \"из ваших внешних аккаунтов. Или <a \"\n#~ \"href=\\\"%(signup_url)s\\\">зарегистрируйтесь</a>\\n\"\n#~ \"и авторизуйтесь на сайте %(site_name)s:\"\n\n#~ msgid \"or\"\n#~ msgstr \"или\"\n\n#~ msgid \"change password\"\n#~ msgstr \"изменить пароль\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Войти с OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Указанный e-mail прикреплен к другому пользователю.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Мы отправили вам письмо. Пожалуйста, свяжитесь с нами, если не получили \"\n#~ \"его в течение нескольких минут.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"Логин и/или пароль не верны.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"Имя пользователя может включать буквы, цифры и @/./+/-/_.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"\"\n#~ \"Такое имя пользователя уже используется на сайте. Пожалуйста выберите \"\n#~ \"другое.\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"Вы подтвердили адрес <a href=\\\"mailto:%(email)s\\\">%(email)s</a> для \"\n#~ \"пользователя %(user_display)s.\"\n\n#~ msgid \"Thanks for using our site!\"\n#~ msgstr \"Спасибо за использование нашего сайта!\"\n\n#~ msgid \"Confirmation email sent to %(email)s\"\n#~ msgstr \"Подтверждение выслано на %(email)s\"\n\n#~ msgid \"Delete Password\"\n#~ msgstr \"Удалить пароль\"\n\n#~ msgid \"\"\n#~ \"You may delete your password since you are currently logged in using \"\n#~ \"OpenID.\"\n#~ msgstr \"Вы можете удалить свой пароль, при использовании OpenID.\"\n\n#~ msgid \"delete my password\"\n#~ msgstr \"удалите мой пароль\"\n\n#~ msgid \"Password Deleted\"\n#~ msgstr \"Пароль удалён\"\n"
  },
  {
    "path": "allauth/locale/sk/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-07-25 20:26+0200\\n\"\n\"Last-Translator: Adam Zahradník <adam@zahradnik.xyz>\\n\"\n\"Language-Team: Slovak <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/sk/>\\n\"\n\"Language: sk\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n \"\n\">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\\n\"\n\"X-Generator: Weblate 5.13-dev\\n\"\n\"X-Translated-Using: django-rosetta 0.9.9\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Tento účet nie je momentálne aktívny.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Primárna e-mailová adresa sa nedá odstrániť.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Táto e-mailová adresa je už spojená s týmto účtom.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Uvedený e-mail alebo heslo nie je správne.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Uvedené telefónne číslo alebo heslo nie je správne.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Používateľ s touto e-mailovou adresou už existuje.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Prosím, napíšte svoje súčasné heslo.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Nesprávny kód.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Nesprávne heslo.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Neplatný kľúč.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Neplatné prihlásenie.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Token na obnovu hesla bol nesprávny.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Nemôžte pridať viac než %d e-mailových adries.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Používateľ s týmto telefónnym číslom už existuje.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Príliš veľa neúspešných pokusov o prihlásenie. Skúste to znova neskôr.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"\"\n\"Táto e-mailová adresa nie je pridelená k žiadnemu používateľskému kontu.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"\"\n\"Toto telefónne číslo nie je pridelené k žiadnemu používateľskému kontu.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Primárna e-mailová adresa musí byť overená.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Používateľské meno nemôže byť použité. Použite prosím iné meno.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Uvedené používateľské meno alebo heslo nie je správne.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Prosím, zvoľte iba jednu možnosť.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Nová hodnota sa musí líšiť od aktuálnej hodnoty.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Buďte trpezliví, posielate príliš veľa požiadaviek.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Pokračovať s heslom\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Pokračovať s autentifikačnou aplikáciou alebo kódom\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Pokračovať s bezpečnostným kľučom\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"E-mail {email} bol overený.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Nepodarilo sa overiť e-mail {email}.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Označiť vybrané adresy ako overené\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Účty\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"E-mailová adresa\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Zadajte telefónne číslo vrátane predvoľby (t.j. s +421).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefón\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Heslá sa nezhodujú.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Heslo\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Zapamätať si ma\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Používateľské meno\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Požívateľské meno, e-mail alebo telefónne číslo\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Používateľské meno alebo e-mail\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Používateľské meno alebo telefónne číslo\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-mail alebo telefónne číslo\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Zabudnuté heslo?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-mail (znova)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Potvrdenie e-mailu\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-mail (nepovinné)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Používateľské meno (nepovinné)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"E-maily sa nezhodujú.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Heslo (znovu)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Súčasné heslo\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Nové heslo\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Nové heslo (znovu)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kód\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"používateľ\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"e-mailová adresa\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"overený\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"primárny\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"e-mailové adresy\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"vytvorený\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"odoslané\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"kľúč\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"potvrdenie e-mailu\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"potvrdenia e-mailu\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Aplikácia bez rozhrania (headless)\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Zobraziť identifikátor používateľa\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Zobraziť e-mailovú adresu\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Zobraziť základné osobné údaje\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Povolené oprávnenia\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Zástupné znaky nie sú povolené, pokiaľ nie je zapnutá možnosť 'Povoliť \"\n\"zástupné znaky v URI'.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' obsahuje viac ako jeden zástupný znak (*). Na jednu URI je povolený \"\n\"iba jeden zástupný znak.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Zástupné znaky sú povolené iba v časti s názvom hostiteľa v URI.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Autorizačný kód\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Kód zariadenia\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Prihlasovacie údaje klienta\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Obnovovací token\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Dôverný klient\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Verejný klient\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Oprávnenia, ktoré bude mať klient k dispozícií. Uveďte jednu hodnotu na \"\n\"riadok, napr.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Ak si klient nevyžiada žiadne oprávnenia, použijú sa tieto predvolené \"\n\"oprávnenia. Uveďte jednu hodnotu na riadok, napr.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Zoznam povolených autorizačných tokov. Uveďte jeden na riadok, napr.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"Povolené domény pre prichádzajúce požiadavky, jedna na riadok.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Povoliť zástupné znaky (*) v presmerovacích URI a CORS pôvodoch. Keď je táto \"\n\"možnosť zapnutá, URI môžu obsahovať jednu hviezdičku na zhodu subdomén.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Zoznam povolených typov odpovedí. Uveďte jednu hodnotu na riadok, napr.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"klient\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"klienti\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Nemôžete si pridať ďalšiu e-mailovú adresu do účtu s dvojfaktorovou \"\n\"autentifikáciou.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Nemôžete si deaktivovať dvojfaktorovú autentifikáciu.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Nemôžete si vygenerovať záložné kódy bez aktívnej dvojfaktorovej \"\n\"autentifikácie.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Nemôžete si aktivovať dvojfaktorovú autentifikáciu pokiaľ nemáte overenú \"\n\"svoju adresu.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Hlavný kľúč\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Záložný kľúč\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Kľúč č. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Záložné kódy\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP autentifikátor\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Kód z autentifikátora\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Prihlásenie bez hesla\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Aktivácia prihlásenia bez hesla vám dovolí prihlásiť sa len pomocou tohto \"\n\"kľúča, ale vyžaduje dodatočné požiadavky ako napríklad PIN alebo biometriu.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Účet s touto e-mailovou adresou už existuje. Prosím, prihláste sa najprv pod \"\n\"daným účtom a potom pripojte svoj %s účet.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Neplatný token.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Váš účet nemá nastavené heslo.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Váš účet nemá overenú e-mailovú adresu.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Nemôžete odstrániť posledný externý účet.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Tento externý účet je už používa iný používateľ.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Účty na sociálnych sieťach\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"poskytovateľ\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ID poskytovateľa\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"meno\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"identifikátor klienta\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"ID aplikácie alebo zákaznícky kľúč\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"tajný kľúč\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"Kľúč API, klienta alebo zákazníka\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Kľúč\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"sociálna aplikácia\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"sociálne aplikácie\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"posledné prihlásenie\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"dátum pripojenia\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"ďalšie údaje\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"sociálny účet\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"sociálne účty\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) alebo prístupvý token (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"heslo prístupového tokenu\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) alebo token obnovenia (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"expiruje\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"token sociálnej aplikácie\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"tokeny sociálnej aplikácie\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Nesprávne profilové údaje\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Prihlásiť sa\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Zrušiť\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"Neplatná odpoveď pri získavaní request tokenu z \\\"%s\\\". Odpoveď: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Neplatná odpoveď pri získavaní prístupového tokenu z \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Žiadna uložená požiadavka tokenu pre \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Žiadny uložený prístupový token pre \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Žiadny prístup do privátneho úložiska na \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Neplatná odpoveď pri získavaní request tokenu z \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Účet neaktívny\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Tento účet je neaktívny.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Odoslali sme overovací kód na e-mail %(recipient)s. Platnosť tohto kódu \"\n\"čoskoro vyprší, zadajte ho čo najskôr.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Potvrdiť\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Vyžiadať nový kód\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Potvrdiť prístup\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Znova sa overte, aby ste ochránili svoj účet.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Alternatívne možnosti\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Overenie e-mailovej adresy\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Zadajte kód na overenie e-mailovej adresy\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Použite inú e-mailovú adresu\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Prihlásiť sa\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Zadanie prihlasovacieho kódu\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Obnoviť heslo\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Zadanie kódu na obnovu hesla\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Overenie telefónneho čísla\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Zadanie kódu na overenie telefónneho čísla\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Použite iné telefónne číslo\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"E-mailová adresa\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Nasledujúce e-mailové adresy sú prepojené s vašim účtom:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Overený\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Neoverený\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Primárny\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Označiť ako primárny\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Opätovne zaslať overenie\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Odstrániť\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Pridať e-mailovú adresu\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Pridať e-mail\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Naozaj chcete odstrániť vybranú e-mailovú adresu?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Tento e-mail ste dostali, pretože ste sa vy, alebo niekto iný\\n\"\n\"pokúšali vytvoriť účet pre e-mailovu adresu:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Účet s touto e-mailovou adresou už však existuje.  V prípade,\\n\"\n\"že ste na svoju registráciu zabudli, použite prosím funkciu obnovy\\n\"\n\"hesla vášho účtu:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Účet už existuje\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Dobrý deň z %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Ďakujeme za využitie %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"Tento e-mail dostávate kvôli nasledujúcim zmenám vo vašom účte:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Ak ste tieto zmeny nevykonali vy, prosím okamžite prijmite náležité \"\n\"bezpečnostné opatrenia. Zmeny vo vašom účte pochádzajú z:\\n\"\n\"\\n\"\n\"- IP adresa: %(ip)s\\n\"\n\"- Prehliadač: %(user_agent)s\\n\"\n\"- Dátum: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Vaša e-mailová adresa bola zmenená z %(from_email)s na %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"E-mailová adresa zmenená\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Vaša e-mailová adresa bola overená.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Overenie e-mailovej adresy\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Tento e-mail dostávate, pretože používateľ %(user_display)s zadal vašu \"\n\"emailovú adresu pri registrácii účtu na %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Váš kód na overenie e-mailovej adresy je uvedený nižšie. Prosím, zadajte ho \"\n\"do otvoreného okna vo vašom prehliadači.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Pre overenie správnosti navštívte %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Potvrďte prosím svoju e-mailovú adresu\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"E-mailová adresa %(deleted_email)s bola odstránená z vášho účtu.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"E-mailová adresa odstránená\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Váš prihlasovací kód je uvedený nižšie. Prosím, zadajte ho do otvoreného \"\n\"okna vo vašom prehliadači.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Tento e-mail môžete kľudne ignorovať, ak ste si nevyžiadali túto akciu.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Prihlasovací kód\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Vaše heslo bolo zmenené.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Heslo zmenené\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Váš kód na obnovu hesla je uvedený nižšie. Prosím, zadajte ho do otvoreného \"\n\"okna vo vašom prehliadači.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Kód na obnovu hesla\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Tento e-mail ste dostali, pretože niekto požiadal o heslo k vášmu \"\n\"používateľskému účtu.\\n\"\n\"Ak ste to neboli vy, túto správu môžete pokojne ignorovať. Kliknutím na \"\n\"odkaz nižšie obnovíte svoje heslo.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Ak ste náhodou zabudli, vaše používateľské meno je %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"E-mail pre obnovu hesla\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Vaše heslo bolo obnovené.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Vaše heslo bolo nastavené.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Heslo nastavené\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Tento e-mail dostávate, pretože ste sa vy, alebo niekto iný pokúsili \"\n\"pristúpiť k účtu s e-mailovou adresou %(email)s. Avšak, neevidujeme žiaden \"\n\"účet s danou adresou v našom systéme.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Ak ste to boli vy, môžete si zaregistrovať nový účet navštívením linku \"\n\"nižšie.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Neznámy účet\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"E-mailová adresa\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Súčasná e-mailová adresa\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Zmeniť na\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Vaša e-mailová adresa stále čaká na overenie.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Zrušiť zmenu\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Zmeniť na\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Zmeniť e-mail\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Potvrdiť e-mailovú adresu\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Prosím potvrďte, že <a href=\\\"mailto:%(email)s\\\">%(email)s</a> je e-mailová \"\n\"adresa pre používateľa %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"Nemožno potvrdiť %(email)s, pretože už je potvrdený iným používateľom.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Odkaz na potvrdenie e-mailu je neplatný alebo vypršal. <a \"\n\"href=\\\"%(email_url)s\\\">Zaslať novú žiadosť o overovací e-mail</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Ak ešte nemáte vytvorený účet, tak sa prosím najprv \"\n\"%(link)szaregistrujte%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Prihlásiť sa prístupovým kľúčom\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Poslať prihlasovací kód\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Odhlásiť\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Naozaj sa chcete odhlásiť?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Primárna e-mailová adresa sa nedá odstrániť (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Overovací e-mail poslaný na %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Adresa %(email)s potvrdená.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"E-mailová adresa %(email)s bola úspešne odstránená.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Úspešne ste sa prihlásili ako %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Odhlásili ste sa.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Prihlasovací kód bol odoslaný na %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Zmena hesla prebehla úspešne.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \")Nastavenie hesla bolo úspešné.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Overovací kód bol odoslaný na %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Telefónne číslo %(phone)s bolo overené.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Primárna e-mailová adresa bola úspešne zadaná.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Zmeniť heslo\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Zabudnuté heslo?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Zabudli ste heslo? Vložte nižšie svoju e-mailovú adresu a čoskoro vám \"\n\"pošleme e-mail na obnovenie hesla.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Obnoviť moje heslo\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Prosím, kontaktujte nás, ak máte nejaký problém s obnovením svojho hesla.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Poslali sme vám e-mail. Ak ste ho nedostali, skontrolujte si priečinok \"\n\"nevyžiadanej pošty. Ak ho v priebehu pár minút neobdržíte, kontaktujte nás.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Zlý token\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Odkaz na obnovu hesla je neplatný, pravdepodobne už bol použitý. Vyžiadajte \"\n\"si <a href=\\\"%(passwd_reset_url)s\\\">nové obnovenie hesla</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Vaše heslo bolo zmenené.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Nastaviť heslo\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Zmeniť telefónne číslo\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Aktuálne telefónne číslo\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Vaše telefónne číslo stále čaká na overenie.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Zmeniť telefónne číslo\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Zadajte svoje heslo:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Obdržíte špeciálny kód, ktorý použijete na prihlásenie.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Vyžiadať kód\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Iné možnosti prihlásenia\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Registrácia\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Zaregistrovať\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Už ste sa zaregistrovali? Môžete sa %(link)sprihlásiť%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Zaregistrovať sa prístupovým kľúčom\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Registrácia pomocou prístupového kľúča\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Ďalšie možnosti\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Registrácia uzavretá\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Ospravedlňujeme sa, ale registrácia je momentálne uzavretá.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Poznámka\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Už ste prihlásený/á ako %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Varovanie:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Momentálne nemáte nastavený žiaden e-mail. Pridajte si e-mailovú adresu, aby \"\n\"ste mohli dostávať oznámenia, obnoviť zabudnuté heslo, atď.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Potvrďte e-mailovú adresu\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Poslali sme vám overovací e-mail. Kliknutím na uvedený odkaz dokončite \"\n\"proces registrácie. Ak ste ho nedostali, skontrolujte si priečinok so \"\n\"spamom. V prípade, že do niekoľkých minút nedostanete overovací e-mail, \"\n\"kontaktujte nás.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Na prezeranie nasledujúceho obsahu je potrebné overenie vašej e-mailovej \"\n\"adresy. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Poslali sme vám overovací e-mail. Kliknite prosím na odkaz v e-maili. Ak ste \"\n\"email neobdržali, skontrolujte priečinok nevyžiadanej pošty. V prípade, že \"\n\"ho do niekoľkých minút nedostanete, kontaktujte nás.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Poznámka:</strong> stále môžete <a href=\\\"%(email_url)s\\\">zmeniť \"\n\"svoju e-mailovú adresu</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Správy:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menu:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Pripojenia účtu\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Dvojfaktorová autentifikácia\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Relácie\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Autorizovať\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s žiada prístup do vášho %(site_name)s účtu.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Zadanie kódu zo zariadenia\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Zadajte kód zobrazený na vašom zariadení.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Pokračovať\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Potvrdiť zariadenie\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Prosím, skontrolujte kód zobrazený na vašom %(client_name)s na autorizáciu \"\n\"tohto zariadenia.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Odmietnuť\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Zariadenie bolo autorizované\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Úspešne ste autorizovali vaše zariadenie %(client_name)s.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Zariadenie zamietnuté\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Autorizácia vášho zariadenia %(client_name)s bola odmietnutá.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Chyba\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Zostať prihlásený\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Váš účet je chránený dvojfaktorovu autentifikáciou. Prosím zadajte kód z \"\n\"autentifikátora:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"Boli vygenerované nové záložné kódy pre dvojfaktorovú autentifikáciu.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Nové záložné kódy\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Autentifikačná aplikácia aktivovaná.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Aktivácia autentifikačnej aplikácie\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Autentifikačná aplikácia deaktivovaná.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Deaktivácia autentifikačnej aplikácie\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Bol pridaný nový bezpečnostný kľúč.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Pridaný bezpečnostný kľúč\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Bezpečnostný kľúč bol odstránený.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Odstránený bezpečnostný kľúč\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Autentifikačná aplikácia\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Autentifikácia pomocou aplikácie je aktívna.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Autentifikačná aplikácia je neaktívna.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Deaktivovať\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktivovať\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Bezpečnostné kľúče\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Pridali ste si %(count)s bezpečnostný kľúč.\"\nmsgstr[1] \"Pridali ste si %(count)s bezpečnostné kľúče.\"\nmsgstr[2] \"Pridali ste si %(count)s bezpečnostných kľúčov.\"\nmsgstr[3] \"Pridali ste si %(count)s bezpečnostných kľúčov.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Nepridali ste si žiadne bezpečnostné kľúče.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Spravovať\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Pridať\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Záložné kódy\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Je k dispozícii %(unused_count)s kódov z celkového počtu %(total_count)s \"\n\"záložných kódov.\"\nmsgstr[1] \"\"\n\"Je k dispozícii %(unused_count)s kód z celkového počtu %(total_count)s \"\n\"záložných kódov.\"\nmsgstr[2] \"\"\n\"Je k dispozícii %(unused_count)s kódov z celkového počtu %(total_count)s \"\n\"záložných kódov.\"\nmsgstr[3] \"\"\n\"Je k dispozícii %(unused_count)s kódu z celkového počtu %(total_count)s \"\n\"záložných kódov.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Nie sú nastavené žiadne záložné kódy.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Zobraziť\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Stiahnuť\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Generovať\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Boli vygenerované nové záložné kódy.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Bezpečnostný kľúč pridaný.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Bezpečnostný kľúč odstránený.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Zadajte kód z autentifikátora:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Chystáte sa vygenerovať nové záložné kódy pre váš účet.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Táto akcia zruší platnosť existujúcich kódov.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Ste si istý/á?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Nepoužité kódy\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Stiahnuť kódy\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Generovať nové kódy\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Aktivovať autentifikačnú aplikáciu\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Na ochranu vášho účtu dvojfaktorovou autentifikáciou naskenujte QR kód \"\n\"nižšie autentifikačnou aplikáciou a následne zadajte vygenerovaný overovací \"\n\"kód nižšie.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Heslo prístupového tokenu\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Môžete si toto heslo uložiť a kedykoľvek ho použiť na preinštalovanie vašej \"\n\"autentifikačnej aplikaćie.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Deaktivovať autentifikačnú aplikáciu\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"Chystáte sa deaktivovať vašu autentifikačnú aplikáciu. Ste si istý/á?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Dôverovať tomuto prehliadaču?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Ak sa rozhodnete dôverovať tomuto prehliadaču, nebudeme sa vás pri ďalšom \"\n\"prihlásení pýtať na overovací kód.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Dôverovať na %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Nedôverovať\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Pridať bezpečnostný kľúč\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Odstrániť bezpečnostný kľúč\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Naozaj chcete odstrániť tento bezpečnostný kľúč?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Využitie\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Prístupový kľúč\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Bezpečnostný kľúč\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Tento kľúč neuvádza, či ide o prístupový kľúč.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Neuvedené\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Pridaný %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Naposledy použitý %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Upraviť\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Upraviť bezpečnostný kľúč\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Uložiť\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Vytvoriť Passkey\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Chystáte sa vytvoriť prístupový kľúč pre svoj účet. Keďže neskôr môžete \"\n\"pridať ďalšie kľúče, môžete uviesť názov, pomocou ktorého kľúče od seba \"\n\"odlíšite.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Vytvoriť\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Táto funkcionalita vyžaduje JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Zlyhanie externého prihlásenia\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"Pri prihlasovaní sa cez externý účet nastala chyba.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Môžete sa prihlásiť pomocou niektorého z nasledujúcich externých účtov:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Momentálne nemáte pripojený žiaden externý účet.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Pridať externý účet\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Externý účet %(provider)s bol pripojený do vášho účtu.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Externý účet pripojený\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"Externý účet %(provider)s bol odstránený z vášho účtu.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Externý účet odstránený\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Pripojiť %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Chystáte sa pripojiť nový externý účet %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Prihlásiť sa cez %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Chystáte sa prihlásiť cez externý účet %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Prihlásenie zrušené\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Rozhodli ste sa zrušiť prihlásenie na našu stránku pomocou externého účtu. \"\n\"Ak ste chceli vykonať inú operáciu, pokračujte na <a \"\n\"href=\\\"%(login_url)s\\\">prihlásenie</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Externý účet bol pripojený.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Externý účet bol odstránený.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Chystáte sa použiť váš %(provider_name)s účet na prihlásenie do\\n\"\n\"%(site_name)s. Ako posledný krok vyplňte nasledujúci formulár:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Alebo použiť externý účet\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Boli ste odhlásený/á zo všetkých ostatných relácií.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Začiatok\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP adresa\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Prehliadač\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Naposledy použitá\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Aktuálna relácia\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Odhlásiť sa z ostatných relácií\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Relácie používateľa\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"klúč relácie\"\n\n#~ msgid \"Account Connection\"\n#~ msgstr \"Pripojené účty\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Heslo musí mať aspoň {0} znakov.\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Tento e-mail ste dostali, pretože niekto požiadal o heslo k Vášmu\\n\"\n#~ \"používateľskému účtu. V našej databáze však nemáme žiadny záznam o \"\n#~ \"používateľovi\\n\"\n#~ \"s e-mailom %(email)s.\\n\"\n#~ \"\\n\"\n#~ \"Ak ste nežidali o obnovenie hesla, môžete tento e-mail pokojne \"\n#~ \"ignorovať.\\n\"\n#~ \"\\n\"\n#~ \"Ak ste to boli Vy, môžete si zaregistrovať účet pomocou odkazu nižšie.\"\n\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Nasledujúce e-mailové adresy sú prepojené s vašim účtom:\"\n\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Potvrdiť e-mailovú adresu\"\n\n#~ msgid \"\"\n#~ \"To safeguard the security of your account, please enter your password:\"\n#~ msgstr \"Kvôli bezpečnosti vášho účtu, zadajte prosím vaše heslo:\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Prosím prihláste sa s jedným\\n\"\n#~ \"z vašich existujúcich účtov iných služieb. Alebo <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sa zaregistrujte</a>\\n\"\n#~ \"na %(site_name)s a prihláste sa nižšie:\"\n\n#~ msgid \"or\"\n#~ msgstr \"alebo\"\n\n#~ msgid \"change password\"\n#~ msgstr \"zmeniť heslo\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Prihlásiť pomocou OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Táto e-mailová adresa je už spojená s iným účtom.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Odoslali sme vám e-mail. Prosím kontaktujte nás ak ste ho nedostali do \"\n#~ \"pár minút.\"\n"
  },
  {
    "path": "allauth/locale/sl/LC_MESSAGES/django.po",
    "content": "# Slovenian translations for Django-allauth.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# Lev Predan Kowarski <lev@filmoteka.si>, 2020-06-27\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-07-25 20:27+0200\\n\"\n\"Last-Translator: Bojan Mihelac <bmihelac@mihelac.org>\\n\"\n\"Language-Team: Slovenian <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/sl/>\\n\"\n\"Language: sl\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || \"\n\"n%100==4 ? 2 : 3;\\n\"\n\"X-Generator: Weblate 5.12.1\\n\"\n\"X-Translated-Using: django-rosetta 0.7.4\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Račun trenutno ni aktiven.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Primarnega e-poštnega naslova ni mogoče odstraniti.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"E-poštni naslov že pripada vašemu uporabniškemu računu.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"E-poštni naslov in/ali geslo nista pravilna.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Telefonska številka in/ali geslo nista pravilna.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Za ta e-naslov že obstaja registriran uporabnik.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Prosimo vpišite trenutno geslo.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Napačna koda.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Napačno geslo.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Napačni ali potekli ključ.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Napačna prijava.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Žeton za ponastavitev gesla je bil neveljaven.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Ne morete dodati več kot %d e-poštnih naslovov.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Za to telefonsko številko že obstaja registriran uporabnik.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Preveliko število neuspelih prijav. Poskusite znova kasneje.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"E-poštni naslov ni dodeljen nobenemu uporabniškemu računu.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Telefonska številka ni dodeljena nobenemu uporabniškemu računu.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Vaš primarni e-poštni naslov mora biti preverjen.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"Uporabniško ime je neveljavno. Prosimo uporabite drugo uporabniško ime.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Uporabniško ime in/ali geslo nista pravilna.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Prosimo, izberite le eno možnost.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Nova vrednost mora biti drugačna od trenutne.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Bodite potrpežljivi, pošiljate preveč zahtevkov.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Uporabite svoje geslo\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Uporabite aplikacijo za avtentikacijo ali kodo.\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Uporabite varnostni ključ.\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"E-poštni naslov {email} je bil označen kot preverjen.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"E-poštnega naslova {email} ni bilo mogoče označiti kot preverjenega.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Označi izbrane e-poštne naslove kot preverjene.\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Računi\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-poštni naslov\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"E-poštni naslov\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Vnesite telefonsko številko, vključno s kodo države (npr. +1 za ZDA).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Vnesti je potrebno isto geslo.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Geslo\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Zapomni si me\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Uporabniško ime\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Prijava\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Uporabniško ime, e-poštni naslov ali telefon\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Uporabniško ime ali e-poštni naslov\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Uporabniško ime ali telefon\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-poštni naslov ali telefon\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Ste pozabili geslo?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-pooštni naslov (ponovno)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Potrditev e-poštni naslova\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-poštni naslov (neobvezno)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Uporabniško ime (neobvezno)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Vnesti je potrebno isti e-poštni naslov.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Geslo (ponovno)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Trenutno geslo\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Novo geslo\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Novo geslo (ponovno)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Koda\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"uporabnik\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"E-poštni naslov\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"preverjeno\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"Primarni\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"E-poštni naslovi\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"ustvarjeno\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"poslano\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"ključ\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"E-poštna potrditev\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"E-poštne potrditve\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Brez vmesnika\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Ogled vašega uporabniškega ID-ja\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Ogled vašega e-poštnega naslova\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Ogled vaših osnovnih podatkov profila\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Podeli dovoljenja\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Nadomestni znaki niso dovoljeni, razen če je omogočena možnost 'Dovoli \"\n\"nadomestne znake v URI'.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' vsebuje več kot en nadomestni znak (*). Dovoljen je samo en \"\n\"nadomestni znak na URI.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Nadomestni znaki so dovoljeni samo v delu URI z imenom gostitelja.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Avtorizacijska koda\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Koda naprave\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Poverilnice odjemalca\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Žeton za osvežitev\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Zaupno\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Javno\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Obsegi, ki jih odjemalec sme zahtevati. Navedite eno vrednost na vrstico, \"\n\"npr.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Če odjemalec ne navede nobenega obsega, se uporabijo ti privzeti obsegi. \"\n\"Navedite eno vrednost na vrstico, npr.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Seznam dovoljenih tipov podelitev. Navedite eno vrednost na vrstico, npr.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"Seznam dovoljenih izvorov za zahteve med domenami, en na vrstico.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Dovoli nadomestne znake (*) v preusmeritvenem URI-ju in izvorih CORS. Ko je \"\n\"omogočeno, lahko URI-ji vsebujejo eno zvezdico za ujemanje s poddomenami.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Seznam dovoljenih tipov odgovorov. Navedite eno vrednost na vrstico, npr.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"odjemalec\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"odjemalci\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Ne morete dodati e-poštnega naslova računu, zaščitenem z dvostopenjsko \"\n\"avtentikacijo.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Ne morete deaktivirati dvostopenjske avtentikacije.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Ne morete generirati obnovitvenih kod, ne da bi imeli omogočeno \"\n\"dvostopenjsko avtentikacijo.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Dvostopenjske avtentikacije ne morete aktivirati, dokler ne potrdite svojega \"\n\"e-poštnega naslova.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Glavni ključ\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Varnostni ključ\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Ključ št. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Obnovitvene kode\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP avtentikator\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Koda avtentikatorja\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Brez gesla\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Omogočanje delovanja brez gesla vam omogoča prijavo z uporabo tega ključa, \"\n\"vendar nalaga dodatne zahteve, kot so biometrija ali zaščita z geslom PIN.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Obstoja uporabniški račun s tem e-poštnim naslovom. Najprej se prijavite v \"\n\"ta račun, nato pa povežite svoj %s račun.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Napačen žeton.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Vaš uporabniški račun nima nastavljenega gesla.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Vaš uporabniški račun nima preverjenega e-poštnega naslova.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"\"\n\"Ne morete odklopiti svojega zadnjega preostalega računa drugega ponudnika.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Račun drugega ponudnika je že povezan z drugim računom.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Računi družbenih omrežij.\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"ponudnik\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ID ponudnika\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"ime\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"id številka\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"ID aplikacije ali uporoabniški ključ\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"skrivni ključ\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API skrivnost, skrivnost klienta ali uporabniška skrivnost\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Ključ\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"družbena aplikacija\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"družbene aplikacije\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"zadnja prijava\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"datum pridružitve\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"dodatni podatki\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"uporabniški račun družbenih omerižij\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"uporabniški računi družbenih omerižij\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"žeton\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) ali žeton za dostop (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"žeton skrivnost\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) ali žeton za osvežitev (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"veljavnost poteče\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"žeton družebnih omrežij\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"žetoni družbenih omrežij\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Nevelljavni podatki profila\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Prijava\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Prekliči\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Neveljaven odgovor ob pridobivanju žetona za zahtevo od \\\"%s\\\". Odgovor je \"\n\"bil: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Neveljaven odgovor ob pridobivanju žetona za dostop od \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Za \\\"%s\\\" ni shranjenega žetona za zahtevo.\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Za \\\"%s\\\" ni shranjenega žetona za dostop.\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Ni dostopa do zasebnega vira na \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Neveljaven odgovor ob pridobivanju žetona za zahtevo od \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Neaktiven račun\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Račun ni aktiven.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Poslali smo kodo na %(recipient)s. Koda kmalu poteče, zato jo prosimo \"\n\"vnesite.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Potrdi\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Zahtevaj novo kodo\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Potrdite dostop\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Prosimo, ponovno se prijavite, da zaščitite svoj račun.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Alternativne možnosti\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Potrditev e-pošte\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Vnesite kodo za potrditev e-pošte\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Uporabite drug e-poštni naslov.\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Prijava\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Vnesite kodo za prijavo\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Ponastavitev gesla\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Vnesite kodo za ponastavitev gesla\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Potrditev telefona\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Vnesite verifikacijsko kodo za telefon\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Uporabite drugo telefonsko številko.\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"E-poštni naslovi\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"E-poštni naslovi, ki pripadajo vašemu uporabniškemu računu:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Preverjeni\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Nepreverjeni\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Primarni\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Spremeni v primarni\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Ponovno pošlji verifikacijo\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Odstrani\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Dodaj e-poštni naslov\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Dodaj e-pošto\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Želite odstraniti izbran e-poštni nalsov?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Prejeli ste to e-poštno sporočilo, ker ste vi ali nekdo drug poskušali \"\n\"ustvariti\\n\"\n\"račun z e-poštnim naslovom:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Vendar račun z uporabo tega e-poštnega naslova že obstaja. V kolikor ste to\\n\"\n\"pozabili, uporabite postopek za pozabljeno geslo za obnovitev\\n\"\n\"vašega računa:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Račun že obstaja\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Pozdravljeni iz %(site_name)s\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Hvala, ker uporabljate %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Prejeli ste to e-sporočilo, ker je bila na vašem računu izvršena naslednja \"\n\"sprememba:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Če te spremembe ne prepoznate, takoj sprejmite ustrezne varnostne ukrepe. \"\n\"Sprememba na vašem računu izhaja iz:\\n\"\n\"\\n\"\n\"- IP naslov: %(ip)s\\n\"\n\"- Brskalnik: %(user_agent)s\\n\"\n\"- Datum: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"\"\n\"Vaš e-poštni naslov je bil spremenjen iz %(from_email)s na %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"E-poštni naslov spremenjen\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Vaš e-poštni naslov je potrjen.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Potrditev e-pošte\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"To sporočilo ste prejeli, ker je uporabnik %(user_display)s navedel vaš e-\"\n\"poštni naslov za registracijo računa na %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Vaša koda za potrditev e-pošte je navedena spodaj. Prosim, vnesite jo v \"\n\"odprtem oknu brskalnika.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Da potrdite, da je to pravilno, sledite povezavi %(activate_url)s.\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Prosimo, potrdite svoj e-poštni naslov.\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"E-poštni naslov %(deleted_email)s je bil odstranjen iz vašega računa.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"E-poštni naslov odstranjen\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Vaša koda za prijavo je navedena spodaj. Prosim, vnesite jo v odprtem oknu \"\n\"brskalnika.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"To sporočilo lahko varno prezrete, če niste sprožili te akcije.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Koda za prijavo\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Vaše geslo je bilo spremenjeno.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Geslo spremenjeno\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Vaša koda za ponastavitev gesla je navedena spodaj. Prosim, vnesite jo v \"\n\"odprtem oknu brskalnika.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Koda za ponastavitev gesla\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Prejeli ste to e-sporočilo, ker ste vi ali nekdo drug zahtevali ponastavitev \"\n\"gesla za vašo uporabniško račun.\\n\"\n\"To sporočilo lahko prezrete, če niste zahtevali ponastavitve gesla. Sledite \"\n\"povezavi za ponastavitev gesla.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"V primeru, da ste pozabili, vaše uporabniško ime je: %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"E-poštni naslov za ponastavitev gesla\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Vaše geslo je bilo ponastavljeno.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Vaše geslo je bilo nastavljeno.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Nastavitev gesla\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Prejeli ste to e-poštno sporočilo, ker ste vi ali nekdo drug poskušali \"\n\"dostopati do računa z e-poštanem naslovom %(email)s. Vendar pa nimamo \"\n\"nobenega zapisa takšnega računa v naši bazi podatkov.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"Če ste to vi, se lahko registrirate za račun s povezavo spodaj.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Neznan račun\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"E-poštni naslov\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Trenutni e-poštni naslov\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Sprememba na\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Vaš e-poštni naslov čaka na potrditev.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Prekliči spremembo\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Spremeni na\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Spremeni e-poštni naslov\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Potrdite e-poštni naslov\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Prosimo, potrdite, da je <a href=\\\"mailto:%(email)s\\\">%(email)s</a> e-poštni \"\n\"naslov uporabnika %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"Ni mogoče potrditi %(email)s, ker je že potrjen z drugim računom.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Povezava za potrditev e-pošte je potekla ali pa je neveljavna. Prosimo, <a \"\n\"href=\\\"%(email_url)s\\\">pošljite nov zahtevek za potrditev e-pošte</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Če še nimate uporabniškega računa, ga ustvarite %(link)stukaj%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Prijavite se z varnostnim ključem\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Pošlji mi kodo za prijavo\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Odjava\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Ali ste prepričani, da se želite odjaviti?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Primarnega e-poštnega naslova (%(email)s) ni mogoče odstraniti.\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Na %(email)s je bilo poslano potrditveno sporočilo.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"%(email)s je potrjen.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"E-poštni naslov %(email)s je bil odstranjen.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Uspešno ste se prijavili kot %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Odjavili ste se.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Koda za prijavo je bila poslana na %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Geslo je uspešno zamenjano.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Geslo je uspešno nastavljeno.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Verifikacijska koda je bila poslana na %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Telefonska številka %(phone)s je bila potrjena.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Primarni e-poštni naslov je nastavljen.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Sprememba gesla\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Ste pozabili geslo?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Ste pozabili geslo? Vnesite svoj e-poštni naslov spodaj, in poslali vam bomo \"\n\"e-pošto za ponastavitev.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Ponastavi geslo\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"V primeru težav pri ponastavljanju gesla, nas kontaktirajte.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Poslali smo vam e-sporočilo. Če ga niste prejeli, preverite svoj lažni mapo. \"\n\"V nasprotnem primeru nas kontaktirajte, če ga ne prejemate v nekaj minutah.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Napačni žeton\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Povezava za ponastavitev gesla je neveljavna oz. je bila že uporoabljena. \"\n\"Prosimo, zahtevajte <a href=\\\"%(passwd_reset_url)s\\\">novo povezavo</a> za \"\n\"ponastavitev.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Geslo je spremenjeno.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Nastavi geslo\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Spremeni telefon\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Trenutni telefon\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Vaša telefonska številka je še vedno v verifikaciji.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Spremeni telefon\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Vnesite svoje geslo:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Prejeli boste posebno kodo za prijavo brez gesla.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Zahtevaj kodo\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Druge možnosti prijave\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Ustvari račun\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Ustvari račun\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Že imate uporabniški račun? %(link)sPrijavite se%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Registrirajte se z varnostnim ključem.\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Registracija z varnostnim ključem\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Druge možnosti\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Registracija ni mogoča\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Registracija trenutno ni mogoča\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Opomba\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Prijavljeni ste kot %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Opozorilo:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Trenutno nimate nastavljenega e-poštnega naslova. Priporočamo vam, da dodate \"\n\"e-poštni naslov, da boste lahko prejemali obvestila, ponastavili geslo itd.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Potrdite e-poštni naslov.\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Na vaš e-poštni naslov smo poslali sporočilo za potrditev. Sledite povezavi \"\n\"za zaključek registracije. Če potrditvenega sporočila ne vidite v prejeti \"\n\"pošti, preverite mapo z neželeno pošto. Kontaktirajte nas, če potrditvenega \"\n\"sporočila ne prejmete v nekaj minutah.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Ta del strani zahteva, da preverimo vašo identiteto. V ta namen zahtevamo, \"\n\"da potrdite lastništvo svojega e-poštnega naslova. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Poslali smo vam e-poštno sporočilo za\\n\"\n\"preverjanje. Kliknite na povezavo v tem e-sporočilu. Če v svoji glavnih \"\n\"mapah ne vidite potrditvenega e-sporočila, preverite mapo z nezaželeno \"\n\"pošto. V nasprotnem primeru\\n\"\n\"kontaktirajte nas, če ga v nekaj minutah ne prejemate.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Opomba:</strong> še vedno lahko <a href=\\\"%(email_url)s\\\">spremenite \"\n\"svoj e-poštni naslov</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Sporočila:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Meni:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Povezave računov\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Dvostopenjska avtentikacija\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Seje\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Avtoriziraj\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s želi dostopati do vašega računa %(site_name)s.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Vnesite kodo naprave\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Vnesite kodo, prikazano na vaši napravi.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Nadaljuj\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Potrdite napravo\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Prosimo, potrdite kodo, prikazano na vašem %(client_name)s, za avtorizacijo \"\n\"te naprave.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Zavrni\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Naprava avtorizirana\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Uspešno ste avtorizirali vašo napravo %(client_name)s.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Naprava zavrnjena\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Avtorizacija vaše naprave %(client_name)s je bila zavrnjena.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Napaka\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Ostani prijavljen\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Vaš račun je zaščiten z dvostopenjsko avtentikacijo. Prosimo, vnesite kodo \"\n\"avtentikatorja:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Skladišče novih obnovitvenih kod za dvostopenjsko avtentikacijo je bilo \"\n\"ustvarjeno.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Ustvarjene nove obnovitvene kode\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Aplikacija avtentikatorja je bila aktivirana.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Aplikacija avtentikatorja je aktivirana.\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Aplikacija avtentikatorja je bila deaktivirana.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Aplikacija avtentikatorja je deaktivirana.\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Dodali smo nov varnostni ključ.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Varnostni ključ dodan\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Varnostni ključ je bil odstranjen.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Varnostni ključ odstranjen\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Aplikacija avtentikator\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Avtentikacija z uporabo aplikacije avtentikatorja je aktivna.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Aplikacija avtentikator ni aktivna.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Deaktiviraj\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktiviraj\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Varnostni ključi\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Dodali ste %(count)s varnostni ključ.\"\nmsgstr[1] \"Dodali ste %(count)s varnostna ključa.\"\nmsgstr[2] \"Dodali ste %(count)s varnostne ključe.\"\nmsgstr[3] \"Dodali ste %(count)s varnostnih ključev.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Nobeni varnostni ključi niso bili dodani.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Upravljaj\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Dodaj\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Obnovitvene kode\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"Na voljo je %(unused_count)s od %(total_count)s obnovitvene kode.\"\nmsgstr[1] \"Na voljo sta %(unused_count)s od %(total_count)s obnovitvenih kod.\"\nmsgstr[2] \"Na voljo so %(unused_count)s od %(total_count)s obnovitvenih kod.\"\nmsgstr[3] \"Na voljo je %(unused_count)s od %(total_count)s obnovitvenih kod.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Nobene obnovitvene kode niso bile nastavljene.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Ogled\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Prenesi\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Generiraj\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Ustvarjen je nov sklop obnovitvenih kod.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Varnostni ključ dodan.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Varnostni ključ odstranjen.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Vnesite kodo avtentikatorja:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Načrtujete, da ustvarite nov sklop obnovitvenih kod za svoj račun.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Ta dejanja bo neveljavna vaše obstoječe kode.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Ali ste prepričani?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Neporabljene kode\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Prenesi kode\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Ustvari nove kode\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Aktiviraj aplikacijo avtentikatorja\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Za zaščito svojega računa z dvostopenjsko avtentikacijo, skenirajte QR kodo \"\n\"spodaj z aplikacijo avtentikatorja. Nato vnesite verifikacijsko kodo, ki jo \"\n\"aplikacija ustvari spodaj.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Skrivnost avtentikatorja\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"To skrivnost lahko shranite in jo uporabite za ponovno namestitev svoje \"\n\"aplikacije avtentikatorja pozneje.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Deaktiviraj aplikacijo za preverjanje\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Deaktivirali boste preverjanje z aplikacijo za preverjanje. Ali ste \"\n\"prepričani?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Zaupate temu brskalniku?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Če se odločite zaupati temu brskalniku, ob naslednji prijavi ne boste \"\n\"vprašani za potrditveno kodo.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Zaupaj za %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Ne zaupaj\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Dodaj varnostni ključ\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Odstrani varnostni ključ\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Ali ste prepričani, da želite odstraniti ta varnostni ključ?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Uporaba\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Ključ za dostop\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Varnostni ključ\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Ta ključ ne navaja, ali gre za ključ za dostop.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Nedoločeno\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Dodano %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Nazadnje uporabljeno %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Uredi\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Uredi varnostni ključ\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Shrani\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Ustvari ključ za dostop\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Ustvarili boste ključ za dostop za vaš račun. Ker lahko pozneje dodate \"\n\"dodatne ključe, lahko uporabite opisno ime za ločevanje med njimi.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Ustvari\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Ta funkcionalnost zahteva JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Neuspešna prijava z računom tretje osebe\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"Prišlo je do napake pri poskusu prijave z vašim računom tretje osebe.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"V svoj račun se lahko prijavite z naslednjimi računi tretjih oseb:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Trenutno nimate povezanega nobenega računa tretje osebe.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Dodaj račun tretje osebe\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Račun tretje osebe od %(provider)s je bil povezan z vašim računom.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Račun tretje osebe je povezan\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"Račun tretje osebe od %(provider)s je bil odklopljen od vašega računa.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Račun tretje osebe je odklopljen\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Poveži %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Povezali boste nov račun tretje osebe od %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Prijava prek %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Prijavili se boste z računom tretje osebe od %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Prijava je bila prekinjena\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Odločili ste se za prekinitev prijave v našo storitev s pomočjo obstoječega \"\n\"računa. Če gre za napako, se lahko prijavite <a \"\n\"href=\\\"%(login_url)s\\\">tukaj</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Račun tretje osebe je bil povezan.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Račun tretje osebe je bil odklopljen.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Uporabili boste svoj obstoječi %(provider_name)s račun, za vpis v\\n\"\n\"%(site_name)s. Prosimo izpolnite spodnji obrazec:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Ali uporabite tretjo osebo\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Odjavljeni iz vseh drugih sej.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Začetek\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP naslov\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Brskalnik\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Nazadnje viden ob\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Trenutna\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Odjavi druge seje\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Uporabniške seje\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"ključ seje\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Povezave računov\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Geslo mora vsebovati najmanj {0} znakov. \"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Pozdravljeni od %(site_name)s!\\n\"\n#~ \"To sporočilo ste prejeli, ker ste zahtevali ponastavitev gesla na \"\n#~ \"%(site_name)s!\\n\"\n#~ \"To sporočilo lahko zavržete, če niste poslali zahtevka za spremembo \"\n#~ \"gesla. Za ponastavitev gelsa, sledie spodnji pvezavi:\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"E-poštni naslovi, ki pripadajo vašemu uporabniškemu računu:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Potrdite e-poštni naslov\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Prosimo, vpišite se z enim od vaših\\n\"\n#~ \"obstoječih računov, ali pa %(link)sustvarite nov račun</a>\\n\"\n#~ \"na %(site_name)s in se vpišite spodaj:\"\n\n#~ msgid \"or\"\n#~ msgstr \"ali\"\n\n#~ msgid \"change password\"\n#~ msgstr \"Sprememba gesla\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Prijava z OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"E-poštni naslov že pripada drugemu uporabniškemu računu.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Povezava za ponastavitev gesla je bila poslana. Če je ne boste prejeli v \"\n#~ \"nekaj minutah, nas kontaktirajte.\"\n"
  },
  {
    "path": "allauth/locale/sr/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# Nikola Vulovic <nivukiki@gmail.com>, 2018.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-07-25 20:27+0200\\n\"\n\"Last-Translator: Igor Jerosimić <jerosimic@gmail.com>\\n\"\n\"Language-Team: Serbian <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/sr/>\\n\"\n\"Language: sr\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && \"\n\"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\\n\"\n\"X-Generator: Weblate 5.13-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Овај налог је тренутно неактиван.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Не можете да уклоните примарну адресу е-поште.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Ова адреса е-поште је већ повезана са овим налогом.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Адреса е-поште и/или лозинка коју сте навели нису тачни.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Број телефона и/или лозинка које сте навели нису тачни.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Корисник је већ регистрован на овој адреси е-поште.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Молимо унесите тренутну лозинку.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Нетачан код.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Нетачна лозинка.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Неважећи или истекао кључ.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Неважећа пријава.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Токен за ресетовање лозинке је неважећи.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Не можете додати више од %d адреса е-поште.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Корисник је већ регистрован са овим бројем телефона.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Превише неуспелих покушаја пријављивања. Покушајте поново касније.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Адреса е-поште није додељена ниједном корисничком налогу.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Број телефона није додељен ниједном корисничком налогу.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Ваша примарна адреса е-поште мора бити потврђена.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"Корисничко име се не може користити. Молимо користите друго корисничко име.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Корисничко име и/или лозинка коју сте навели нису тачни.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Молим изаберите само један.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Нова вредност мора да се разликује од тренутне.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Будите стрпљиви, шаљете превише захтева.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Користите своју лозинку\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Користите аутентикатор апликацију или код за аутентификацију\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Користите безбедносни кључ\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Означите {email} као верификован.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Није успело верификовање {email}.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Означите изабране адресе е-поште као верификоване\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Налози\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"Е-пошта\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Адреса е-поште\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Унесите број телефона укључујући позивни број земље (нпр. +381 за Србију).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Телефон\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Сваки пут морате да унесете исту лозинку.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Лозинка\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Запамти ме\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Корисничко име\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Пријавите се\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Корисничко име, е-пошта или телефон\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Корисничко име или е-пошта\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Корисничко име или телефон\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Е-пошта или телефон\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Заборавили сте лозинку?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"Е-пошта (опет)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Потврда адресе е-поште\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"Е-пошта (опционо)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Корисничко име (опционо)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Морате унети исту адресу е-поште сваки пут.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Лозинка (поново)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Тренутна лозинка\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Нова лозинка\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Нова лозинка (поново)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"код\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"корисник\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"адреса е-поште\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"проверено\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"примарна\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"адресе е-поште\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"створено\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"послат\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"кључ\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"потврда е-поште\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"потврде е-поште\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Без главе\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Погледајте свој кориснички ИД\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Погледајте своју адресу е-поште\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Погледајте основне информације о свом профилу\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Додели дозволе\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Џокер знакови нису дозвољени осим ако није омогућена опција 'Дозволи URI \"\n\"џокер знакове'.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' садржи више од једног џокер знака (*). Дозвољен је само један џокер \"\n\"знак по URI-ју.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"\"\n\"Џокер знакови су дозвољени само у делу URI-ја који се односи на име хоста.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Код ауторизације\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Код уређаја\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Акредитиви клијента\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Освежи токен\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Поверљиво\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Јавно\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Опсег(зи) које клијент може да захтева. Наведите једну вредност по реду, \"\n\"нпр: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"У случају да клијент не наведе опсег, користе се ови подразумевани опсези. \"\n\"Наведите по једну вредност по реду, нпр: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Листа дозвољених типова одобрења. Наведите једну вредност по реду, нпр: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Листа дозвољених порекла за захтеве из различитог порекла, по једно у сваком \"\n\"реду.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Дозволи џокер знакове (*) у преусмеравајућим URI-јима и CORS изворима. Када \"\n\"је омогућено, URI-ји могу садржати једну звездицу за подударање поддомена.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Листа дозвољених типова одговора. Наведите једну вредност по реду, нпр: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"клијент\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"клијенти\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Не можете додати адресу е-поште на налог заштићен двофакторском \"\n\"аутентификацијом.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Не можете деактивирати двофакторску аутентификацију.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Не можете генерисати кодове за опоравак без омогућене двофакторске \"\n\"аутентификације.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Не можете активирати двофакторску аутентификацију док не верификујете своју \"\n\"адресу е-поште.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Главни кључ\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Резервни кључ\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Кључ бр. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Кодови за опоравак\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP аутентикатор\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Aутентикатор код\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Без лозинке\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Укључивање рада без лозинке омогућава вам да се пријавите користећи само \"\n\"овај кључ, али намеће додатне захтеве као што су биометрија или заштита ПИН-\"\n\"ом.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Већ постоји налог са овом адресом е-поште. Прво се пријавите на тај налог, а \"\n\"затим повежите свој %s налог.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Неважећи токен.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Ваш налог нема подешену лозинку.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Ваш налог нема потврђену е-маил адресу.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"\"\n\"Не можете да прекинете везу са последњим преосталим налогом треће стране.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Налог треће стране је већ повезан са другим налогом.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Друштвени налози\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"провидер\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"провидер ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"име\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"ид клијента\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"ИД апликације или потрошачки кључ\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"тајни кључ\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"Тајна АПИ-ја, тајна клијента или тајна потрошача\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Кључ\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"друштвена апликација\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"друштвене апликације\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"уид\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"последња пријава\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"датум придруживања\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"додатни подаци\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"друштвени налог\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"друштвени налози\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"токен\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) или токен приступа (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"токен тајна\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) или токен за освежавање (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"истиче у\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"токен друштвених апликација\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"токени друштвених апликација\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Невељавни подаци о профилу\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Пријавите се\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Откажи\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Неважећи одговор при добијању токена за захтев од %s. Одговор је био: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Неважећи одговор при добијању токена за приступ од \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Нема сачуваних токена за захтев од \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Нема сачуваних токена за приступ од \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Нема приступа приватним ресурсима у \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Неважећи одговор при добијању токена за захтев од \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Налог је неактиван\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Овај налог је неактиван.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Послали смо код на %(recipient)s. Код унесите ускоро јер важи кратко време.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Потврди\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Захтевај нови код\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Потврди приступ\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Поново потврдите аутентичност да бисте заштитили свој налог.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Алтернативне опције\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Потврда е-поште\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Унесите потврдни код е-поште\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Користи другу адресу е-поште\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Пријавите се\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Унесите код за пријаву\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Ресетовање лозинке\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Унесите код за ресетовање лозинке\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Потврда телефона\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Унесите потврдни код за телефон\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Користи други број телефона\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Адресе е-поште\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"С вашим налогом су повезане следеће адресе е-пошти:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Потврђено\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Непотврђени\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Примарни\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Постави за примарни\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Поново пошаљи потврду\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Уклони\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Додај адресу е-поште\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Додај е-пошту\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Да ли стварно желите да уклоните изабрану адресу е-поште?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Примили сте ову е-пошту јер сте ви или неко други покушали да се \"\n\"региструјете за\\n\"\n\"налог користећи адресу е-поште:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Међутим налог који користи ту адресу е-поште већ постоји. У случају да сте\\n\"\n\"заборавили на ово, молим користите процедуру за ресетовање лозинке \\n\"\n\"за опоравак вашег налога:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Налог већ постоји\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Хвала од %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Хвала вам што користите %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"Добијате ову е-пошту јер је на вашем налогу извршена следећа промена:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Ако не препознајете ову промену, одмах предузмите одговарајуће мере \"\n\"предострожности. Промена вашег налога потиче од:\\n\"\n\"\\n\"\n\"- ИП адреса: %(ip)s\\n\"\n\"- Прегледач: %(user_agent)s\\n\"\n\"- Датум: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Ваша адреса е-поште је промењена из %(from_email)s у %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Адреса е-поште промењена\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Ваша адреса е-поште је потврђена.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Потврда е-поште\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Примили сте ову е-поруку јер је корисник %(user_display)s дао вашу адресу е-\"\n\"поште при регистрацији налога на %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Ваш потврдни код е-поште је наведен испод. Унесите га у отворени прозор \"\n\"претраживача.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Да бисте потврдили да је ово тачно, идите на %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Молим вас потврдите вашу адресу е-поште\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"Адреса е-поште %(deleted_email)s је уклоњена са вашег налога.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Адреса е-поште је уклоњена\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Ваш код за пријављивање је наведен испод. Унесите га у отворени прозор \"\n\"прегледача.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Ова порука се може безбедно занемарити ако нисте ви покренули ову радњу.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"регистрациони код\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Ваша лозинка је промењена.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Лозинка је промењена\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Ваш код за ресетовање лозинке је наведен испод. Унесите га у отворени прозор \"\n\"претраживача.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Код за ресетовање лозинке\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Примили сте ову е-поруку јер сте ви или неко други затражили ресетовање \"\n\"лозинке за ваш кориснички налог.\\n\"\n\"Може се безбедно занемарити ако нисте захтевали ресетовање лозинке. Кликните \"\n\"на везу испод да бисте ресетовали лозинку.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"У случају да сте заборавили, ваше корисничко име је %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Е-пошта за ресетовање лозинке\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Ваша лозинка је ресетована.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Ваша лозинка је постављена.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Лозинка је постављена\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Примили сте ову е-пошту јер сте ви или неко други покушали да приступите \"\n\"налогу са адресом е-поште %(email)s. Међутим, ми немамо никакву евиденцију о \"\n\"таквом налогу у нашој бази података.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"Ако сте то били ви, можете се пријавити за налог користећи везу испод.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Непознати налог\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Адреса е-поште\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Тренутна адреса е-поште\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Промена у\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Ваша адреса е-поште још увек чека верификацију.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Откажи промену\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Промените на\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Промените адресу е-поште\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Потврда адресе е-поште\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Молим потврдите да је <a href=\\\"mailto:%(email)s\\\">%(email)s</a> адреса е-\"\n\"поште за корисника %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"Није могуће потврдити %(email)s јер га је већ потврдио други налог.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Ова веза за потврду адресе е-поште је истекла или је неважећа. Молимо <a \"\n\"href=\\\"%(email_url)s\\\">пошаљите нови захтев за потврду е-поште</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Ако још увек нисте направили налог, молимо вас прво %(link)sсе \"\n\"региструјте%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Пријавите се помоћу приступног кључа\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Пошаљите ми код за регистрацију\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Одјава\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Јесте ли сигурни да желите да се одјавите?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Не можете да уклоните примарну адресу е-поште (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Потврдна порука је послата на адресу е-поште %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Потврдили сте %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Уклоњена адреса e-поште %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Успешно сте се пријавили као %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Одјавили сте се.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Код за регистрацију је послат на %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Лозинка је успешно промењена.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Успешно сте поставили лозинку.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Код за потврду је послат на %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Потврдили сте број телефона %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Примарна адреса е-поште постављена.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Промени лозинку\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Заборавили сте лозинку?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Заборавили сте лозинку? Унесите своју адресу е-поште испод, а ми ћемо вам \"\n\"послати поруку е-поште која вам омогућава да је ресетујете.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Ресетуј моју лозинку\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Молимо вас да нас контактирате ако имате проблема са ресетовањем ваше \"\n\"лозинке.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Послали смо вам е-пошту. Ако је нисте примили, проверите своју фасциклу са \"\n\"нежељеном поштом. У супротном, контактирајте нас ако га не добијете за \"\n\"неколико минута.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Лош токен\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Веза за ресетовање лозинке је била неважећа, вероватно зато што је већ \"\n\"коришћена. Затражите <a href=\\\"%(passwd_reset_url)s\\\">ново ресетовање \"\n\"лозинке</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Ваша лозинка је сада промењена.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Постави лозинку\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Промени телефон\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Тренутни телефон\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Ваш телефон још увек чека потврду.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Промени телефон\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Унесите своју лозинку:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Добићете посебан код за пријаву без лозинке.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Захтевај код\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Друге опције за пријављивање\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Регистрација\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Региструјте се\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Већ имате налог? Онда Вас молимо да %(link)sсе пројавите%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Региструјте се користећи приступни кључ\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Регистрација приступним кључем\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Друге опције\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Регистрација затворена\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Жао нам је, али регистрација је тренутно затворена.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Напомена\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Већ сте пријављени као %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Упозорење:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Тренутно немате подешену ниједну адресу е-поште. Заиста би требало да додате \"\n\"адресу е-поште како бисте могли да примате обавештења, ресетујете лозинку \"\n\"итд.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Потврдите Вашу адресу е-поште\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Послали смо вам е-пошту ради верификације. Пратите наведену везу да бисте \"\n\"завршили процес регистрације. Ако не видите е-поруку за верификацију у \"\n\"главном пријемном сандучету, проверите фасциклу за нежељену пошту. \"\n\"Контактирајте нас ако не примите е-поруку за верификацију у року од неколико \"\n\"минута.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Овај део сајта захтева од Вас да потврдите\\n\"\n\"да сте Ви заиста особа која тврдите да јесте. У ту сврху захтевамо од вас\\n\"\n\"потврдите власништво над вашом адресом е-поште. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Послали смо вам поруку е-поштом за верификацију.\\n\"\n\"Молимо кликните на везу унутар те е-поруке. Ако не видите е-поруку за \"\n\"верификацију у главном пријемном сандучету, проверите фасциклу за нежељену \"\n\"пошту. Иначе\\n\"\n\"контактирајте нас ако не примите е-поруку у року од неколико минута.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Напомена:</strong> и даље можете <a href=\\\"%(email_url)s\\\"> да \"\n\"промените адресу ваше е-поште</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Поруке:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Мени:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Повезани налози\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Двофакторска аутентификација\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Сесије\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Овласти\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s жели да приступи вашем %(site_name)s налогу.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Унесите код уређаја\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Унесите код приказан на вашем уређају.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Настави\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Потврди уређај\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Молимо вас да потврдите код приказан на вашем %(client_name)s налогу да \"\n\"бисте овластили овај уређај.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Одбиј\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Уређај је овлашћен\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Успешно сте овластили свој %(client_name)s уређај.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Уређај одбијен\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Овлашћење за ваш %(client_name)s уређај је одбијено.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Грешка\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Остани пријављен\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Ваш налог је заштићен двофакторском аутентификацијом. Унесите код за потврду \"\n\"идентитета:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Генерисан је нови скуп кодова за опоравак двофакторске аутентификације.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Генерисани нови кодови за опоравак\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Аутентикатор апликација је активирана.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Апликација за аутентикацију је активирана\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Аутентикатор апликација је деактивирана.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Апликација за аутентикацију је деактивирана\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Додат је нови безбедносни кључ.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Сигурносни кључ је додат\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Безбедносни кључ је уклоњен.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Сигурносни кључ је уклоњен\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Аутентикатор апликација\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Потврда идентитета помоћу апликације за аутентификацију је активна.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Апликација за аутентификацију није активна.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Деактивирај\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Активирај\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Сигурносни кључеви\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Додали сте %(count)s безбедносни кључ.\"\nmsgstr[1] \"Додали сте %(count)s безбедносна кључа.\"\nmsgstr[2] \"Додали сте %(count)s безбедносних кључева.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Није додат ниједан безбедносни кључ.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Управљај\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Додај\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Кодови за опоравак\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Доступан је %(unused_count)s од укупно %(total_count)s кодова за опоравак.\"\nmsgstr[1] \"\"\n\"Доступна су %(unused_count)s од укупно %(total_count)s кодова за опоравак.\"\nmsgstr[2] \"\"\n\"Доступно је %(unused_count)s од укупно %(total_count)s кодова за опоравак.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Нису подешени кодови за опоравак.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Погледај\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Преузми\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Генериши\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Генерисан је нови скуп кодова за опоравак.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Сигурносни кључ је додат.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Сигурносни кључ је уклоњен.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Унесите код за потврду идентитета:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Управо ћете генерисати нови скуп кодова за опоравак за свој налог.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Ова радња ће поништити ваше постојеће кодове.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Јесте ли сигурни?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Неискоришћени кодови\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Преузмите кодове\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Генеришите нове кодове\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Активирајте апликацију аутентикатор\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Да заштите свој налог двофакторском аутентификацијом скенирајте следећи QR \"\n\"код помоћу апликације за аутентификацију. Затим унесите верификациони код \"\n\"који је генерисала апликација у наставку.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Аутентикатор тајна\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Можете да сачувате ову тајну и да је користите да поново подесите апликације \"\n\"за аутентификацију касније.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Деактивирајте аутентикатор апликацију\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Спремате се да деактивирате аутентификацију засновану на аутентикатор \"\n\"апликацији. Јесте ли сигурни?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Верујете овом прегледачу?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Ако одлучите да верујете овом прегледачу, од вас се неће тражити \"\n\"верификациони код следећи пут када се пријавите.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Веруј %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Не веруј\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Додај сигурносни кључ\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Уклони сигурносни кључ\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Да ли сте сигурни да желите да уклоните овај безбедносни кључ?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Употреба\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Приступни кључ\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Безбедносни кључ\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Овај кључ не показује да ли је у питању приступни кључ.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Неодређено\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Додато у %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Последње коришћено %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Измени\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Измени сигурносни кључ\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Сачувај\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Направи приступни кључ\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Управо ћете креирати приступни кључ за свој налог. Пошто касније можете да \"\n\"додате додатне кључеве, можете користити описно име да бисте их разликовали.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Направи\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Ова функционалност захтева JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Неуспешна пријава треће стране\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Дошло је до грешке при покушају да се пријавите преко налога треће стране.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Можете се пријавити на свој налог помоћу било које од следећих налога трећих \"\n\"страна:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Тренутно немате ниједан налог треће стране повезан са овим налогом.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Додајте налог треће стране\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Налог треће стране од %(provider)s је повезан са вашим налогом.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Налог треће стране је повезан\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"Налог треће стране од %(provider)s више није повезан са вашим налогом.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Налог треће стране више није повезан\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Повежите %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Управо ћете да повежете нови налог треће стране од %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Пријавите се преко %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Управо ћете се пријавити користећи налог треће стране од %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Пријава је отказана\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Одлучили сте да откажете пријављивање на нашу веб страницу помоћу једног од \"\n\"ваших постојећих налога. Ако је ово грешка, молимо вас да пређете на <a \"\n\"href=\\\"%(login_url)s\\\">и пријавите се</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Налог треће стране је повезан.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Налог треће стране више није повезан.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Управо користите свој налог код %(provider_name)s да бисте се пријавили на\\n\"\n\"%(site_name)s. Као последњи корак, молимо попуните следећи образац:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Или користите трећу страну\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Одјављен са свих осталих сесија.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Започето у\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"ИП адреса\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Претраживач\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Последње виђен у\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Тренутно\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Одјавит се из других сесија\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Корисничке сесије\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"кључ сесије\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Повезани рачуни\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Лозинка мора бити најмање {0} знакова.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Здраво од %(site_name)s!\\n\"\n#~ \"\\n\"\n#~ \"Примате ову е-маил поруку јер сте ви или неко други тражилилозинку за ваш \"\n#~ \"кориснички налог.\\n\"\n#~ \"Ова порука се може игнорисати ако нисте затражили ресет лозинке. Кликните \"\n#~ \"на линк испод да бисте поништили своју лозинку.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"С вашим налогом су повезане следеће адресе е-пошти:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Потврда адресе е-поште\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Молимо Вас да се пријавите са једним од\\n\"\n#~ \"постојећих рачуна трећих страна. Или, се <a \"\n#~ \"href=\\\"%(signup_url)s\\\">региструјте</a>\\n\"\n#~ \"за рачун код  %(site_name)s и пријавите се доле:\"\n\n#~ msgid \"or\"\n#~ msgstr \"или\"\n\n#~ msgid \"change password\"\n#~ msgstr \"промени лозинку\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"ОпенИД Пријава\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Ова адреса е-поште је већ повезана са другим налогом.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Послали смо вам е-пошту. Молимо Вас да нас контактирате ако га не \"\n#~ \"примитеза неколико минута.\"\n"
  },
  {
    "path": "allauth/locale/sr_Latn/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# Nikola Vulovic <nivukiki@gmail.com>, 2018.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-07-25 20:27+0200\\n\"\n\"Last-Translator: Igor Jerosimić <jerosimic@gmail.com>\\n\"\n\"Language-Team: Serbian (Latin script) <https://hosted.weblate.org/projects/\"\n\"allauth/django-allauth/sr_Latn/>\\n\"\n\"Language: sr_Latn\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && \"\n\"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\\n\"\n\"X-Generator: Weblate 5.13-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Ovaj nalog je trenutno neaktivan.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Ne možete da uklonite primarnu adresu e-pošte.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Ova adresa e-pošte je već povezana sa ovim nalogom.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Adresa e-pošte i/ili lozinka koju ste naveli nisu tačni.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Broj telefona i/ili lozinka koje ste naveli nisu tačni.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Korisnik je već registrovan na ovoj adresi e-pošte.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Molimo unesite trenutnu lozinku.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Netačan kod.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Netačna lozinka.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Nevažeći ili istekao ključ.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Nevažeća prijava.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Token za resetovanje lozinke je nevažeći.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Ne možete dodati više od %d adresa e-pošte.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Korisnik je već registrovan sa ovim brojem telefona.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Previše neuspelih pokušaja prijavljivanja. Pokušajte ponovo kasnije.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Adresa e-pošte nije dodeljena nijednom korisničkom nalogu.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Broj telefona nije dodeljen nijednom korisničkom nalogu.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Vaša primarna adresa e-pošte mora biti potvrđena.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"Korisničko ime se ne može koristiti. Molimo koristite drugo korisničko ime.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Korisničko ime i/ili lozinka koju ste naveli nisu tačni.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Molim izaberite samo jedan.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Nova vrednost mora da se razlikuje od trenutne.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Budite strpljivi, šaljete previše zahteva.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Koristite svoju lozinku\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Koristite autentikator aplikaciju ili kod za autentifikaciju\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Koristite bezbednosni ključ\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Označite {email} kao verifikovan.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Nije uspelo verifikovanje {email}.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Označite izabrane adrese e-pošte kao verifikovane\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Nalozi\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-pošta\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Adresa e-pošte\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Unesite broj telefona uključujući pozivni broj zemlje (npr. +381 za Srbiju).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Svaki put morate da unesete istu lozinku.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Lozinka\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Zapamti me\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Korisničko ime\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Prijavite se\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Korisničko ime, e-pošta ili telefon\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Korisničko ime ili e-pošta\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Korisničko ime ili telefon\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-pošta ili telefon\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Zaboravili ste lozinku?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-pošta (opet)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Potvrda adrese e-pošte\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-pošta (opciono)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Korisničko ime (opciono)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Morate uneti istu adresu e-pošte svaki put.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Lozinka (ponovo)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Trenutna lozinka\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Nova lozinka\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Nova lozinka (ponovo)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"kod\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"korisnik\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"adresa e-pošte\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"provereno\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"primarna\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"adrese e-pošte\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"stvoreno\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"poslat\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"ključ\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"potvrda e-pošte\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"potvrde e-pošte\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Bez glave\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Pogledajte svoj korisnički ID\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Pogledajte svoju adresu e-pošte\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Pogledajte osnovne informacije o svom profilu\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Dodeli dozvole\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Džoker znakovi nisu dozvoljeni osim ako nije omogućena opcija 'Dozvoli URI \"\n\"džoker znakove'.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' sadrži više od jednog džoker znaka (*). Dozvoljen je samo jedan \"\n\"džoker znak po URI-ju.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"\"\n\"Džoker znakovi su dozvoljeni samo u delu URI-ja koji se odnosi na ime hosta.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Kod autorizacije\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Kod uređaja\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Akreditivi klijenta\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Osveži token\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Poverljivo\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Javno\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Opseg(zi) koje klijent može da zahteva. Navedite jednu vrednost po redu, \"\n\"npr: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"U slučaju da klijent ne navede opseg, koriste se ovi podrazumevani opsezi. \"\n\"Navedite po jednu vrednost po redu, npr: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Lista dozvoljenih tipova odobrenja. Navedite jednu vrednost po redu, npr: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Lista dozvoljenih porekla za zahteve iz različitog porekla, po jedno u \"\n\"svakom redu.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Dozvoli džoker znakove (*) u preusmeravajućim URI-jima i CORS izvorima. Kada \"\n\"je omogućeno, URI-ji mogu sadržati jednu zvezdicu za podudaranje poddomena.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Lista dozvoljenih tipova odgovora. Navedite jednu vrednost po redu, npr: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"klijent\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"klijenti\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Ne možete dodati adresu e-pošte na nalog zaštićen dvofaktorskom \"\n\"autentifikacijom.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Ne možete deaktivirati dvofaktorsku autentifikaciju.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Ne možete generisati kodove za oporavak bez omogućene dvofaktorske \"\n\"autentifikacije.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Ne možete aktivirati dvofaktorsku autentifikaciju dok ne verifikujete svoju \"\n\"adresu e-pošte.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Glavni ključ\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Rezervni ključ\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Ključ br. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Kodovi za oporavak\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP autentikator\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Autentikator kod\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Bez lozinke\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Uključivanje rada bez lozinke omogućava vam da se prijavite koristeći samo \"\n\"ovaj ključ, ali nameće dodatne zahteve kao što su biometrija ili zaštita PIN-\"\n\"om.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Već postoji nalog sa ovom adresom e-pošte. Prvo se prijavite na taj nalog, a \"\n\"zatim povežite svoj %s nalog.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Nevažeći token.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Vaš nalog nema podešenu lozinku.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Vaš nalog nema potvrđenu e-mail adresu.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"\"\n\"Ne možete da prekinete vezu sa poslednjim preostalim nalogom treće strane.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Nalog treće strane je već povezan sa drugim nalogom.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Društveni nalozi\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"provider\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"provider ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"ime\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"id klijenta\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"ID aplikacije ili potrošački ključ\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"tajni ključ\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"Tajna API-ja, tajna klijenta ili tajna potrošača\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Ključ\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"društvena aplikacija\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"društvena aplikacije\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"poslednja prijava\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"datum pridruživanja\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"dodatni podaci\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"društveni nalog\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"društveni nalozi\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) ili token pristupa (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"token tajna\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) ili token za osvežavanje (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"ističe u\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"token društvenih aplikacija\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"tokeni društvenih aplikacija\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Neveljavni podaci o profilu\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Prijavite se\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Otkaži\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Nevažeći odgovor pri dobijanju tokena za zahtev od %s. Odgovor je bio: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Nevažeći odgovor pri dobijanju tokena za pristup od \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Nema sačuvanih tokena za zahtev od \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Nema sačuvanih tokena za pristup od \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Nema pristupa privatnim resursima u \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Nevažeći odgovor pri dobijanju tokena za zahtev od \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Nalog je neaktivan\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Ovaj nalog je neaktivan.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Poslali smo kod na %(recipient)s. Kod unesite uskoro jer važi kratko vreme.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Potvrdi\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Zahtevaj novi kod\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Potvrdi pristup\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Ponovo potvrdite autentičnost da biste zaštitili svoj nalog.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Alternativne opcije\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Potvrda e-pošte\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Unesite potvrdni kod e-pošte\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Koristi drugu adresu e-pošte\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Prijavite se\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Unesite kod za prijavu\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Resetovanje lozinke\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Unesite kod za resetovanje lozinke\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Potvrda telefona\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Unesite potvrdni kod za telefon\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Koristi drugi broj telefona\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Adrese e-pošte\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"S vašim nalogom su povezane sledeće adrese e-pošti:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Potvrđeno\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Nepotvrđeni\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Primarni\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Postavi za primarni\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Ponovo pošalji potvrdu\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Ukloni\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Dodaj adresu e-pošte\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Dodaj e-poštu\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Da li stvarno želite da uklonite izabranu adresu e-pošte?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Primili ste ovu e-poštu jer ste vi ili neko drugi pokušali da se \"\n\"registrujete za\\n\"\n\"nalog koristeći adresu e-pošte:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Međutim nalog koji koristi tu adresu e-pošte već postoji. U slučaju da ste\\n\"\n\"zaboravili na ovo, molim koristite proceduru za resetovanje lozinke \\n\"\n\"za oporavak vašeg naloga:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Nalog već postoji\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Hvala od %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Hvala vam što koristite %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"Dobijate ovu e-poštu jer je na vašem nalogu izvršena sledeća promena:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Ako ne prepoznajete ovu promenu, odmah preduzmite odgovarajuće mere \"\n\"predostrožnosti. Promena vašeg naloga potiče od:\\n\"\n\"\\n\"\n\"- IP adresa: %(ip)s\\n\"\n\"- Pregledač: %(user_agent)s\\n\"\n\"- Datum: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Vaša adresa e-pošte je promenjena iz %(from_email)s u %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Adresa e-pošte promenjena\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Vaša adresa e-pošte je potvrđena.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Potvrda e-pošte\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Primili ste ovu e-poruku jer je korisnik %(user_display)s dao vašu adresu e-\"\n\"pošte pri registraciji naloga na %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Vaš potvrdni kod e-pošte je naveden ispod. Unesite ga u otvoreni prozor \"\n\"pretraživača.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Da biste potvrdili da je ovo tačno, idite na %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Molim vas potvrdite vašu adresu e-pošte\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"Adresa e-pošte %(deleted_email)s je uklonjena sa vašeg naloga.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Adresa e-pošte je uklonjena\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Vaš kod za prijavljivanje je naveden ispod. Unesite ga u otvoreni prozor \"\n\"pregledača.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Ova poruka se može bezbedno zanemariti ako niste vi pokrenuli ovu radnju.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"registracioni kod\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Vaša lozinka je promenjena.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Lozinka je promenjena\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Vaš kod za resetovanje lozinke je naveden ispod. Unesite ga u otvoreni \"\n\"prozor pretraživača.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Kod za resetovanje lozinke\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Primili ste ovu e-poruku jer ste vi ili neko drugi zatražili resetovanje \"\n\"lozinke za vaš korisnički nalog.\\n\"\n\"Može se bezbedno zanemariti ako niste zahtevali resetovanje lozinke. \"\n\"Kliknite na vezu ispod da biste resetovali lozinku.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"U slučaju da ste zaboravili, vaše korisničko ime je %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"E-pošta za resetovanje lozinke\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Vaša lozinka je resetovana.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Vaša lozinka je postavljena.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Lozinka je postavljena\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Primili ste ovu e-poštu jer ste vi ili neko drugi pokušali da pristupite \"\n\"nalogu sa adresom e-pošte %(email)s. Međutim, mi nemamo nikakvu evidenciju o \"\n\"takvom nalogu u našoj bazi podataka.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"Ako ste to bili vi, možete se prijaviti za nalog koristeći vezu ispod.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Nepoznati nalog\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Adresa e-pošte\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Trenutna adresa e-pošte\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Promena u\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Vaša adresa e-pošte još uvek čeka verifikaciju.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Otkaži promenu\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Promenite na\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Promenite adresu e-pošte\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Potvrda adrese e-pošte\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Molim potvrdite da je <a href=\\\"mailto:%(email)s\\\">%(email)s</a> adresa e-\"\n\"pošte za korisnika %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"Nije moguće potvrditi %(email)s jer ga je već potvrdio drugi nalog.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Ova veza za potvrdu adrese e-pošte je istekla ili je nevažeća. Molimo <a \"\n\"href=\\\"%(email_url)s\\\">pošaljite novi zahtev za potvrdu e-pošte</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Ako još uvek niste napravili nalog, molimo vas prvo %(link)sse \"\n\"registrujte%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Prijavite se pomoću pristupnog ključa\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Pošaljite mi kod za registraciju\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Odjava\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Jeste li sigurni da želite da se odjavite?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Ne možete da uklonite primarnu adresu e-pošte (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Potvrdna poruka je poslata na adresu e-pošte %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Potvrdili ste %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Uklonjena adresa e-pošte %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Uspešno ste se prijavili kao %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Odjavili ste se.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Kod za registraciju je poslat na %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Lozinka je uspešno promenjena.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Uspešno ste postavili lozinku.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Kod za potvrdu je poslat na %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Potvrdili ste broj telefona %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Primarna adresa e-pošte postavljena.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Promeni lozinku\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Zaboravili ste lozinku?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Zaboravili ste lozinku? Unesite svoju adresu e-pošte ispod, a mi ćemo vam \"\n\"poslati poruku e-pošte koja vam omogućava da je resetujete.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Resetuj moju lozinku\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Molimo vas da nas kontaktirate ako imate problema sa resetovanjem vaše \"\n\"lozinke.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Poslali smo vam e-poštu. Ako je niste primili, proverite svoju fasciklu sa \"\n\"neželjenom poštom. U suprotnom, kontaktirajte nas ako ga ne dobijete za \"\n\"nekoliko minuta.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Loš token\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Veza za resetovanje lozinke je bila nevažeća, verovatno zato što je već \"\n\"korišćena. Zatražite <a href=\\\"%(passwd_reset_url)s\\\">novo resetovanje \"\n\"lozinke</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Vaša lozinka je sada promenjena.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Postavi lozinku\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Promeni telefon\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Trenutni telefon\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Vaš telefon još uvek čeka potvrdu.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Promeni telefon\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Unesite svoju lozinku:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Dobićete poseban kod za prijavu bez lozinke.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Zahtevaj kod\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Druge opcije za prijavljivanje\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Registracija\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Registrujte se\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Već imate nalog? Onda Vas molimo da %(link)sse projavite%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Registrujte se koristeći pristupni ključ\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Registracija pristupnim ključem\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Druge opcije\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Registracija zatvorena\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Žao nam je, ali registracija je trenutno zatvorena.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Napomena\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Već ste prijavljeni kao %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Upozorenje:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Trenutno nemate podešenu nijednu adresu e-pošte. Zaista bi trebalo da dodate \"\n\"adresu e-pošte kako biste mogli da primate obaveštenja, resetujete lozinku \"\n\"itd.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Potvrdite Vašu adresu e-pošte\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Poslali smo vam e-poštu radi verifikacije. Pratite navedenu vezu da biste \"\n\"završili proces registracije. Ako ne vidite e-poruku za verifikaciju u \"\n\"glavnom prijemnom sandučetu, proverite fasciklu za neželjenu poštu. \"\n\"Kontaktirajte nas ako ne primite e-poruku za verifikaciju u roku od nekoliko \"\n\"minuta.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Ovaj deo sajta zahteva od Vas da potvrdite\\n\"\n\"da ste Vi zaista osoba koja tvrdite da jeste. U tu svrhu zahtevamo od vas\\n\"\n\"potvrdite vlasništvo nad vašom adresom e-pošte. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Poslali smo vam poruku e-poštom za verifikaciju.\\n\"\n\"Molimo kliknite na vezu unutar te e-poruke. Ako ne vidite e-poruku za \"\n\"verifikaciju u glavnom prijemnom sandučetu, proverite fasciklu za neželjenu \"\n\"poštu. Inače\\n\"\n\"kontaktirajte nas ako ne primite e-poruku u roku od nekoliko minuta.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Napomena:</strong> i dalje možete <a href=\\\"%(email_url)s\\\"> da \"\n\"promenite adresu vaše e-pošte</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Poruke:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Meni:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Povezani nalozi\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Dvofaktorska autentifikacija\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sesije\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Ovlasti\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s želi da pristupi vašem %(site_name)s nalogu.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Unesite kod uređaja\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Unesite kod prikazan na vašem uređaju.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Nastavi\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Potvrdi uređaj\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Molimo vas da potvrdite kod prikazan na vašem %(client_name)s nalogu da \"\n\"biste ovlastili ovaj uređaj.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Odbij\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Uređaj je ovlašćen\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Uspešno ste ovlastili svoj %(client_name)s uređaj.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Uređaj odbijen\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Ovlašćenje za vaš %(client_name)s uređaj je odbijeno.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Greška\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Ostani prijavljen\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Vaš nalog je zaštićen dvofaktorskom autentifikacijom. Unesite kod za potvrdu \"\n\"identiteta:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Generisan je novi skup kodova za oporavak dvofaktorske autentifikacije.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Generisani novi kodovi za oporavak\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Autentikator aplikacija je aktivirana.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Aplikacija za autentikaciju je aktivirana\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Autentikator aplikacija je deaktivirana.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Aplikacija za autentikaciju je deaktivirana\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Dodat je novi bezbednosni ključ.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Sigurnosni ključ je dodat\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Bezbednosni ključ je uklonjen.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Sigurnosni ključ je uklonjen\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Autentikator aplikacija\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Potvrda identiteta pomoću aplikacije za autentifikaciju je aktivna.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Aplikacija za autentifikaciju nije aktivna.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Deaktiviraj\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktiviraj\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Sigurnosni ključevi\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Dodali ste %(count)s bezbednosni ključ.\"\nmsgstr[1] \"Dodali ste %(count)s bezbednosna ključa.\"\nmsgstr[2] \"Dodali ste %(count)s bezbednosnih ključeva.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Nije dodat nijedan bezbednosni ključ.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Upravljaj\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Dodaj\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Kodovi za oporavak\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Dostupan je %(unused_count)s od ukupno %(total_count)s kodova za oporavak.\"\nmsgstr[1] \"\"\n\"Dostupna su %(unused_count)s od ukupno %(total_count)s kodova za oporavak.\"\nmsgstr[2] \"\"\n\"Dostupno je %(unused_count)s od ukupno %(total_count)s kodova za oporavak.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Nisu podešeni kodovi za oporavak.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Pogledaj\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Preuzmi\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Generiši\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Generisan je novi skup kodova za oporavak.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Sigurnosni ključ je dodat.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Sigurnosni ključ je uklonjen.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Unesite kod za potvrdu identiteta:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Upravo ćete generisati novi skup kodova za oporavak za svoj nalog.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Ova radnja će poništiti vaše postojeće kodove.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Jeste li sigurni?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Neiskorišćeni kodovi\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Preuzmite kodove\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Generišite nove kodove\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Aktivirajte aplikaciju autentikator\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Da zaštite svoj nalog dvofaktorskom autentifikacijom skenirajte sledeći QR \"\n\"kod pomoću aplikacije za autentifikaciju. Zatim unesite verifikacioni kod \"\n\"koji je generisala aplikacija u nastavku.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Autentikator tajna\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Možete da sačuvate ovu tajnu i da je koristite da ponovo podesite aplikacije \"\n\"za autentifikaciju kasnije.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Deaktivirajte autentikator aplikaciju\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Spremate se da deaktivirate autentifikaciju zasnovanu na autentikator \"\n\"aplikaciji. Jeste li sigurni?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Verujete ovom pregledaču?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Ako odlučite da verujete ovom pregledaču, od vas se neće tražiti \"\n\"verifikacioni kod sledeći put kada se prijavite.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Veruj %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Ne veruj\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Dodaj sigurnosni ključ\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Ukloni sigurnosni ključ\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Da li ste sigurni da želite da uklonite ovaj bezbednosni ključ?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Upotreba\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Pristupni ključ\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Bezbednosni ključ\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Ovaj ključ ne pokazuje da li je u pitanju pristupni ključ.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Neodređeno\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Dodato u %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Poslednje korišćeno %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Izmeni\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Izmeni sigurnosni ključ\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Sačuvaj\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Napravi pristupni ključ\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Upravo ćete kreirati pristupni ključ za svoj nalog. Pošto kasnije možete da \"\n\"dodate dodatne ključeve, možete koristiti opisno ime da biste ih razlikovali.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Napravi\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Ova funkcionalnost zahteva JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Neuspešna prijava treće strane\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Došlo je do greške pri pokušaju da se prijavite preko naloga treće strane.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Možete se prijaviti na svoj nalog pomoću bilo koje od sledećih naloga trećih \"\n\"strana:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Trenutno nemate nijedan nalog treće strane povezan sa ovim nalogom.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Dodajte nalog treće strane\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Nalog treće strane od %(provider)s je povezan sa vašim nalogom.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Nalog treće strane je povezan\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"Nalog treće strane od %(provider)s više nije povezan sa vašim nalogom.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Nalog treće strane više nije povezan\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Povežite %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Upravo ćete da povežete novi nalog treće strane od %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Prijavite se preko %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Upravo ćete se prijaviti koristeći nalog treće strane od %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Prijava je otkazana\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Odlučili ste da otkažete prijavljivanje na našu veb stranicu pomoću jednog \"\n\"od vaših postojećih naloga. Ako je ovo greška, molimo vas da pređete na <a \"\n\"href=\\\"%(login_url)s\\\">i prijavite se</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Nalog treće strane je povezan.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Nalog treće strane više nije povezan.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Upravo koristite svoj nalog kod %(provider_name)s da biste se prijavili na\\n\"\n\"%(site_name)s. Kao poslednji korak, molimo popunite sledeći obrazac:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Ili koristite treću stranu\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Odjavljen sa svih ostalih sesija.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Započeto u\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP adresa\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Pretraživač\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Poslednje viđen u\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Trenutno\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Odjavit se iz drugih sesija\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Korisničke sesije\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"ključ sesije\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Povezani računi\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Lozinka mora biti najmanje {0} znakova.\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Zdravo od %(site_name)s!\\n\"\n#~ \"\\n\"\n#~ \"Primate ovu e-mail poruku jer ste vi ili neko drugi tražililozinku za vaš \"\n#~ \"korisnički nalog.\\n\"\n#~ \"Ova poruka se može ignorisati ako niste zatražili reset lozinke. Kliknite \"\n#~ \"na link ispod da biste poništili svoju lozinku.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"S vašim nalogom su povezane sledeće adrese e-pošti:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Potvrda adrese e-pošte\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Molimo Vas da se prijavite sa jednim od\\n\"\n#~ \"postojećih računa trećih strana. Ili, se <a \"\n#~ \"href=\\\"%(signup_url)s\\\">registrujte</a>\\n\"\n#~ \"za račun kod  %(site_name)s i prijavite se dole:\"\n\n#~ msgid \"or\"\n#~ msgstr \"ili\"\n\n#~ msgid \"change password\"\n#~ msgstr \"promeni lozinku\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"OpenID Prijava\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Ova adresa e-pošte je već povezana sa drugim nalogom.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Poslali smo vam e-poštu. Molimo Vas da nas kontaktirate ako ga ne \"\n#~ \"primiteza nekoliko minuta.\"\n"
  },
  {
    "path": "allauth/locale/sv/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n# Translators:\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: django-allauth\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-03-29 15:01+0000\\n\"\n\"Last-Translator: Karl Stenlund <karl@stenlund.dev>\\n\"\n\"Language-Team: Swedish <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/sv/>\\n\"\n\"Language: sv\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Weblate 5.11-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Detta konto är inaktivt.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Du kan inte ta bort din primära epost-adress.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Denna epost-adress är redan knuten till detta konto\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Epost-adressen och/eller lösenordet är felaktigt.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Telefonnumret och/eller lösenordet är felaktigt.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"En användare är redan registrerad med den här epost-adressen\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Skriv in ditt nuvarande lösenord.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Felaktig kod.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Felaktigt lösenord.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Felaktig  eller utgången nyckel.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Felaktig inlogging.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Token för lösenordsåterställning var ogiltig.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Du kan inte lägga till fler än %d epost-adresser.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"En användare är redan registrerad med det här telefonnumret.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"För många misslyckade inloggningsförsök. Försök igen senare.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Epost-adressen tillhör inte något användarkonto.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Telefonnumret tillhör inte något användarkonto.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Din primära epost-adress måste verifieras.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Användarnamnet kan ej användas. Välj ett annat användarnamn.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Användarnamnet och/eller lösenordet är felaktigt.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Vänligen välj bara en.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Det nya värdet måste skilja sig från det nuvarande.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Ha tålamod, du skickar för många förfrågningar.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Använd ditt lösenord\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Använd autentiseringsapp eller kod\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Använd en säkerhetsnyckel\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Markerade {email} som verifierad.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Kunde inte markera {email} som verifierad.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Markera valda epost-adresser som verifierade\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Konton\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"Epost\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Epost-adress\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Ange ett telefonnummer inklusive landskod (t.ex. +46 för Sverige).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Du måste ange samma lösenord\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Lösenord\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Kom ihåg mig\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Användarnamn\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Logga in\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Användarnamn, epost eller telefon\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Användarnamn eller epost-adress\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Användarnamn eller telefon\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Epost eller telefon\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Glömt lösenordet?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"Epost (igen)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Bekräftelse av epost-adress\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"Epost (valfritt)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Användarnamn (valfritt)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Du måste ange samma epost-adress varje gång.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Lösenord (igen)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Nuvarande lösenord\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Nytt lösenord\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Nytt lösenord (igen)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kod\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"användare\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"epost-adress\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"verifierad\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"primär\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"epost-adresser\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"skapad\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"skickad\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"nyckel\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"epost-bekräftelse\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"epost-bekräftelser\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Visa ditt användar-ID\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Visa din epost-adress\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Visa din grundläggande profilinformation\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Bevilja behörigheter\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Jokertecken är inte tillåtna om inte 'Tillåt URI-jokertecken' är aktiverat.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' innehåller mer än ett jokertecken (*). Endast ett jokertecken per \"\n\"URI är tillåtet.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Jokertecken är bara tillåtna i värdnamnsdelen av URI:n.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Auktoriseringskod\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Enhetskod\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Klientuppgifter\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Uppdateringstoken\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Konfidentiell\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Publik\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"De omfång som klienten tillåts begära. Ange ett värde per rad, t.ex.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Om klienten inte anger något omfång används dessa standardomfång. Ange ett \"\n\"värde per rad, t.ex.: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"En lista över tillåtna beviljandetyper. Ange ett värde per rad, t.ex.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"En lista över tillåtna ursprung för cross-origin-förfrågningar, ett per rad.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Tillåt jokertecken (*) i omdirigerings-URI:er och CORS-ursprung. När \"\n\"aktiverat kan URI:er innehålla en enskild asterisk för att matcha \"\n\"underdomäner.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"En lista över tillåtna svarstyper. Ange ett värde per rad, t.ex.: \"\n\"code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"klient\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"klienter\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Du kan inte lägga till en epost-adress till ett konto skyddat av \"\n\"tvåfaktorsautentisering.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Du kan inte inaktivera tvåfaktorsautentisering.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Du kan inte generera återställningskoder utan att ha tvåfaktorsautentisering \"\n\"aktiverad.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Du kan inte aktivera tvåfaktorsautentisering förrän du har verifierat din \"\n\"epost-adress.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Huvudnyckel\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Reservnyckel\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Nyckel nr. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Återställningskoder\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP-autentiserare\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Autentiseringskod\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Utan lösenord\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Att aktivera lösenordsfri drift gör att du kan logga in med bara denna \"\n\"nyckel, men kräver ytterligare säkerhet som biometri eller PIN-skydd.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Det finns redan ett konto med denna epost-adress. Vänligen logga in på det \"\n\"kontot först och anslut sedan ditt %s-konto.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Ogiltig token.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Ditt konto har inget lösenord.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Ditt konto har ingen verifierad epost-adress.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Du kan inte koppla bort ditt sista återstående tredjeparts-konto.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Tredjeparts-kontot är redan knutet till ett annat konto.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Sociala konton\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"leverantör\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"leverantörs-ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"namn\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"klient-ID\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"App-ID eller konsumentnyckel\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"hemlig nyckel\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API-hemlighet, klienthemlighet eller konsumenthemlighet\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Nyckel\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"social applikation\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"sociala applikationer\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"senaste inloggning\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"registreringsdatum\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"extra data\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"socialt konto\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"sociala konton\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) eller åtkomsttoken (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"tokenhemlighet\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) eller uppdateringstoken (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"upphör\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"social applikationstoken\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"sociala applikationstokens\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Ogiltig profildata\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Logga in\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Avbryt\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Felaktigt svar vid hämtning av fråge-nyckel från \\\"%s\\\". Svaret var: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Felaktigt svar vid hämtning av access-nyckel från \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Ingen fråge-nyckel sparad för \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Ingen access-nyckel sparad för \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Ingen access till privata resurser hos \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Felaktigt svar vid hämtning av fråge-nyckel från \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Kontot inaktivt\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Detta konto är inaktivt.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Vi har skickat en kod till %(recipient)s. Koden upphör snart, så ange den \"\n\"snarast.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Verifiera\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Begär ny kod\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Bekräfta åtkomst\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Vänligen autentisera dig igen för att skydda ditt konto.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Alternativa val\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Epost-verifiering\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Ange epost-verifieringskod\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Använd en annan epost-adress\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Logga in\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Ange inloggningskod\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Återställning av lösenord\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Ange kod för lösenordsåterställning\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Telefonverifiering\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Ange telefonverifieringskod\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Använd ett annat telefonnummer\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Epost-adresser\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Följande epost-adresser är knutna till ditt konto:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Verifierad\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Ej verifierad\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Primär\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Gör primär\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Sänd verifiering igen\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Ta bort\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Lägg till epost-adress\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Lägg till epost\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Vill du verkligen ta bort den valda epost-adressen?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Du får det här mailet eftersom du eller någon annan försökte registrera ett\\n\"\n\"konto med epost-adressen:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Men det finns redan ett konto med den epost-adressen. Om du har\\n\"\n\"glömt detta, använd proceduren för glömt lösenord för att återställa\\n\"\n\"ditt konto:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Konto finns redan\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Hej från %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Tack för att du använder %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"Du får det här mailet eftersom följande ändring gjordes på ditt konto:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Om du inte känner igen denna ändring, vidta lämpliga säkerhetsåtgärder \"\n\"omedelbart. Ändringen av ditt konto kommer från:\\n\"\n\"\\n\"\n\"- IP-adress: %(ip)s\\n\"\n\"- Webbläsare: %(user_agent)s\\n\"\n\"- Datum: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Din epost har ändrats från %(from_email)s till %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Epost ändrad\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Din epost har bekräftats.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Epost-bekräftelse\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Du får det här mailet eftersom användaren %(user_display)s har angett din \"\n\"epost-adress för att registrera ett konto på %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Din epost-verifieringskod anges nedan. Vänligen ange den i ditt öppna \"\n\"webbläsarfönster.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"För att bekräfta att detta stämmer, gå till %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Vänligen bekräfta din epost-adress\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"Epost-adressen %(deleted_email)s har tagits bort från ditt konto.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Epost borttagen\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Din inloggningskod anges nedan. Vänligen ange den i ditt öppna \"\n\"webbläsarfönster.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"Detta mail kan ignoreras om du inte initierade denna åtgärd.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Inloggningskod\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Ditt lösenord har ändrats.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Lösenord ändrat\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Din kod för lösenordsåterställning anges nedan. Vänligen ange den i ditt \"\n\"öppna webbläsarfönster.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Kod för lösenordsåterställning\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Du får det här mailet eftersom du eller någon annan har begärt en \"\n\"lösenordsåterställning för ditt användarkonto.\\n\"\n\"Du kan bortse från detta mail om du inte begärt en återställning. Klicka på \"\n\"länken nedan för att återställa ditt lösenord.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Ditt användarnamn är %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Återställning av lösenord\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Ditt lösenord har återställts.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Ditt lösenord har ställts in.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Lösenord inställt\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Du får det här mailet eftersom du, eller någon annan, försökte komma åt ett \"\n\"konto med epost %(email)s. Vi har dock ingen uppgift om ett sådant konto i \"\n\"vår databas.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"Om det var du kan du registrera ett konto med länken nedan.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Okänt konto\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Epost-adress\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Nuvarande epost\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Ändras till\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Din epost-adress väntar fortfarande på verifiering.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Avbryt ändring\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Ändra till\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Ändra epost\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Verifiera epost-adress\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Verifiera att <a href=\\\"mailto:%(email)s\\\">%(email)s</a> är en epost-adress \"\n\"för %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Kan inte bekräfta %(email)s eftersom den redan är bekräftad av ett annat \"\n\"konto.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Länken för att verifiera epost-adressen har förfallit eller är ogiltig. <a \"\n\"href=\\\"%(email_url)s\\\">Skapa en ny epost-verification.</a>\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"Har du redan ett konto? Då kan du %(link)slogga in%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Logga in med en nyckel\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Skicka mig en inloggningskod\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Logga ut\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Är du säker att du vill logga ut?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Du kan inte ta bort din primära epost-adress (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Verifierings-mail skickat till %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Du har verifierat %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Ta bort epost-adress %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Du har loggat in som %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Du har loggat ut.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"En inloggningskod har skickats till %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Lösenordet ändrat.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Lösenord skapat.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"En verifieringskod har skickats till %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Du har verifierat telefonnummer %(phone)s.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Primär epost-adress satt.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Ändra lösenord\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Glömt lösenordet?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Glömt ditt lösenord? Ange din epost-adress nedan så skickar vi ett mail med \"\n\"instruktioner för att återställa det.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Återställ mitt lösenord\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Vänligen kontakta oss om du har problem med att återställa ditt lösenord.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Vi har skickat dig ett mail. Om du inte har fått det, kontrollera din \"\n\"skräppost. Kontakta oss om du inte får det inom ett par minuter.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Felaktig nyckel\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Länken för att återställa lösenordet var ogiltig, möjligtvis för att den \"\n\"redan har använts. Begär en <a href=\\\"%(passwd_reset_url)s\\\">ny lösenords-\"\n\"återställning</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Ditt lösenord är nu ändrat.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Skapa lösenord\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Ändra telefon\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Nuvarande telefon\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Ditt telefonnummer väntar fortfarande på verifiering.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Ändra telefon\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Ange ditt lösenord:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Du kommer att få en speciell kod för en lösenordsfri inloggning.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Begär kod\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Andra inloggningsalternativ\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Skapa konto\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Skapa konto\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"Har du redan ett konto? Då kan du %(link)slogga in%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Registrera dig med en nyckel\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Registrera med nyckel\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Andra alternativ\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Anmälan stängd\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Tyvärr är anmälan stängd för närvarande.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Information\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Du är redan inloggad som %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Varning:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Du har inte angett någon epost-adress. Du borde lägga till en epost-adress \"\n\"så att du kan få meddelanden, återställa ditt lösenord och liknande.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Verifiera din epost-adress\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Vi har skickat ett mail till dig för verifiering. Följ länken för att \"\n\"slutföra registreringen. Om du inte ser verifieringsmailet i din inkorg, \"\n\"kontrollera din skräppost. Kontakta oss om du inte får verifieringsmailet \"\n\"inom ett par minuter.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"För att få tillgång till denna del av webbplatsen måste vi verifiera att\\n\"\n\"du är den du säger att du är. Därför måste du\\n\"\n\"verifiera att du äger din epost-adress. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Vi har skickat ett mail till dig för\\n\"\n\"verifiering. Vänligen klicka på länken i mailet. Om du inte ser \"\n\"verifieringsmailet i din inkorg, kontrollera din skräppost. Annars\\n\"\n\"kontakta oss om du inte får det inom ett par minuter.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Information:</strong> du kan fortfarande <a \"\n\"href=\\\"%(email_url)s\\\">ändra din epost-adress</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Meddelanden:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Meny:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Anslutna tredjeparts-konton\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Tvåfaktorsautentisering\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Sessioner\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Auktorisera\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s vill komma åt ditt %(site_name)s-konto.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Ange enhetskod\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Ange koden som visas på din enhet.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Fortsätt\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Bekräfta enhet\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Vänligen bekräfta koden som visas på din %(client_name)s för att auktorisera \"\n\"denna enhet.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Neka\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Enhet auktoriserad\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Du har auktoriserat din %(client_name)s-enhet.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Enhet nekad\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Auktorisering för din %(client_name)s-enhet har nekats.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Fel\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Förbli inloggad\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Ditt konto är skyddat av tvåfaktorsautentisering. Vänligen ange en \"\n\"autentiseringskod:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"En ny uppsättning återställningskoder för tvåfaktorsautentisering har \"\n\"genererats.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Nya återställningskoder genererade\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Autentiseringsapp aktiverad.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Autentiseringsapp aktiverad\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Autentiseringsapp inaktiverad.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Autentiseringsapp inaktiverad\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"En ny säkerhetsnyckel har lagts till.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Säkerhetsnyckel tillagd\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"En säkerhetsnyckel har tagits bort.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Säkerhetsnyckel borttagen\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Autentiseringsapp\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Autentisering med en autentiseringsapp är aktiv.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Ingen autentiseringsapp är aktiv.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Inaktivera\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Aktivera\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Säkerhetsnycklar\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Du har lagt till %(count)s säkerhetsnyckel.\"\nmsgstr[1] \"Du har lagt till %(count)s säkerhetsnycklar.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Inga säkerhetsnycklar har lagts till.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Hantera\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Lägg till\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Återställningskoder\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"Det finns %(unused_count)s av %(total_count)s återställningskoder \"\n\"tillgängliga.\"\nmsgstr[1] \"\"\n\"Det finns %(unused_count)s av %(total_count)s återställningskoder \"\n\"tillgängliga.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Inga återställningskoder har ställts in.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Visa\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Ladda ner\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Generera\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"En ny uppsättning återställningskoder har genererats.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Säkerhetsnyckel tillagd.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Säkerhetsnyckel borttagen.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Ange en autentiseringskod:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\"Du håller på att generera en ny uppsättning återställningskoder för ditt \"\n\"konto.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Denna åtgärd kommer att ogiltigförklara dina befintliga koder.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Är du säker?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Oanvända koder\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Ladda ner koder\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Generera nya koder\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Aktivera autentiseringsapp\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"För att skydda ditt konto med tvåfaktorsautentisering, skanna QR-koden nedan \"\n\"med din autentiseringsapp. Ange sedan verifieringskoden som genereras av \"\n\"appen.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Autentiseringshemlighet\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Du kan spara denna hemlighet och använda den för att installera om din \"\n\"autentiseringsapp vid ett senare tillfälle.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Inaktivera autentiseringsapp\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Du håller på att inaktivera autentisering via autentiseringsapp. Är du säker?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Lita på denna webbläsare?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Om du väljer att lita på denna webbläsare kommer du inte att behöva ange en \"\n\"verifieringskod nästa gång du loggar in.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Lita på i %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Lita inte\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Lägg till säkerhetsnyckel\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Ta bort säkerhetsnyckel\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Är du säker på att du vill ta bort denna säkerhetsnyckel?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Användning\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Nyckel\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Säkerhetsnyckel\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Denna nyckel anger inte om den är en passkey.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Ospecificerad\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Tillagd %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Senast använd %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Redigera\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Redigera säkerhetsnyckel\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Spara\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Skapa nyckel\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Du håller på att skapa en nyckel för ditt konto. Eftersom du kan lägga till \"\n\"fler nycklar senare kan du använda ett beskrivande namn för att skilja dem \"\n\"åt.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Skapa\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Denna funktion kräver JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Fel vid tredjeparts-inloggning\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"Ett fel inträffade vid inloggning via ditt tredjeparts-konto.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Du kan logga in på ditt konto via något av följande tredjeparts-konton:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Du har för närvarande inga tredjeparts-konton knutna till ditt konto.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Lägg till tredjeparts-konto\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"Ett tredjeparts-konto från %(provider)s har anslutits till ditt konto.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Tredjeparts-konto anslutet\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"Ett tredjeparts-konto från %(provider)s har kopplats bort från ditt konto.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Tredjeparts-konto bortkopplat\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Anslut %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Du håller på att ansluta ett nytt tredjeparts-konto från %(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Logga in via %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"Du håller på att logga in med ett tredjeparts-konto från %(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Inloggning avbruten\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Du valde att avbryta inloggningen via ett av dina tredjeparts-konton. Om \"\n\"detta var ett misstag kan du <a href=\\\"%(login_url)s\\\">logga in igen</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Tredjeparts-kontot har anslutits.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Tredjeparts-kontot har kopplats bort.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Du håller på att logga in via ditt %(provider_name)s-konto på\\n\"\n\"%(site_name)s. Fyll i följande formulär för att slutföra:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Eller använd en tredje part\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Utloggad från alla andra sessioner.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Startad\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP-adress\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Webbläsare\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Senast sedd\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Nuvarande\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Logga ut andra sessioner\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Användarsessioner\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"sessionsnyckel\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Anslutna tredjeparts-konton\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Lösenordet måste vara minst {0} tecken långt\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Du får det här mailet eftersom du eller någon annan har begärt ett \"\n#~ \"lösenord för ditt konto. Dock har vi inget konto kopplat till e-\"\n#~ \"postadressen %(email)s.\\n\"\n#~ \"\\n\"\n#~ \"Om det var du kan du registrera ett konto med länken nedan.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Följande epost-adresser är knutna till ditt konto:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"Verifiera epost-adress\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"Logga in med ett\\n\"\n#~ \"av dina befintliga tredjeparts-konton eller <a \"\n#~ \"href=\\\"%(signup_url)s\\\">skapa ett konto</a> \\n\"\n#~ \"för %(site_name)s och logga in nedan:\"\n\n#~ msgid \"or\"\n#~ msgstr \"eller\"\n\n#~ msgid \"change password\"\n#~ msgstr \"ändra lösenord\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"Inloggning via OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Denna epost-adress är redan knuten till ett annat konto\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Ett mail har nu skickats. Kontakta oss om det inte dyker upp inom ett par \"\n#~ \"minuter.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"Inloggningen och/eller lösenordet är felaktigt.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"\"\n#~ \"Användarnamn kan endast innehålla bokstäver, siffror samt @/./+/-/_.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"Användarnamnet är upptaget. Välj ett annat.\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"Du har verifierat att <a href=\\\"mailto:%(email)s\\\">%(email)s</a> är en \"\n#~ \"epost-adress för %(user_display)s.\"\n\n#~ msgid \"Thanks for using our site!\"\n#~ msgstr \"Tack för att du använder vår hemsida!\"\n\n#~ msgid \"Confirmation email sent to %(email)s\"\n#~ msgstr \"Epost-bekräftelse skickad till %(email)s\"\n\n#~ msgid \"Delete Password\"\n#~ msgstr \"Ta bort lösenordet\"\n\n#~ msgid \"\"\n#~ \"You may delete your password since you are currently logged in using \"\n#~ \"OpenID.\"\n#~ msgstr \"Du kan ta bort ditt lösenord eftersom du är inloggad via OpenID.\"\n\n#~ msgid \"delete my password\"\n#~ msgstr \"ta bort mitt lösenord\"\n\n#~ msgid \"Password Deleted\"\n#~ msgstr \"Lösenordet borttaget\"\n"
  },
  {
    "path": "allauth/locale/th/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n# Translators:\n# Nattaphoom Chaipreecha, 2015\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: django-allauth\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2026-01-25 06:42+0000\\n\"\n\"Last-Translator: Krit Autarawisead <morphine459@gmail.com>\\n\"\n\"Language-Team: Thai <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/th/>\\n\"\n\"Language: th\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 5.16-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"บัญชีนี้อยู่ในสถานะที่ใช้งานไม่ได้\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"คุณไม่สามารถลบที่อยู่อีเมลหลักของคุณได้\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"อีเมลนี้ได้ถูกเชื่อมกับบัญชีนี้แล้ว\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"อีเมลและ/หรือรหัสผ่านที่ระบุมาไม่ถูกต้อง\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"เบอร์โทรศัพท์และ/หรือรหัสผ่านที่ระบุมาไม่ถูกต้อง\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"ชื่อผู้ใช้ได้ถูกลงทะเบียนด้วยอีเมลนี้แล้ว\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"โปรดใส่รหัสผ่านปัจจุบัน\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"รหัสไม่ถูกต้อง\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"รหัสปัจจุบันรหัสผ่านไม่ถูกต้อง\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"รหัสไม่ถูกต้องหรือหมดอายุ\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"ล็อกอินไม่ถูกต้อง\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"token ที่ใช้รีเซ็ทรหัสผ่านไม่ถูกต้อง\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"บัญชีของคุณไม่มีการยืนยัน ไม่สามารถเพิ่มที่อยู่อีเมลมากกว่า %d รายการ\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"เบอร์โทรศัพท์นี้ถูกลงทะเบียนแล้ว\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"พยายามเข้าสู่ระบบล้มเหลวหลายครั้งเกินไป ลองอีกครั้งในภายหลัง\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"อีเมลนี้ไม่ได้ผูกกับบัญชีผู้ใช้ใดเลย\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"เบอร์โทรศัพท์นี้ไม่ได้ผูกกับบัญชีผู้ใช้ใดเลย\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"อีเมลหลักของคุณต้องได้การยืนยัน\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"ไม่สามารถใช้ชื่อผู้ใช้นี้ได้ กรุณาใช้ชื่อผู้ใช้อื่น\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"ชื่อผู้ใช้และ/หรือรหัสผ่านที่ระบุมาไม่ถูกต้อง\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"กรุณาเลือกเพียงหนึ่งตัวเลือก\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"ค่าใหม่ต้องแตกต่างจากค่าปัจจุบัน\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"กรุณาอดทน คุณกำลังส่งคำขอมากเกินไป\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"ใช้รหัสผ่านของคุณ\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"ใช้แอปหรือรหัสยืนยันตัวตน\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"ใช้คีย์ความปลอดภัย\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"ทำเครื่องหมาย {email} ว่ายืนยันแล้ว\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"ไม่สามารถทำเครื่องหมาย {email} ว่ายืนยันแล้ว\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"อีเมลหลักของคุณต้องได้การยืนยัน\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"บัญชี\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"อีเมล\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"อีเมล\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"ป้อนหมายเลขโทรศัพท์พร้อมรหัสประเทศ (เช่น +1 สำหรับสหรัฐอเมริกา)\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"โทรศัพท์\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"ต้องพิมพ์รหัสผ่านเดิมซ้ำอีกครั้ง\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"รหัสผ่าน\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"จดจำการเข้าใช้\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"ชื่อผู้ใช้\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"ลงชื่อเข้าใช้\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"ชื่อผู้ใช้ อีเมล หรือเบอร์โทรศัพท์\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"ชื่อผู้ใช้ หรือ อีเมล\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"ชื่อผู้ใช้ หรือเบอร์โทรศัพท์\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"อีเมล หรือเบอร์โทรศัพท์\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"ลืมรหัสผ่านของคุณ?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"อีเมล์ (ไม่บังคับ)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"การยืนยันที่อยู่อีเมล\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"อีเมล (ไม่จำเป็น)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"ชื่อผู้ใช้ (ไม่จำเป็น)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"คุณจะต้องพิมพ์รหัสผ่านอีเมลเดียวกันทุกครั้ง\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"รหัสผ่าน (อีกครั้ง)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"รหัสผ่านปัจจุบัน\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"รหัสผ่านใหม่\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"รหัสผ่านใหม่ (อีกครั้ง)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"รหัส\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"ผู้ใช้\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"อีเมล\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"ยืนยันแล้ว\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"หลัก\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"อีเมล\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"สร้างแล้ว\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"ส่งแล้ว\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"คีย์\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"การยืนยันอีเมล\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"การยืนยันอีเมล\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"หัวขาด\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"ดูรหัสผู้ใช้ของคุณ\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"ดูที่อยู่อีเมลของคุณ\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"ดูข้อมูลโปรไฟล์พื้นฐานของคุณ\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"อนุญาตสิทธิ์\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"ไม่อนุญาตให้ใช้ไวลด์การ์ด เว้นแต่จะเปิดใช้งาน 'อนุญาตไวลด์การ์ด URI'\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' มีไวลด์การ์ด (*) มากกว่าหนึ่งตัว อนุญาตให้ใช้ไวลด์การ์ดได้เพียงหนึ่งตัวต่อ URI เท่านั้น\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"อนุญาตให้ใช้ไวลด์การ์ดได้เฉพาะในส่วนชื่อโฮสต์ของ URI เท่านั้น\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"รหัสการอนุญาต\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"รหัสอุปกรณ์\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"ข้อมูลรับรองไคลเอนต์\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"โทเค็นรีเฟรช\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"ความลับ\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"สาธารณะ\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"ขอบเขตที่ไคลเอนต์ได้รับอนุญาตให้ขอ ระบุหนึ่งค่าต่อหนึ่งบรรทัด เช่น: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"ในกรณีที่ไคลเอนต์ไม่ระบุขอบเขต จะใช้ขอบเขตเริ่มต้นเหล่านี้ ระบุหนึ่งค่าต่อหนึ่งบรรทัด เช่น: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"รายการประเภทการอนุญาตที่ได้รับอนุญาต ระบุหนึ่งค่าต่อหนึ่งบรรทัด เช่น: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"รายการต้นทางที่ได้รับอนุญาตสำหรับคำขอข้ามโดเมน หนึ่งรายการต่อหนึ่งบรรทัด\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"อนุญาตให้ใช้ไวลด์การ์ด (*) ใน URI เปลี่ยนเส้นทางและ CORS origins เมื่อเปิดใช้งาน URI \"\n\"สามารถมีเครื่องหมายดอกจันหนึ่งตัวเพื่อจับคู่กับซับโดเมน\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"รายการประเภทการตอบกลับที่ได้รับอนุญาต ระบุหนึ่งค่าต่อหนึ่งบรรทัด เช่น: code(ENTER)id_token \"\n\"token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"ไคลเอนต์\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"ไคลเอนต์\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"คุณไม่สามารถเพิ่มที่อยู่อีเมลลงในบัญชีที่ได้รับการป้องกันโดยการรับรองความถูกต้องด้วยสองปัจจัย\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"คุณไม่สามารถปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยได้\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"คุณไม่สามารถสร้างรหัสกู้คืนได้โดยไม่ต้องเปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัย\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"คุณไม่สามารถเปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยได้จนกว่าคุณจะยืนยันที่อยู่อีเมลของคุณแล้ว\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"มาสเตอร์คีย์\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"คีย์สำรอง\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"หมายเลขคีย์ {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"รหัสการกู้คืน\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"เครื่องยืนยันตัวตน TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"รหัสตรวจสอบความถูกต้อง\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"ไร้รหัสผ่าน\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"การเปิดใช้งานการทำงานแบบไร้รหัสผ่านทำให้คุณสามารถลงชื่อเข้าใช้โดยใช้เพียงคีย์นี้ \"\n\"แต่ต้องมีข้อกำหนดเพิ่มเติม เช่น ไบโอเมตริกซ์หรือการป้องกัน PIN\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"มีบัญชีที่ใช้อีเมลนี้แล้ว โปรดลงชื่อเข้าใช้บัญชีนั้นก่อน จากนั้นเชื่อมต่อกับบัญชี %s ของคุณ\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"โทเค็นไม่ถูกต้อง TInvalid\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"บัญชีของคุณไม่ได้ตั้งรหัสผ่านไว้\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"บัญชีของคุณไม่มีอีเมลที่ยืนยันแล้ว\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"\"\n\"คุณสามารถลงชื่อเข้าใช้บัญชีของคุณได้โดยใช้วิธีต่อไปนี้: \"\n\"ไม่ตัดการเชื่อมต่อบัญชีบุคคลที่สามที่เหลืออยู่ล่าสุดของคุณ:\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"บัญชีบุคคลที่สามของ Social เชื่อมโยงกับบัญชีอื่นอยู่แล้ว\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"บัญชีโซเชียล\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"ผู้ให้บริการ\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ผู้ให้บริการ ไอดี\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"ชื่อ\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"รหัสลูกค้า\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"รหัสแอปหรือรหัสผู้บริโภค\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"รหัสลับ\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"ความลับของ API, ความลับของไคลเอ็นต์ หรือความลับของผู้บริโภค\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"คีย์\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"การประยุกต์ใช้ทางสังคม\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"การประยุกต์ใช้ทางสังคม\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"เข้าสู่ระบบครั้งล่าสุด\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"วันที่เข้าร่วม\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"ข้อมูลเพิ่มเติม\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"บัญชีโซเชียล\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"บัญชีโซเชียล\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) หรือโทเค็นการเข้าถึง (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"ความลับของโทเค็น\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) หรือรีเฟรชโทเค็น (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"หมดอายุเมื่อ\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"โทเค็นแอปพลิเคชันโซเชียล\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"โทเค็นแอปพลิเคชันโซเชียล\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"ข้อมูลโปรไฟล์ไม่ถูกต้อง\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"ลงชื่อเข้าใช้\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"ยกเลิก\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"การตอบสนองไม่ถูกต้องขณะได้รับคำขอโทเค็นจาก \\\"%s\\\" การตอบสนองคือ: %s\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"การตอบสนองผิดพลาดขณะที่กำลังได้รับ access token จาก \\\"%s\\\"\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"ไม่มีการบันทึก request token ของ \\\"%s\\\"\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"ไม่มีการบันทึก access token ของ \\\"%s\\\"\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"ไม่มีสิทธิ์การเข้าใช้ทรัพยากรส่วนตัว ที่ \\\"%s\\\"\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"การตอบสนองผิดพลาดขณะที่กำลังได้รับ request token จาก \\\"%s\\\"\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"บัญชีไม่มีการใช้งาน\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"บัญชีนี้ไม่มีการใช้งาน\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"เราส่งรหัสไปที่ %(recipient)s รหัสจะหมดอายุในไม่ช้า โปรดกรอกรหัสโดยเร็ว\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"ยืนยัน\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"ขอรหัสใหม่\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"ยืนยันที่อยู่อีเมล AddrAccess\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"โปรดตรวจสอบสิทธิ์อีกครั้งเพื่อปกป้องบัญชีของคุณ\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"ทางเลือกอื่น\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"ยืนยันอีเมล์\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"กรอกรหัสยืนยันอีเมล\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"ใช้อีเมลอื่น\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"ลงชื่อเข้าใช้\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"ป้อนรหัสเข้าสู่ระบบ\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"รีเซ็ทรหัสผ่าน\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"กรอกรหัสรีเซ็ตรหัสผ่าน\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"ยืนยันเบอร์โทรศัพท์\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"กรอกรหัสยืนยันเบอร์โทรศัพท์\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"ใช้หมายเลขโทรศัพท์อื่น\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"อีเมล\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"อีเมลต่อไปนี้ ได้เชื่อมกับบัญชีของคุณ\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"ยืนยันแล้ว\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"ยังไม่ได้ยืนยัน\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"หลัก\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"ทำให้เป็นอันหลัก\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"ส่งการยืนยันอีกครั้ง\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"ลบ\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"เพิ่มอีเมล\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"เพิ่มอีเมล\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"คุณต้องการที่จะลบอีเมลนี้จริงหรอ\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"คุณได้รับอีเมลนี้ เพราะคุณหรือมีคนอื่นพยายามลงทะเบียน\\n\"\n\"บัญชีโดยใช้ที่อยู่อีเมล:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"อย่างไรก็ตาม มีบัญชีที่ใช้อีเมลดังกล่าวอยู่แล้ว  ในกรณีที่คุณ\\n\"\n\"ลืมอีเมลนี้ไป โปรดใช้ขั้นตอนลืมรหัสผ่านเพื่อกู้คืน\\n\"\n\"บัญชีของคุณ:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"มีบัญชีอยู่แล้ว\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"สวัสดีจาก %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"ขอบคุณที่ใช้บริการของ %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"คุณได้รับอีเมลนี้ เนื่องจากมีการเปลี่ยนแปลงต่อไปนี้กับบัญชีของคุณ\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"หากคุณไม่รู้จักการเปลี่ยนแปลงนี้ โปรดดำเนินการตามมาตรการรักษาความปลอดภัยที่เหมาะสมทันที \"\n\"การเปลี่ยนแปลงในบัญชีของคุณมีต้นตอมาจาก:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"อีเมล์ของคุณถูกเปลี่ยนจาก %(from_email)s to %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"ที่อยู่อีเมลเปลี่ยนแปลง\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"คุณได้ทำการยืนยัน %(email)s\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"การยืนยันทางอีเมล์\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"คุณได้รับอีเมลนี้เพราะผู้ใช้ %(user_display)s ให้ที่อยู่อีเมลของคุณเพื่อลงทะเบียนบัญชีใน \"\n\"%(site_domain)s\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"รหัสยืนยันอีเมลของคุณแสดงอยู่ด้านล่างนี้ โปรดป้อนรหัสดังกล่าวในหน้าต่างเบราว์เซอร์ที่เปิดอยู่\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"เพื่อยืนยันว่าถูกต้อง โปรดไปที่ %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"กรุณายืนยันอีเมลของคุณ\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"ที่อยู่อีเมล %(deleted_email)s ถูกลบออกจากบัญชีของคุณ\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"ลบ อีเมล์\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"รหัสลงชื่อเข้าใช้ของคุณแสดงอยู่ด้านล่างนี้ โปรดป้อนรหัสดังกล่าวในหน้าต่างเบราว์เซอร์ที่เปิดอยู่\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"คุณสามารถละเว้นเมลนี้ได้อย่างปลอดภัยหากคุณไม่ได้เป็นผู้เริ่มดำเนินการนี้\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"ลงชื่อเข้าใช้\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"รหัสผ่านของคุณได้เปลี่ยนแล้ว\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"รหัสผ่าน (อีกครั้ง)\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"รหัสรีเซ็ตรหัสผ่านของคุณแสดงอยู่ด้านล่างนี้ โปรดป้อนรหัสดังกล่าวในหน้าต่างเบราว์เซอร์ที่เปิดอยู่\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"รหัสรีเซ็ตรหัสผ่าน\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"สวัสดีจาก %(site_name)s!\\n\"\n\"\\n\"\n\"You're receiving this e-mail because you or someone else has requested a \"\n\"คุณได้รับอีเมลนี้เพราะว่า คุณหรือใครบางคนได้ทำการร้องขอรหัสผ่านของบัญชีนี้ที่ %(site_domain)s.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"คุณสามารถมองข้ามและลบอีเมลนี้ทิ้งได้เลยหากคุณไม่ได้ทำการร้องขอการรีเซ็ทรหัสผ่านคลิกที่ลิงค์ข้างล่างนี้เพื่อรีเซ็ทรหัสผ่านของคุณ\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"ในกรณีเผื่อคุณลืม ชื่อผู้ใช้ของคุณคือ %(username)s\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"อีเมลในการรีเซ็ทรหัสผ่าน\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"รหัสผ่านของคุณได้ถูกเปลี่ยนและรีเซ็ตแล้ว\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"รหัสผ่านของคุณได้เปลี่ยนแล้ว\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"รีเซ็ทรหัสผ่าน\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"คุณได้รับอีเมลนี้เนื่องจากคุณหรือบุคคลอื่นพยายามเข้าถึงบัญชีที่มีอีเมล %(email)s อย่างไรก็ตาม \"\n\"เราไม่มีบันทึกเกี่ยวกับบัญชีดังกล่าวในฐานข้อมูลของเรา\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"หากเป็นคุณ คุณสามารถลงทะเบียนบัญชีโดยใช้ลิงก์ด้านล่าง\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"ไม่ทราบ บัญชี\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"ที่อยู่อีเมล\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"รหัสผ่านอีเมลปัจจุบัน\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"เปลี่ยนเป็น\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"ที่อยู่อีเมลหลักของคุณยังต้องอยู่ระหว่างรอการยืนยัน\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"ยกเลิกการเปลี่ยนแปลง\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"อีเมล์เปลี่ยนเป็น\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"เปลี่ยนอีเมล์\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"ยืนยันอีเมล\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"กรุณายืนยันว่า <a href=\\\"mailto:%(email)s\\\">%(email)s</a> เป็นที่อยู่อีเมลของผู้ใช้ \"\n\"%(user_display)s\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"ไม่สามารถยืนยัน %(email)s ได้เพราะได้รับการยืนยันโดยบัญชีอื่นแล้ว\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"ลิงก์ยืนยันอีเมลนี้หมดอายุหรือไม่ถูกต้อง กรุณา <a \"\n\"href=\\\"%(email_url)s\\\">ส่งคำขอยืนยันอีเมลใหม่</a>\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"ถ้าหากคุณยังไม่มีบัญชี, กรุณา %(link)sลงทะเบียน%(end_link)sก่อน.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"ลงชื่อเข้าใช้ด้วยรหัสผ่าน\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"ส่งรหัสลงชื่อเข้าใช้ให้ฉัน\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"ลงชื่อออก\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"คุณแน่ใจหรือว่าต้องการจะลงชื่อออก\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"คุณไม่สามารถลบอีเมลของคุณได้ (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"อีเมลยืนยันได้ถูกส่งไปที่ %(email)s\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"คุณได้ทำการยืนยัน %(email)s\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"ลบอีเมล %(email)s แล้ว\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"%(name)s ลงชื่อเข้าใช้สำเร็จ\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"คุณได้ออกจากระบบแล้ว\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"รหัสลงชื่อเข้าใช้ได้ถูกส่งไปยัง %(recipient)s แล้ว\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"เปลี่ยนรหัสผ่านสำเร็จ\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"ตั้งรหัสผ่านสำเร็จ\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"รหัสยืนยันได้ถูกส่งไปยัง %(phone)s แล้ว\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"คุณได้ยืนยันหมายเลขโทรศัพท์ %(phone)s แล้ว\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"ตั้งอีเมลหลักสำเร็จ\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"เปลี่ยนรหัสผ่าน\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"ลืมรหัสผ่าน?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"ลืมรหัสผ่านหรือไม่? ป้อนที่อยู่อีเมลของคุณด้านล่าง และเราจะส่งอีเมลไปให้คุณเพื่อรีเซ็ตรหัสผ่าน\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"รีเซ็ทรหัสผ่านของฉัน\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"กรุณาติดต่อเราหากคุณพบปัญหาในการรีเซ็ทรหัสผ่าน\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"เราได้ส่งอีเมลถึงคุณแล้ว หากต้องการยืนยันตัวตน โปรดคลิกลิงก์ในอีเมลนี้ โปรดไปที่โฟลเดอร์สแปม \"\n\"มิฉะนั้น โปรดติดต่อเราหากไม่ได้รับอีเมลภายในไม่กี่นาที\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Token เสีย\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"ลิงค์ที่ใช้ในการรีเซ็ทรหัสผ่านไม่ถูกต้อง อาจเป็นไปได้ว่ามันได้ถูกใช้ไปแล้วกรุณาร้องขอ <a \"\n\"href=\\\"%(passwd_reset_url)s\\\">การรีเซ็ทรหัสผ่านใหม่</a>\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"รหัสผ่านของคุณได้เปลี่ยนแล้ว\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"ตั้งรหัสผ่าน\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"เปลี่ยนเบอร์โทรศัพท์\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"เบอร์โทรศัพท์ปัจจุบัน\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"เบอร์โทรศัพท์ของคุณยังอยู่ระหว่างรอการยืนยัน\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"เปลี่ยนเบอร์โทรศัพท์\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"ลืมรหัสผ่าน?:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"คุณจะได้รับรหัสพิเศษสำหรับการลงชื่อเข้าใช้แบบไม่ต้องใช้รหัสผ่าน\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"ขอรหัส\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"ตัวเลือกการลงชื่อเข้าใช้อื่นๆ\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"ลงทะเบียน\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"ลงทะเบียน\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"มีบัญชีอยู่แล้ว? กรุณา%(link)sลงชื่อเข้าใช้%(end_link)s\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"สมัครสมาชิกด้วยพาสคีย์\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"สมัครสมาชิกด้วยพาสคีย์\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"ตัวเลือกอื่นๆ\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"การลงทะเบียนปิดอยู่\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"เราขอโทษด้วย การลงทะเบียนได้ปิดชั่วคราว\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"หมายเหตุ\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"คุณเข้าสู่ระบบแล้วในชื่อ %(user_display)s\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"คำเตือน:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"ขณะนี้คุณยังไม่ได้ตั้งค่าที่อยู่อีเมล คุณควรเพิ่มที่อยู่อีเมลเพื่อรับการแจ้งเตือน รีเซ็ตรหัสผ่าน ฯลฯ\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"ยืนยันอีเมลของคุณ\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"เราได้ส่งอีเมลถึงคุณเพื่อยืนยันแล้ว ทำตามลิงก์ที่ให้ไว้เพื่อดำเนินการลงทะเบียนให้เสร็จสิ้น \"\n\"หากคุณไม่พบอีเมลยืนยันในกล่องจดหมายหลัก โปรดตรวจสอบในโฟลเดอร์สแปม \"\n\"โปรดติดต่อเราหากคุณไม่ได้รับอีเมลยืนยันภายในไม่กี่นาที\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"ส่วนนี้ของไซต์ต้องการให้เราตรวจสอบว่าคุณคือบุคคลที่คุณอ้างว่าเป็น เพื่อจุดประสงค์นี้ \"\n\"เราต้องการให้คุณ\\n\"\n\"ยืนยันความเป็นเจ้าของที่อยู่อีเมลของคุณ \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"เราได้ส่งอีเมลถึงคุณเพื่อยืนยันแล้ว โปรดคลิกลิงก์ในอีเมลนี้ โปรดส่งอีเมล \"\n\"หากคุณไม่พบอีเมลยืนยันในกล่องจดหมายหลัก โปรดตรวจสอบในโฟลเดอร์สแปม มิฉะนั้น \"\n\"โปรดติดต่อเราหากไม่ได้รับอีเมลภายในไม่กี่นาที\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>หมายเหตุ:</strong> คุณยังสามารถ<a href=\\\"%(email_url)s\\\">เปลี่ยนที่อยู่อีเมล</\"\n\"a>ของคุณได้\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"ข้อความ:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"เมนู:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"การเชื่อมต่อบัญชีต่างๆ\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"การตรวจสอบสิทธิ์สองปัจจัย\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"เซสชั่น\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"อนุญาต\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s ต้องการเข้าถึงบัญชี %(site_name)s ของคุณ\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"ป้อนรหัสอุปกรณ์\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"ป้อนรหัสที่แสดงบนอุปกรณ์ของคุณ\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"ดำเนินการต่อ\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"ยืนยันอุปกรณ์\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"กรุณายืนยันรหัสที่แสดงบน %(client_name)s ของคุณเพื่ออนุญาตอุปกรณ์นี้\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"ปฏิเสธ\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"อนุญาตอุปกรณ์แล้ว\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"คุณได้อนุญาตอุปกรณ์ %(client_name)s ของคุณสำเร็จแล้ว\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"ปฏิเสธอุปกรณ์\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"การอนุญาตสำหรับอุปกรณ์ %(client_name)s ของคุณถูกปฏิเสธ\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"ข้อผิดพลาด\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"คงสถานะลงชื่อเข้าใช้\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"บัญชีของคุณได้รับการปกป้องด้วยการตรวจสอบสิทธิ์สองขั้นตอน โปรดป้อนรหัสตรวจสอบสิทธิ์:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"มีการสร้างรหัสการกู้คืนการตรวจสอบสิทธิ์แบบสองปัจจัยชุดใหม่แล้ว\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"รหัสการกู้คืนใหม่ถูกสร้างขึ้น\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"เปิดใช้งานแอปพลิเคชัน Authenticator แล้ว\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"เปิดใช้งานแอป Authenticator แล้ว\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"ปิดใช้งานแอปพลิเคชัน Authenticator แล้ว\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"ปิดใช้งานแอป Authenticator แล้ว\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"มีการเพิ่มคีย์ความปลอดภัยใหม่แล้ว\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"เพิ่มรหัสความปลอดภัยแล้ว\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"คุณได้ยืนยันแล้วว่า %(email)sรหัสความปลอดภัยถูกลบออกแล้ว\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"ถอดคีย์ความปลอดภัยออกแล้ว\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Authenticator แอป\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"การยืนยันตัวตนโดยใช้แอปพลิเคชันการยืนยันตัวตนเปิดใช้งานอยู่\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"แอปพลิเคชันการตรวจสอบสิทธิ์ไม่ได้เปิดใช้งาน\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"ปิดการใช้งาน\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"เปิดใช้งาน\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"กุญแจความปลอดภัย\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"คุณได้เพิ่มรหัสความปลอดภัย %(count)s แล้ว\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"ไม่มีการเพิ่มคีย์ความปลอดภัย\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"จัดการ\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"แอป\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"รหัสการกู้คืน\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"มีรหัสกู้คืน %(unused_count)s จากทั้งหมด %(total_count)s รหัส\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"ไม่มีการตั้งค่ารหัสการกู้คืน\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"ดู\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"ดาวน์โหลด\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"สร้าง\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"มีการสร้างชุดรหัสการกู้คืนใหม่แล้ว\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"เพิ่มคีย์ความปลอดภัยแล้ว\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"ถอดคีย์ความปลอดภัยออกแล้ว\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"กรอกรหัสยืนยันตัวตน:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"คุณกำลังจะสร้างชุดรหัสการกู้คืนใหม่สำหรับบัญชีของคุณ\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"การดำเนินการนี้จะทำให้รหัสที่มีอยู่ของคุณไม่ถูกต้อง\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"คุณแน่ใจมั้ย?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"รหัสที่ไม่ได้ใช้\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"รหัสดาวน์โหลด\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"สร้างรหัสใหม่\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"เปิดใช้งานแอป Authenticator\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"หากต้องการปกป้องบัญชีของคุณด้วยการตรวจสอบสิทธิ์สองขั้นตอน ให้สแกนรหัส QR \"\n\"ด้านล่างด้วยแอปตรวจสอบสิทธิ์ของคุณ จากนั้นป้อนรหัสยืนยันที่สร้างโดยแอปด้านล่าง\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"ความลับของผู้รับรอง\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"คุณสามารถเก็บความลับนี้ไว้และนำไปใช้ในการติดตั้งแอปพลิเคชันการตรวจสอบความถูกต้องอีกครั้งในภายหลังได้\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"ปิดใช้งานแอป Authenticator\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"คุณกำลังจะปิดการใช้งานการตรวจสอบสิทธิ์โดยใช้แอปตัวตรวจสอบสิทธิ์ คุณแน่ใจหรือไม่?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"ไว้วางใจเบราว์เซอร์นี้หรือไม่?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"หากคุณเลือกที่จะไว้วางใจเบราว์เซอร์นี้ คุณจะไม่ถูกขอรหัสยืนยันในครั้งถัดไปที่คุณเข้าสู่ระบบ\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"ไว้วางใจเป็นเวลา %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"ไม่ไว้วางใจ\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"เพิ่มรหัสความปลอดภัย\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"ถอดกุญแจความปลอดภัยออก\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"คุณแน่ใจว่าต้องการลงชื่อออกหรือลบคีย์ความปลอดภัยนี้หรือไม่\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"การใช้งาน\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"กุญแจผี\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"กุญแจความปลอดภัย\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"คีย์นี้ไม่ได้ระบุว่าเป็นรหัสผ่านหรือไม่\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"ไม่ระบุ\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"เพิ่มเมื่อ %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"ใช้ล่าสุด %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"แก้ไข\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"แก้ไขรหัสความปลอดภัย\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"บันทึก\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"สร้างพาสคีย์\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"คุณกำลังจะสร้างพาสคีย์สำหรับบัญชีของคุณ เนื่องจากคุณสามารถเพิ่มคีย์อื่นๆ ได้ในภายหลัง \"\n\"คุณสามารถใช้ชื่อที่อธิบายเพื่อแยกคีย์ออกจากกัน\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"สร้าง\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"ฟังก์ชันนี้ต้องใช้ JavaScript\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"การเข้าสู่ระบบของบุคคลที่สามในเครือข่ายสังคมออนไลน์ล้มเหลว\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"เกิดข้อผิดพลาดขณะพยายามเข้าสู่ระบบผ่านเครือข่ายโซเชียลหรือบัญชีบุคคลที่สามของคุณ\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"คุณสามารถลงชื่อเข้าใช้บัญชีของคุณโดยใช้บัญชีบุคคลที่สามต่อไปนี้:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"ขณะนี้คุณไม่มีบัญชีบุคคลที่สามหรือเครือข่ายโซเชียลที่เชื่อมโยงกับบัญชีนี้\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"เพิ่มบัญชีบุคคลที่สาม\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"บัญชีบุคคลที่สามจาก %(provider)s เชื่อมต่อกับบัญชีของคุณแล้ว\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"เพิ่มบัญชีบุคคลที่สามที่เชื่อมต่อ\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"บัญชีบุคคลที่สามจาก %(provider)s ถูกตัดการเชื่อมต่อจากบัญชีของคุณ\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"เพิ่มบัญชีบุคคลที่สามที่ถูกตัดการเชื่อมต่อ\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"เชื่อมต่อ %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"คุณกำลังจะเชื่อมต่อบัญชีบุคคลที่สามใหม่จาก %(provider)s\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"ลงชื่อเข้าใช้ผ่าน %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"คุณกำลังจะลงชื่อเข้าใช้โดยใช้บัญชีบุคคลที่สามจาก %(provider)s\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"การลงชื่เข้าใช้ยกเลิก\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"คุณตัดสินใจที่จะยกเลิกการลงชื่อเข้าใช้เว็บของเราด้วยหนึ่งในบัญชีของคุณถ้านี้เป็นความผิดพลาด กรุณา<a \"\n\"href=\\\"%(login_url)s\\\">ลงชื่อเข้าใช้</a>\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"บัญชีบุคคลที่สามของ Social ได้รับการเชื่อมโยงแล้ว\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"บัญชีบุคคลที่สามของ Social ถูกตัดการเชื่อมต่อ\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"คุณกำลังจะทำการใช้บัญชี %(provider_name)s ของคุณ ในการเข้าสู่ระบบของ\\n\"\n\"%(site_name)s. ในขั้นตอนสุดท้าย กรุณากรอกฟอร์มข้างล่าง:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"หรือใช้บุคคลที่สาม\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"ออกจากระบบจากเซสชันอื่นทั้งหมด\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"เริ่มต้นที่\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"อีเมล์ที่อยู่ IP\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"บราวเซอร์\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"พบเห็นครั้งสุดท้ายเมื่อ\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"รหัสผ่านปัจจุบัน\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"ออกจากระบบเซสชั่นอื่น ๆ\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"เซสชันผู้ใช้\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"คีย์เซสชั่น\"\n\n#~ msgid \"Account Connection\"\n#~ msgstr \"การเชื่อมต่อบัญชี\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"รหัสผ่านต้องมีอย่างน้อย {0} ตัวอักษร\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"สวัสดีจาก %(site_name)s!\\n\"\n#~ \"\\n\"\n#~ \"You're receiving this e-mail because you or someone else has requested a \"\n#~ \"คุณได้รับอีเมลนี้เพราะว่า คุณหรือใครบางคนได้ทำการร้องขอรหัสผ่านของบัญชีนี้ที่ \"\n#~ \"%(site_domain)s.\\n\"\n#~ \"It can be safely ignored if you did not request a password reset. Click \"\n#~ \"the \"\n#~ \"คุณสามารถมองข้ามและลบอีเมลนี้ทิ้งได้เลยหากคุณไม่ได้ทำการร้องขอการรีเซ็ทรหัสผ่านคลิกที่ลิงค์ข้างล่างนี้เพื่อรีเซ็ทรหัสผ่านของคุณ\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"อีเมลต่อไปนี้ได้เชื่อมกับบัญชีของคุณ\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"ยืนยันอีเมล\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"กรุณาลงชื่อเข้าใช้ด้วยบัญชีภายนอกของคุณ\\n\"\n#~ \"หรือ Or, %(link)sลงทะเบียน %(end_link)s\\n\"\n#~ \"สำหรับบัญชีของ %(site_name)s และลงชื่อเข้าใช้ด้านล่าง:\"\n\n#~ msgid \"or\"\n#~ msgstr \"sinv\"\n\n#~ msgid \"change password\"\n#~ msgstr \"เปลี่ยนรหัสผ่าน\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"ลงชื่อเข้าใช้ด้วย OpenID\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"อีเมลนี้ได้ถูกเชื่อมกับบัญชีอื่นแล้ว\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"เราได้ส่งอีเมลให้คุณแล้ว. กรุณาติดต่อเราหากคุณไม่ได้รับอีเมลภายในเวลาไม่กี่นาทีนี้\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"การลงชื่เข้าใช้และ/หรือรหัสผ่านที่ระบุมาไม่ถูกต้อง\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"ชื่อผู้ใช้สามารถมีตัวอักษรภาษาอังกฤษตัวเลขและ @/./+/-/_. เท่านั้น\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"ชื่อผู้ใช้นี้ถูกใช้แล้ว กรุณาเลือกชื่ออื่น\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"คุณได้ยืนยันว่า <a href=\\\"mailto:%(email)s\\\">%(email)s</a> เป็นอีเมลของผู้ใช้ %\"\n#~ \"(user_display)s.\"\n"
  },
  {
    "path": "allauth/locale/tr/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n# Translators:\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: django-allauth\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-07-25 20:27+0200\\n\"\n\"Last-Translator: Emirhan Soytaş <emrhns61@hotmail.com>\\n\"\n\"Language-Team: Turkish <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/tr/>\\n\"\n\"Language: tr\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n > 1;\\n\"\n\"X-Generator: Weblate 5.13-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Bu hesap şu anda etkin durumda değil.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Birincil e-posta adresinizi kaldıramazsınız.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"\"\n\"Bu e-posta adresi, halihazırda bu hesap ile ilişkilendirilmiş haldedir.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Girdiğiniz e-posta adresi ve/veya şifre doğru değil.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Girdiğiniz telefon numarası ve/veya şifre doğru değil.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Bu e-posta adresiyle bir kullanıcı zaten kayıtlı.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Lütfen mevcut şifrenizi giriniz.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Hatalı kod.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Hatalı şifre.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Geçersiz veya süresi geçmiş anahtar.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Geçersiz giriş.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Şifre sıfırlama kodu geçersiz.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"%d adetten fazla e-posta adresi ekleyemezsiniz.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Bu telefon numarası ile bir kullanıcı zaten kayıtlı.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Çok fazla hatalı giriş yapıldı. Lütfen daha sonra tekrar deneyin.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Bu e-posta adresi hiçbir kullanıcı hesabıyla ilişkili değil.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Bu telefon numarası hiçbir kullanıcı hesabıyla ilişkili değil.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Birincil e-posta adresinizin doğrulanması gerekmektedir.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"Bu kullanıcı adı kullanılamaz. Lütfen başka bir kullanıcı adı deneyin.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Girdiğiniz kullanıcı adı ve/veya şifre doğru değil.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Lütfen sadece bir adet seçin.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Yeni değer, geçerli değerden farklı olmalıdır.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Sabırlı olunuz, çok fazla istek göndermektesiniz.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Şifrenizi kullanın\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Doğrulayıcı uygulaması veya kodu kullan\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Güvenlik anahtarı kullan\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} mail adresi, doğrulanmış olarak işaretlendi.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"{email} mail adresini doğrulanmış olarak işaretlerken hata alındı.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Seçili e-posta adreslerini doğrulanmış olarak işaretle\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Hesaplar\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"E-posta\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"E-posta adresi\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"Ülke kodu(ABD için +1 gibi, vb.) içeren bir telefon numarası giriniz.\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefon Numarası\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Her sefer için aynı şifreyi girmelisiniz.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Şifre\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Beni Hatırla\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Kullanıcı adı\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Giriş Yap\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Kullanıcı adı, e-posta adresi veya telefon numarası\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Kullanıcı adı ya da e-posta adresi\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Kullanıcı adı veya telefon numarası\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"E-posta adresi veya telefon numarası\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Şifrenizi mi unuttunuz?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"E-posta adresi (tekrar)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"E-posta adresi doğrulama\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"E-posta adresi (zorunlu değil)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Kullanıcı adı (zorunlu değil)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Her sefer için aynı e-posta adresini girmelisiniz.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Şifre (tekrar)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Mevcut Şifre\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Yeni Şifre\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Yeni Şifre (tekrar)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kod\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"kullanıcı\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"e-posta adresi\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"doğrulanmış\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"birincil\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"e-posta adresleri\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"oluşturuldu\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"gönderildi\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"anahtar\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"e-posta onayı\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"e-posta onayları\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Gözetimsiz\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Kullanıcı ID'ni görüntüle\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"E-posta adresini görüntüle\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Temel profil bilgini görüntüle\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"İzin tanımla\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"'URI joker karakterlerine izin ver' etkinleştirilmediği sürece joker \"\n\"karakterlere izin verilmez.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' birden fazla joker karakter (*) içeriyor. Her URI için yalnızca bir \"\n\"joker karaktere izin verilir.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"\"\n\"Joker karakterlere yalnızca URI'nin ana bilgisayar adı kısmında izin verilir.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Yetki kodu\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Cihaz kodu\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"İstemci bilgileri\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Yenileme token'i\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Gizli\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Genel\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"İstemcinin istek atmaya izni olduğu kapsam(lar). Her satır için bir değer \"\n\"giriniz, örneğin: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"İstemcinin herhangi bir kapsam belirtmediği durumlarda bu varsayılan \"\n\"kapsamlar kullanılır. Her satır için bir değer giriniz, örneğin: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"İzin verilen yetkilendirme türlerinin listesi. Her satır için bir değer \"\n\"giriniz, örneğin: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Çapraz kaynak istekleri (cross-origin requests) için izin verilen \"\n\"kaynakların listesi, her bir satır için tek değer girilir.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Yönlendirme URI'lerinde ve CORS kaynaklarında joker karakterlere (*) izin \"\n\"ver. Etkinleştirildiğinde, URI'ler alt alan adlarını eşleştirmek için tek \"\n\"bir yıldız içerebilir.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"İzin verilen yanıt türlerinin listesi. Her satır için tek değer giriniz, \"\n\"örneğin: code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"istemci\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"istemciler\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"İki faktörlü kimlik doğrulama ile korunan bir hesaba e-posta adresi \"\n\"ekleyemezsiniz.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"İki faktörlü kimlik doğrulamayı devre dışı bırakamazsınız.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"İki faktörlü kimlik doğrulamayı aktif hale getirmeden kurtarma kodu \"\n\"oluşturamazsınız.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Doğrulanmış bir e-posta adresiniz olmadığı sürece iki faktörlü kimlik \"\n\"doğrulamayı etkinleştiremezsiniz.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Ana anahtar\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Yedek anahtar\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"{number} no.lu Anahtar\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"MFA(Çok Faktörlü Kimlik Doğrulama)\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Kurtarma kodları\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP(Zaman Tabanlı Tek Seferlik Parola) Doğrulayıcısı\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Doğrulayıcı kodu\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Şifresiz\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Şifresiz işlemi etkinleştirmek sadece bu anahtarı kullanarak giriş yapmanıza \"\n\"olanak sağlar fakat biyometri veya PIN koruması gibi ek gereksinimleri \"\n\"zorunlu kılar.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Bu e-posta adresi ile kayıtlı bir hesap bulunmaktadır. Lütfen önce bu hesaba \"\n\"giriş yapıp daha sonra %s adlı hesabınızı bağlayınız.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Geçersiz jeton.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Hesabınızda belirlenmiş herhangi bir şifre bulunmamaktadır.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Hesabınızın doğrulanmış e-posta adresi yok.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Kalan son üçüncü taraf hesabınızın bağlantısını kesemezsiniz.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Bu üçüncü taraf hesabı halihazırda farklı bir hesaba bağlıdır.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Sosyal Hesaplar\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"sağlayıcı\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"tedarikçi kimlik numarası\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"isim\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"istemci kimlik numarası\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"Uygulama kimlik numarası veya tüketici anahtarı\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"gizli anahtar\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API anahtarı, istemci anahtarı veya tüketici anahtarı\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Anahtar\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"sosyal medya uygulaması\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"sosyal medya uygulamaları\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"son giriş\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"katıldığı tarih\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"ek veri\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"sosyal hesap\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"sosyal hesaplar\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"jeton\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) veya access token (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"jeton anahtarı\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) veya refresh token (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"geçersiz olma tarihi\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"sosyal medya uygulaması jetonu\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"sosyal medya uygulaması jetonları\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Geçersiz profil bilgisi\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Giriş Yap\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Iptal\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"\\\"%s\\\"'dan istek jetonu temin edilirken geçersiz yanıt alındı. Yanıt %s idi.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\"'dan erişim kodu alınırken geçersiz cevap alındı.\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\" için hiçbir talep kodu kaydedilmedi.\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\" için hiçbir erişim kodu kaydedilmedi.\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\"'daki özel kaynaklara erişim yok.\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\"'dan talep kodu alınırken geçersiz cevap alındı.\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Hesap Etkin Değil\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Bu hesap etkin değil.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"%(recipient)s kullanıcısına bir kod gönderdik. Gönderilen kodun süresi kısa \"\n\"zamanda dolacağından dolayı lütfen hızlı davranınız.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Onayla\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Yeni kod iste\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Erişim Doğrulama\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Hesabınızı güvenilir hale getirmek için lütfen tekrar doğrulayın.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Alternatif seçenekler\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"E-Posta Onayı\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"E-Posta Onay Kodu Gir\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Farklı bir e-posta adresi kullanınız\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Giriş Yap\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Giriş Kodunu Gir\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Şifre Sıfırlama\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Şifre Sıfırlama Kodu Giriniz\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Telefon Numarası Doğrulama\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Telefon Numarası Onay Kodu Gir\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Farklı bir telefon numarası kullanınız\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"E-posta Adresleri\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Şu e-posta adresleri hesabınızla ilişkilendirildi:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Doğrulanmış\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Doğrulanmamış\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Birincil\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Birincil Yap\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Tekrar Doğrula\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Kaldır\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"E-posta Adresi Ekle\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"E-posta Ekle\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Seçilen e-posta adresini kaldırmak istediğinizden emin misiniz?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Bu e-postayı, siz veya başka birisi aşağıdaki e-posta adresini kullanarak \"\n\"kayıt olmaya\\n\"\n\"çalıştığı için alıyorsunuz:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Fakat, bu e-posta adresini kullanan bir hesap halihazırda mevcut \"\n\"durumdadır.  Eğer unuttuysanız\\n\"\n\"hesabınızı kurtarmak için lütfen şifre yenileme işleminden\\n\"\n\"faydalanınız:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Hesap Halihazırda Mevcut\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"%(site_name)s'ten Merhaba!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"%(site_name)s'i kullandığınız için teşekkür ederiz!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"Bu e-postayı, hesabınızda bir değişiklik yapıldığı için alıyorsunuz:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Bu değişiklikten haberdar değilseniz lütfen gerekli güvenlik önlemlerini \"\n\"derhal alınız. Hesabınızdaki değişikliğin kaynağı alt kısımda \"\n\"belirtilmiştir:\\n\"\n\"\\n\"\n\"- IP adresi: %(ip)s\\n\"\n\"- Tarayıcı: %(user_agent)s\\n\"\n\"- Tarih: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"\"\n\"%(from_email)s adlı e-posta adresiniz %(to_email)s şeklinde değiştirilmiştir.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"E-posta Adresi Değiştirildi\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"E-posta adresiniz onaylandı.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"E-Posta Adresi Onayı\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Bu e-postayı, %(user_display)s adlı kullanıcı, e-posta adresinizi \"\n\"%(site_domain)s üzerinde bir hesap oluşturmak adına kullandığı için \"\n\"alıyorsunuz.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"E-posta onay kodunuz alt kısımda belirtilmiştir. Kodu, açık olan tarayıcı \"\n\"sekmenize giriniz.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"\"\n\"Bunun doğru olduğunu düşünüyorsanız %(activate_url)s adlı bağlantıyı ziyaret \"\n\"ediniz.\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Lütfen E-posta Adresinizi Onaylayın\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"%(deleted_email)s adlı e-posta adresi hesabınızdan kaldırılmıştır.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"E-Posta Adresi Kaldırıldı\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Giriş kodunuz alt kısımda belirtilmiştir. Kodu, açık olan tarayıcı sekmenize \"\n\"giriniz.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Alınan aksiyondan haberdar değilseniz bu e-postayı görmezden gelebilirsiniz.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Giriş Kodu\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Şifreniz değiştirildi.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Şifre Değiştirildi\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Şifre sıfırlama kodunuz alt kısımda belirtilmiştir. Kodu, açık olan tarayıcı \"\n\"sekmenize giriniz.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Şifre Sıfırlama Kodu\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Bu e-postayı, siz veya başka biri, kullanıcı hesabınız için şifre sıfırlama \"\n\"talebinde bulunduğu için alıyorsunuz.\\n\"\n\"Eğer şifre sıfırlama talebinde bulunan kişi siz değilseniz bu uyarıyı \"\n\"görmezden gelebilirsiniz. Şifrenizi sıfırlamak için aşağıdaki bağlantıya \"\n\"tıklayın.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Kullanıcı adınızı unuttuysanız, kullanıcı adınız: %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Şifre Sıfırlama E-postası\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Şifreniz sıfırlandı.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Şifreniz belirlendi.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Şifre Tanımlandı\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Bu e-postayı, siz ya da başka biri %(email)s adlı e-posta adresini \"\n\"kullanarak bir hesaba giriş yapmaya çalıştığı için alıyorsunuz. Ancak, giriş \"\n\"yapmaya çalışılan hesaba dair veritabanımızda herhangi bir kayıt \"\n\"bulunmamaktadır.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Eğer o kişi siz iseniz aşağıdaki linki kullanarak bir hesap \"\n\"oluşturabilirsiniz.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Bilinmeyen Hesap\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"E-posta Adresi\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Mevcut e-posta\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Şuna değiştiriliyor\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"E-posta adresiniz hala onay aşamasındadır.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Değişikliği İptal Et\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Şuna değiştir\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"E-posta Adresini Değiştir\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"E-posta Adresi Doğrula\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Lütfen <a href=\\\"mailto:%(email)s\\\">%(email)s</a> adlı e-posta adresinin \"\n\"%(user_display)s kullanıcısına ait olduğunu onaylayın.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"%(email)s adlı e-posta adresi başka bir hesap tarafından doğrulandığı için \"\n\"onaylanamıyor.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Bu e-posta adresi onaylama bağlantısı sona ermiş veya geçersizdir. Lütfen <a \"\n\"href=\\\"%(email_url)s\\\">yeni bir e-posta adresi doğrulama talebinde bulunun.</\"\n\"a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Henüz bir hesap oluşturmadıysanız lütfen önce %(link)süye olun%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Geçiş anahtarı ile giriş yap\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Bana giriş kodu gönder\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Çıkış Yap\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Çıkış yapmak istediğinize emin misiniz?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"(%(email)s) adlı birincil e-posta adresinizi kaldıramazsınız.\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Doğrulama e-posta'sı %(email)s adresine gönderildi.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"%(email)s adresini onayladınız.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"%(email)s adresini sildiniz.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"%(name)s olarak başarıyla giriş yapıldı.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Çıkış yaptınız.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"%(recipient)s kullanıcısına bir giriş kodu gönderildi.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Şifre başarıyla değiştirildi.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Şifre başarıyla belirlendi.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"%(phone)s nolu numaraya bir giriş kodu gönderildi.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"%(phone)s nolu telefon numaranızı onayladınız.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Birincil e-posta adresi tanımlandı.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Şifre Değiştir\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Şifrenizi mi unuttunuz?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Şifrenizi mi unuttunuz? E-posta adresinizi aşağıya yazın ve size parolanızı \"\n\"sıfırlamanıza imkan veren bir e-posta gönderelim.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Şifremi Sıfırla\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Şifrenizi sıfırlarken herhangi bir sorunla karşılaşırsanız lütfen bize \"\n\"ulaşın.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Size bir e-posta gönderdik. E-postayı almadıysanız istenmeyen e-posta \"\n\"klasörünüzü kontrol ediniz. Eğer birkaç dakika içinde elinize ulaşmaz ise \"\n\"bizimle irtibata geçiniz.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Hatalı Anahtar\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Muhtemelen daha önce kullanıldığı için şifre sıfırlama bağlantısı geçersiz. \"\n\"Lütfen <a href=\\\"%(passwd_reset_url)s\\\">yeni şifre sıfırlama</a> talebinde \"\n\"bulunun.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Şifreniz değiştirildi.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Şifre Belirle\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Telefon Numarası Değiştir\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Geçerli Telefon Numarası\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Telefon numaranız hala onay aşamasındadır.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Telefon Numarası Değiştir\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Şifrenizi giriniz:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Şifresiz giriş yapabilmenizi sağlayan bir kod alacaksınız.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"İstek Kodu\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Diğer giriş seçenekleri\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Üye Ol\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Üye Ol\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"\"\n\"Zaten hesabınız var mı? O zaman lütfen %(link)sgiriş yapın%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Geçiş anahtarı kullanarak giriş yap\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Geçiş Anahtarı ile Üye Ol\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Diğer seçenekler\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Kayıt Kapalı\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Üzgünüz, ancak kayıt şu anda kapalıdır.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Not\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Halihazırda %(user_display)s olarak giriş yapmış durumdasınız.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Uyarı:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Şu anda tanımlı hiçbir e-posta adresiniz yok. Bildirim alabilmek, şifrenizi \"\n\"sıfırlayabilmek ve benzeri eylemler için e-posta adresinizi mutlaka \"\n\"eklemelisiniz.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"E-posta Adresinizi Doğrulayın\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Size, doğrulama amaçlı bir e-posta gönderdik. Kayıt olma aşamasını \"\n\"tamamlamak için bağlantıyı ziyaret ediniz. Eğer doğrulama e-postasını gelen \"\n\"kutunuzda göremiyorsanız istenmeyen e-posta klasörünüzü kontrol ediniz. Eğer \"\n\"e-posta birkaç dakika içinde tarafınıza ulaşmaz ise bizimle irtibata geçiniz.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Sitenin bu kısmı kim olduğunuzu doğrulamanızı\\n\"\n\"gerektirmektedir. Bu sebeple, girdiğiniz e-posta adresinize sahip\\n\"\n\"olduğunuzu doğrulamanızı rica ediyoruz. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Doğrulama için size bir e-posta gönderdik.\\n\"\n\"Lütfen e-postadaki bağlantıyı ziyaret edin. Eğer e-postayı gelen kutunuzda \"\n\"göremiyorsanız istenmeyen e-posta klasörünüzü kontrol edin. Eğer birkaç \"\n\"dakika\\n\"\n\"içinde bu e-postayı almazsanız bize ulaşın.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Not:</strong> hala <a href=\\\"%(email_url)s\\\">e-posta adresinizi \"\n\"değiştirebilirsiniz</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Mesajlar:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menü:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Hesap Bağlantıları\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"İki Faktörlü Kimlik Doğrulama\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Oturumlar\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Yetkilendir\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"\"\n\"%(client_name)s isimli istemci, %(site_name)s isimli hesabınıza erişim talep \"\n\"etmektedir.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Cihaz Kodu Gir\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Cihazınızda gözüken kodu giriniz.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"İlerle\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Cihazı Onayla\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Lütfen bu cihazı yetkilendirmek için %(client_name)s isimli istemcinizde \"\n\"gözüken kodu onaylayınız.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Reddet\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Cihaz Yetkilendirildi\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"%(client_name)s isimli cihazınızı başarıyla yetkilendirdiniz.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Cihaz Reddedildi\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"\"\n\"%(client_name)s isimli cihazınız için istenilen yetkilendirme reddedildi.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Hata\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Oturumu Açık Tut\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Hesabınız iki faktörlü kimlik doğrulama ile korunmaktadır. Lütfen bir \"\n\"doğrulama kodu giriniz:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"Yeni iki faktörlü kimlik doğrulama kurtarma kodu dizesi oluşturuldu.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Yeni Kurtarma Kodları Oluşturuldu\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Kimlik doğrulama uygulaması etkinleştirildi.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Kimlik Doğrulama Uygulaması Etkinleştirildi\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Kimlik doğrulama uygulaması devre dışı bırakıldı.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Kimlik Doğrulama Uygulaması Devre Dışı Bırakıldı\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Yeni bir güvenlik anahtarı eklendi.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Güvenlik Anahtarı Eklendi\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Bir güvenlik anahtarı kaldırıldı.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Güvenlik Anahtarı Kaldırıldı\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Kimlik Doğrulama Uygulaması\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Kimlik doğrulama uygulaması aracılığı ile kimlik doğrulama etkin.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Bir kimlik doğrulama uygulaması etkin değil.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Devre Dışı Bırak\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Etkinleştir\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Güvenlik Anahtarları\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"%(count)s adet güvenlik anahtarı eklediniz.\"\nmsgstr[1] \"%(count)s adet güvenlik anahtarı eklediniz.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Hiçbir güvenlik anahtarı eklenmedi.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Yönet\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Ekle\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Kurtarma Kodları\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"\"\n\"%(total_count)s adet kurtarma kodu içerisinden %(unused_count)s sayıda \"\n\"kurtarma kodu uygun durumda.\"\nmsgstr[1] \"\"\n\"%(total_count)s adet kurtarma kodu içerisinden %(unused_count)s sayıda \"\n\"kurtarma kodu uygun durumda.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Tanımlı kurtarma kodu bulunmamakta.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"İncele\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"İndir\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Oluştur\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Yeni bir kurtarma kodu dizesi oluşturuldu.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Güvenlik anahtarı eklendi.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Güvenlik anahtarı kaldırıldı.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Bir kimlik doğrulama kodu gir:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Hesabınız için yeni bir kurtarma kodu dizesi oluşturmak üzeresiniz.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Bu eylem, halihazırda mevcut olan kodlarınızı geçersiz kılacaktır.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Emin misin?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Kullanılmamış kodlar\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Kodları indir\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Yeni kod oluştur\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Kimlik Doğrulama Uygulaması Etkinleştir\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Hesabınızı iki faktörlü kimlik doğrulama ile korumak adına aşağıdaki QR \"\n\"kodunu kimlik doğrulama uygulamanız ile tarayınız. Sonrasında uygulama \"\n\"tarafından oluşturulan doğrulama kodunu aşağıdaki kısma giriniz.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Kimlik doğrulama anahtarı\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Bu anahtarı saklayabilir ve kimlik doğrulama uygulamanızı ileriki bir \"\n\"zamanda yeniden yüklemek için kullanabilirsiniz.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Kimlik Doğrulama Uygulamasını Devre Dışı Bırak\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Kimlik doğrulama uygulaması tabanlı kimlik doğrulamayı devre dışı bırakmak \"\n\"üzeresiniz. Bunu yapmak istediğinizden emin misiniz?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Bu tarayıcıya güveniyor musun?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Bu tarayıcıya güvenmeyi seçerseniz bir sonraki girişinizde onay kodu \"\n\"gerekmeyecektir.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"%(period)s için güven\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Güvenme\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Güvenlik Anahtarı Ekle\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Güvenlik Anahtarı Kaldır\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Bu güvenlik anahtarını kaldırmak istediğinizden emin misiniz?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Kullanım\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Geçiş Anahtarı\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Güvenlik anahtarı\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Bu anahtar, bir geçiş anahtarı olduğunu belirtmiyor.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Belirtilmemiş\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"%(created_at)s tarihinde eklendi\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"En son %(last_used)s tarihinde kullanıldı\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Düzenle\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Güvenlik Anahtarını Düzenle\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Kaydet\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Geçiş Anahtarı Oluştur\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Hesabınız için geçiş anahtarı oluşturmak üzeresiniz. İleriki zamanlarda ek \"\n\"anahtarlar ekleyebileceğiniz gibi anahtarları ayırt etmek adına açıklayıcı \"\n\"isimler kullanabilirsiniz.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Oluştur\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Bu özellik JavaScript gerektirir.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Üçüncü Taraf Giriş Hatası\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"Üçüncü taraf hesabınız ile giriş yapılırken bir hata meydana geldi.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Hesabınıza aşağıdaki üçüncü taraf hesaplar aracılığı ile giriş \"\n\"yapabilirsiniz:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Bu hesap ile bağlantılı hiçbir üçüncü taraf hesap bulunmamakta.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Üçüncü Taraf Hesap ekle\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"\"\n\"%(provider)s üzerinden bir üçüncü taraf hesap, hesabınız ile \"\n\"ilişkilendirildi.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Üçüncü Taraf Hesap İlişkilendirildi\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"%(provider)s üzerinden üçüncü taraf bir hesabın, hesabınız ile olan \"\n\"bağlantısı kesildi.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Üçüncü Taraf Hesap Bağlantısı Kesildi\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"%(provider)s Bağlantısı Kur\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"\"\n\"%(provider)s üzerinden yeni bir üçüncü taraf hesap bağlantısı kurmak \"\n\"üzeresiniz.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"%(provider)s ile Giriş Yap\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"%(provider)s üzerinden üçüncü taraf bir hesap ile giriş yapmak üzeresiniz.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Giriş İptal Edildi\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Mevcut hesaplarınızdan birisiyle sitemize girişinizi iptal etmeye karar \"\n\"verdiniz. Eğer bu yanlışlıkla olduysa, lütfen devam edin: <a \"\n\"href=\\\"%(login_url)s\\\">giriş yapın</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Üçüncü taraf hesap bağlantısı kuruldu.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Üçüncü taraf hesap bağlantısı kesildi.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"%(provider_name)s hesabınızı kullanarak %(site_name)s sitesine giriş yapmak \"\n\"üzeresiniz.\\n\"\n\"Son aşama olarak lütfen formu doldurunuz:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Veya üçüncü taraf bir uygulama kullan\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Diğer tüm oturumlardan çıkış yapıldı.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Şu Tarihte Başladı\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP Adresi\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Tarayıcı\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"En son şu tarihte görüldü\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Şu anki\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Diğer Oturumlardan Çıkış Yap\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Kullanıcı Oturumları\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"oturum anahtarı\"\n\n#~ msgid \"Account Connection\"\n#~ msgstr \"Hesap Bağlantısı\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"Parola en az {0} karakter olmalıdır.\"\n\n#, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"Bu e-postayı alıyorsunuz çünkü siz veya başka biri kullanıcı hesabınız \"\n#~ \"için\\n\"\n#~ \"bir şifre talebinde bulundu. Ancak,veritabanımızda %(email)s e-posta \"\n#~ \"adresi ile ilgili bir kayıt bulunmamaktadır.\\n\"\n#~ \"\\n\"\n#~ \"Eğer şifre sıfırlama talebinde bulunmadıysanız bu e-posta güvenle göz \"\n#~ \"ardı edilebilir.\\n\"\n#~ \"\\n\"\n#~ \"Eğer talep sizden geldiyse, aşağıdaki bağlantıyı kullanarak bir hesap \"\n#~ \"oluşturabilirsiniz.\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"Şu e-posta adresleri hesabınızla ilişkilendirildi:\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"E-posta Adresi Doğrula\"\n\n#~ msgid \"or\"\n#~ msgstr \"ya da\"\n\n#~ msgid \"change password\"\n#~ msgstr \"parola değiştir\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"OpenID Girişi\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"Bu e-post adresi başka bir hesap ile ilişkilendirilmiş.\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"Size bir e-posta gönderdik. Birkaç dakika içerisinde size ulaşmazsa \"\n#~ \"lütfen bize ulaşın.\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"Girdiğiniz giriş bilgisi ve/veya parola doğru değil.\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"Kullanıcı adları sadece harf, rakam ve @/./+/-/_ içerebilir.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"Bu kullanıcı adı alınmış durumda. Lütfen başka bir tane deneyiniz.\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"<a href=\\\"mailto:%(email)s\\\">%(email)s</a> adresinin %(user_display)s \"\n#~ \"kullanıcısına ait olduğunu onayladınız.\"\n\n#~ msgid \"Thanks for using our site!\"\n#~ msgstr \"Sitemizi kullandığınız için teşekkür ederiz!\"\n\n#~ msgid \"Confirmation email sent to %(email)s\"\n#~ msgstr \"Onay e-postası %(email)s adresine gönderildi.\"\n\n#~ msgid \"Delete Password\"\n#~ msgstr \"Parola Sil\"\n\n#~ msgid \"\"\n#~ \"You may delete your password since you are currently logged in using \"\n#~ \"OpenID.\"\n#~ msgstr \"\"\n#~ \"Şu anda OpenID ile giriş yaptığınız için dilerseniz parolanızı \"\n#~ \"silebilirsiniz.\"\n\n#~ msgid \"delete my password\"\n#~ msgstr \"parolamı sil\"\n\n#~ msgid \"Password Deleted\"\n#~ msgstr \"Parola Silindi\"\n"
  },
  {
    "path": "allauth/locale/uk/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-09-24 20:02+0000\\n\"\n\"Last-Translator: Максим Горпиніч <gorpinicmaksim0@gmail.com>\\n\"\n\"Language-Team: Ukrainian <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/uk/>\\n\"\n\"Language: uk\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != \"\n\"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % \"\n\"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || \"\n\"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\\n\"\n\"X-Generator: Weblate 5.14-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Цей обліковий запис наразі неактивний.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Ви не можете видалити свою основну адресу електронної пошти.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Ця адреса електронної пошти вже пов'язана з цим обліковим записом.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Вказана адреса електронної пошти та/або пароль неправильні.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Вказано невірний номер телефону або пароль.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Користувач з цією адресою електронної пошти вже зареєстрований.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Будь ласка, введіть свій поточний пароль.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Неправильний код.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Неправильний пароль.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Недійсний або прострочений ключ.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Недійсне назвище.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Токен відновлення пароля недійсний.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Ви не можете додати більше ніж %d адрес електронної пошти.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Користувач з таким тел. номером вже зареєстрований.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"Занадто багато невдалих спроб входу. Спробуйте ще раз пізніше.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"\"\n\"Ця адреса електронної пошти не призначена для жодного облікового запису.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Цей номер телефону не призначено для жодного облікового запису.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Ваша основна адреса електронної пошти повинна бути підтверджена.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"Ім'я користувача не може бути використане. Будь ласка, виберіть інше ім'я \"\n\"користувача.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Вказане ім'я користувача або пароль неправильні.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Будь ласка, оберіть лише одне.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Нове значення має відрізнятись від поточного.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Будьте терплячі, ви надсилаєте забагато запитів.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Використовуйте свій пароль\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Використовуйте додаток для аутентифікації або код\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Використовуйте ключ безпеки\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"Позначено {email} як перевірений.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"Не вдалося позначити {email} як перевірений.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Позначте обрані адреси електронної пошти як підтверджені\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Облікові записи\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"Електронна пошта\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Адреса електронної пошти\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Введіть номер телефону, включаючи код країни (наприклад +38 для України).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Номер телефону\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Вам потрібно вводити один і той самий пароль кожен раз.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Пароль\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Запам'ятати Мене\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Ім'я користувача\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Вхід\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Ім'я користувача, електронна пошта або номер телефону\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Ім'я користувача або електронна пошта\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Ім'я користувача або номер телефону\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Електронна пошта або номер телефону\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Забули пароль?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"Електронна пошта (ще раз)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Підтвердження адреси електронної пошти\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"Електронна пошта (необов'язково)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Ім'я користувача (необов'язково)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Ви повинні вводити одну й ту ж електронну пошту кожен раз.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Пароль (ще раз)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Поточний Пароль\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Новий Пароль\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Новий Пароль (ще раз)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Код\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"користувач\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"адреса електронної пошти\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"підтверджено\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"основна\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"адреси електронної пошти\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"створено\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"відправлено\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"ключ\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"підтвердження електронної пошти\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"підтвердження електронної пошти\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Без візуального інтерфейсу\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Переглянути ваш ідентифікатор користувача\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Переглянути свою адресу електронної пошти\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Переглянути базову інформацію профілю\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Надати дозволи\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"Символи підстановки не дозволені, якщо не увімкнено опцію 'Дозволити символи \"\n\"підстановки в URI'.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' містить більше одного символу підстановки (*). Дозволено лише один \"\n\"символ підстановки на URI.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Символи підстановки дозволені лише в частині імені хоста URI.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Код авторизації\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Код пристрою\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Облікові дані клієнта\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Токен оновлення\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Конфіденційний\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Публічний\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Область(и), яку клієнт може запитувати. Вказуйте одне значення на рядок, \"\n\"наприклад: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Якщо клієнт не вказує жодної області дії, використовуються ці області дії за \"\n\"замовчуванням. Вказуйте одне значення в кожному рядку, наприклад: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Список дозволених типів грантів. Вказуйте одне значення на рядок, наприклад: \"\n\"authorication_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Список дозволених origin-адрес для кросдоменних запитів, по одній на рядок.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Дозволити символи підстановки (*) у URI перенаправлення та джерелах CORS. \"\n\"Коли увімкнено, URI можуть містити одну зірочку для відповідності піддоменам.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Список дозволених типів відповідей. Вказуйте одне значення на рядок, \"\n\"наприклад: code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"клієнт\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"клієнти\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Ви не можете додати адресу електронної пошти до облікового запису, який \"\n\"захищений двофакторною аутентифікацією.\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Ви не можете вимкнути двофакторну аутентифікацію.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Ви не можете створити коди відновлення без увімкненої двофакторної \"\n\"аутентифікації.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Ви не можете увімкнути двофакторну аутентифікацію, поки не підтвердите свою \"\n\"адресу електронної пошти.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Головний ключ\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Резервний ключ\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Ключ № {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"Багатофакторна аутентифікація\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Коди для відновлення\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"Аутентифікатор TOTP\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Код аутентифікатора\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Без пароля\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Увімкнення режиму без пароля дозволяє вам увійти, використовуючи лише цей \"\n\"ключ, але передбачає додаткові вимоги, такі як біометричні дані або захист \"\n\"PIN-кодом.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Обліковий запис вже існує з цією адресою електронної пошти. Будь ласка, \"\n\"спочатку увійдіть в цей обліковий запис, а потім підключіть ваш обліковий \"\n\"запис %s.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Недійсний токен.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"У вашому обліковому записі не встановлено пароль.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"\"\n\"У вашому обліковому записі не підтверджено жодної адреси електронної пошти.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"\"\n\"Ви не можете відключити ваш останній обліковий запис стороннього \"\n\"постачальника.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"\"\n\"Обліковий запис стороннього постачальника вже підключений до іншого \"\n\"облікового запису.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Облікові Записи Соціальних Мереж\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"постачальник\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"ідентифікатор постачальника\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"ім'я\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"ідентифікатор клієнта\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"Ідентифікатор додатка або ключ споживача\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"ключ\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API ключ, клієнтський ключ або ключ споживача\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Ключ\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"додаток соціальної мережі\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"додатки соціальної мережі\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"останній вхід\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"дата приєднання\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"додаткові дані\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"обліковий запис соціальної мережі\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"облікові записи соціальних мереж\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"токен\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) або токен доступу (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"ключ токена\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) або токен оновлення (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"діє до\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"токен додатку соціальної мережі\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"токени додатків соціальної мережі\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Недійсні дані профілю\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Увійти\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Скасувати\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\"\n\"Недійсна відповідь при отриманні токена запиту від \\\"%s\\\". Відповідь була: \"\n\"%s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"Недійсна відповідь під час отримання токена доступу від \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"Не збережено токен запиту для \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"Не збережено токен доступу для \\\"%s\\\".\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"Немає доступу до приватних ресурсів за \\\"%s\\\".\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"Недійсна відповідь при отриманні токена запиту від \\\"%s\\\".\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Обліковий Запис Неактивний\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Цей обліковий запис неактивний.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Ми відправили код на %(recipient)s. Код скоро застаріє, тому будь ласка, \"\n\"введіть його якнайшвидше.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Підтвердити\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Запросити новий код\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Підтвердіть Доступ\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"\"\n\"Будь ласка, проведіть повторну аутентифікацію для захисту вашого облікового \"\n\"запису.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Альтернативні варіанти\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Підтвердження електронної пошти\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Введіть код підтвердження електронної пошти\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Використайте іншу адресу ел. пошти\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Увійти\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Введіть Код Для Входу\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Відновлення Пароля\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Введіть код відновлення паролю\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Підтвердження номеру телефона\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Введіть код підтвердження номеру телефона\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Використайте інший тел. номер\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Адреси електронної пошти\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Ваш обліковий запис пов'язано з наступними адресами електронної пошти:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Підтверджено\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Непідтверджено\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Основний\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Зробити Основним\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Надіслати Повторне Підтвердження\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"Видалити\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Додати Адресу Електронної Пошти\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Додати Електронну Пошту\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Ви дійсно хочете видалити обрану адресу електронної пошти?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Ви отримали цей лист, оскільки ви або хтось інший спробував зареєструвати\\n\"\n\"обліковий запис, використовуючи адресу електронної пошти:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"Однак обліковий запис з цією адресою електронної пошти вже існує.  Якщо ви\\n\"\n\"про це забули, скористайтеся процедурою відновлення пароля, щоб відновити\\n\"\n\"свій обліковий запис:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Обліковий Запис Вже Існує\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"Привіт від %(site_name)s!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"Дякуємо за використання %(site_name)s!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Ви отримуєте цей лист, оскільки була зроблена наступна зміна у вашому \"\n\"обліковому записі:\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Якщо ви не впізнаєте цю зміну, будь ласка, негайно прийміть відповідні \"\n\"заходи безпеки. Зміна у вашому обліковому записі походить з:\\n\"\n\"\\n\"\n\"- IP-адреса: %(ip)s\\n\"\n\"- Браузер: %(user_agent)s\\n\"\n\"- Дата: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Ваша електронна пошта була змінена з %(from_email)s на %(to_email)s.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Електронна Пошта Змінена\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Ваша електронна пошта підтверджена.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Підтвердження Електронної Пошти\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Ви отримали цей лист, оскільки користувач %(user_display)s вказав вашу \"\n\"електронну пошту для реєстрації облікового запису на %(site_domain)s.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Нижче наведено код підтвердження електронної пошти. Введіть його у \"\n\"відкритому вікні браузера.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"\"\n\"Для підтвердження реєстрації перейдіть за наступним посиланням: \"\n\"%(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Будь Ласка, Підтвердіть Вашу Адресу Електронної Пошти\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"\"\n\"Адресу електронної пошти %(deleted_email)s було видалено з вашого облікового \"\n\"запису.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Електронна Пошта Видалена\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Нижче наведений код для входу. Будь ласка, введіть його у відкритому вікні \"\n\"браузера.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"Цей лист можна безпечно ігнорувати, якщо ви не ініціювали цю дію.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Код Для Входу\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Ваш пароль було змінено.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Пароль Змінено\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Нижче наведений код відновлення паролю. Введіть його у відкритому вікні \"\n\"браузера.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Код відновлення паролю\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Ви отримали цей лист, оскільки ви або хтось інший запросив зміну пароля для \"\n\"вашого облікового запису.\\n\"\n\"Якщо ви не запитували зміну пароля, можете ігнорувати цей лист. Натисніть на \"\n\"посилання нижче, щоб змінити пароль.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Якщо ви забули, ваше ім'я користувача - %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Лист Для Відновлення Пароля\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Ваш пароль було відновленно.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Ваш пароль було встановлено.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Встановити Пароль\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Ви отримали цей лист, оскільки ви або хтось інший спробували отримати доступ \"\n\"до облікового запису з електронною поштою %(email)s. Проте у нашій базі \"\n\"даних немає жодного запису такого облікового запису.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Якщо це були ви, ви можете зареєструватися для облікового запису за \"\n\"допомогою посилання нижче.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Невідомий Обліковий Запис\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Адреса Електронної Пошти\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Поточна електронна пошта\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"Зміна на\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"Ваша адреса електронної пошти ще не підтверджена.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"Відмінити Зміну\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"Зміна на\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Змінити Електронну Пошту\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Підтвердити Адресу Електронної Пошти\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Будь ласка, підтвердіть, що <a href=\\\"mailto:%(email)s\\\">%(email)s</a> є \"\n\"адресоюелектронної пошти для користувача %(user_display)s.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"Не вдалося підтвердити %(email)s, оскільки вона вже підтверджена іншим \"\n\"обліковим записом.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Термін дії посилання для підтвердження електронної пошти закінчився або воно \"\n\"є недійсним. Будь ласка, <a href=\\\"%(email_url)s\\\">відправте новий запит на \"\n\"підтвердження електронної пошти</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Якщо ви ще не створили обліковий запис, будь ласка, спочатку \"\n\"%(link)sзареєструйтесь%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"Увійти за допомогою пароль-ключа\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Надішліть мені код для входу\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Вийти\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Ви впевнені, що хочете вийти?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"\"\n\"Ви не можете видалити свою основну адресу електронної пошти (%(email)s).\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Лист-підтвердження надіслано на %(email)s.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"Ви підтвердили %(email)s.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"Видалено адресу електронної пошти %(email)s.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"Успішно увійшли як %(name)s.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Ви вийшли.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Код для входу було надіслано на %(recipient)s.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Пароль успішно змінено.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Пароль успішно встановлено.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Код підтвердження надіслано на %(phone)s.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Номер телефону %(phone)s підтверджено.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Основна адреса електронної пошти встановлена.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Змінити Пароль\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Забули Пароль?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Забули пароль? Введіть свою адресу електронної пошти нижче, і ми надішлемо \"\n\"вам листа з інструкціями для його відновлення.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Відновити Мій Пароль\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Будь ласка, зв'яжіться з нами, якщо у вас виникли проблеми зі відновлення \"\n\"пароля.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Ми відправили вам електронного листа. Якщо ви його не отримали, перевірте \"\n\"папку «Спам». В іншому випадку, зверніться до нас, якщо ви не отримаєте його \"\n\"протягом кількох хвилин.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Недійсний Токен\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Посилання для відновлення пароля недійсне, можливо, воно вже було \"\n\"використане. Будь ласка, запросіть <a href=\\\"%(passwd_reset_url)s\\\">нове \"\n\"відновлення пароля</a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Ваш пароль було змінено.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Встановити Пароль\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Змінити номер телефону\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Поточний номер телефону\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Ваш номер телефону ще не підтверджено.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Змінити номер телефону\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Введіть ваш пароль:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Ви отримаєте особливий код для входу без пароля.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Запросити Код\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Інші варіанти входу\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Реєстрація\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Зареєструватись\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"\"\n\"Вже маєте обліковий запис? Тоді будь ласка, %(link)sувійти%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Зареєструватися за допомогою ключа доступу\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Реєстрація за допомогою ключа доступу\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Інші варіанти\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Реєстрація Закрита\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Вибачте, але реєстрація наразі закрита.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Примітка\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Ви вже увійшли як %(user_display)s.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Попередження:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"На даний момент у вас немає встановленої жодної адреси електронної пошти. \"\n\"Рекомендується додати адресу електронної пошти для отримання сповіщень, \"\n\"відновлення паролю та інших операцій.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Підтвердіть Вашу Адресу Електронної Пошти\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Ми відправили вам лист для підтвердження. Слідуйте по посиланню, щоб \"\n\"завершити процес реєстрації. Якщо ви не знайшли листа в основній скринці, \"\n\"перевірте папку «Спам». Будь ласка, зв'яжіться з нами, якщо ви не отримаєте \"\n\"листа з підтвердженням протягом кількох хвилин.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Ця частина сайту вимагає підтвердження того, що\\n\"\n\"ви той, за кого себе видаєте. З цією метою ми потребуємо\\n\"\n\"підтвердити власність вашої адреси електронної пошти. \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Ми відправили вам лист для\\n\"\n\"підтвердження. Будь ласка, перейдіть за посиланням у цьому листі. Якщо ви не \"\n\"знайшли листа з підтвердженням у головній скринці, перевірте папку «Спам». \"\n\"Інакше\\n\"\n\"зв'яжіться з нами, якщо ви не отримаєте його протягом кількох хвилин.\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Примітка:</strong> ви все ще можете <a \"\n\"href=\\\"%(email_url)s\\\">змінити свою адресу електронної пошти</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Повідомлення:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Меню:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Підключені Облікові Записи\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Двофакторна аутентифікація\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Сесії\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Авторизувати\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"\"\n\"%(client_name)s хоче отримати доступ до вашого облікового запису \"\n\"%(site_name)s.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Введіть код пристрою\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Введіть код, відображений на вашому пристрої.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Продовжити\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Підтвердити пристрій\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Будь ласка, підтвердьте код, що відображається на вашому %(client_name)s, \"\n\"щоб авторизувати цей пристрій.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Заперечити\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Пристрій Авторизовано\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"Ви успішно авторизували свій пристрій %(client_name)s.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Пристрій відхилено\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"Авторизацію для вашого пристрою %(client_name)s відхилено.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Помилка\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Залишитися в системі\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Ваш обліковий запис захищений двофакторною аутентифікацією. Будь ласка, \"\n\"введіть код автентифікатора:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Згенеровано новий набір кодів для відновлення двофакторної аутентифікації.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Створено Нові Коди Для Відновлення Доступу\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Аутентифікаційний додаток увімкнено.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Аутентифікаційний Додаток Увімкнено\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Аутентифікаційний додаток вимкнуто.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Аутентифікаційний Додаток Вимкнуто\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Додано новий ключ безпеки.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Додано Ключ Безпеки\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Ключ безпеки було видалено.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Ключ Безпеки Видалено\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Додаток Для Аутентифікації\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Аутентифікація за допомогою додатка для аутентифікації увімкнена.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Додаток для аутентифікації не увімкнений.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Вимкнути\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Увімкнути\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Ключі Безпеки\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"Ви додали %(count)s захисний ключ.\"\nmsgstr[1] \"Ви додали %(count)s захисних ключів.\"\nmsgstr[2] \"Ви додали %(count)s захисних ключів.\"\nmsgstr[3] \"Ви додали %(count)s захисних ключів.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Не було додано жодних ключів безпеки.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Керувати\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Додати\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Коди Для Відновлення\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"Доступно %(unused_count)s з %(total_count)s код відновлення.\"\nmsgstr[1] \"Доступно %(unused_count)s з %(total_count)s коди відновлення.\"\nmsgstr[2] \"Доступно %(unused_count)s з %(total_count)s кодів відновлення.\"\nmsgstr[3] \"Доступно %(unused_count)s з %(total_count)s кодів відновлення.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Коди для відновлення не налаштовано.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Перегляд\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Завантажити\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Згенерувати\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Згенеровано новий набір кодів для відновлення.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Додано ключ безпеки.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Ключ безпеки видалено.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Введіть код з аутентифікаційного додатка:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"\"\n\"Ви збираєтесь згенерувати новий набір кодів для відновлення вашого \"\n\"облікового запису.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Ця дія зробить недійсними ваші поточні коди.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Ви впевнені?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Не використані коди\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Завантажити коди\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Згенерувати нові коди\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Увімкнути Додаток Для Аутентифікації\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Для захисту вашого облікового запису двофакторною аутентифікацією \"\n\"відскануйте QR-код нижче за допомогою вашого додатка для аутентифікації. \"\n\"Потім введіть згенерований додатком код підтвердження нижче.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Ключ аутентифікатора\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Ви можете зберегти цей ключ і використовувати його для перевстановлення \"\n\"вашого додатка для аутентифікації в майбутньому.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Вимкнути Додаток Для Аутентифікації\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Ви збираєтесь вимкнути аутентифікацію на основі додатку для аутентифікації. \"\n\"Ви впевнені?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Довіряти цьому браузеру?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Якщо оберете довіряти цьому переглядачу, то при наступному вході у вас не \"\n\"запитуватимуть код підтвердження входу.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"Довіряти протягом %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Не довіряти\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Додати Ключ Безпеки\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Видалити Ключ Безпеки\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Ви впевнені, що хочете видалити цей ключ безпеки?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Використання\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"пароль-ключ\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Ключ безпеки\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Цей ключ не вказує, чи є він пароль-ключем.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Невизначений\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"Додано %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"Останнє використання %(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"Редагувати\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Редагувати Ключ Безпеки\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Зберегти\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Створити ключ доступу\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Ви створюєте ключ доступу для вашої обліковки. Оскільки можна створити \"\n\"більше одного ключа доступу, ви можете обрати назву для кожного з них.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Створити\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Ця функція потребує JavaScript.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Невдалий Вхід Через Сторонній Сервіс\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Під час спроби входу через ваш обліковий запис стороннього сервісу сталася \"\n\"помилка.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Ви можете увійти до свого облікового запису, використовуючи будь-який з \"\n\"наступних облікових записів сторонніх сервісів:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"\"\n\"Наразі до цього облікового запису не підключено жодних облікових записів \"\n\"сторонніх сервісів.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Додати Обліковий Запис Стороннього Сервісу\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"\"\n\"Обліковий запис від %(provider)s було підключено до вашого облікового запису.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Обліковий Запис Стороннього Сервісу Підключено\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"Обліковий запис від %(provider)s було відключено від вашого облікового \"\n\"запису.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Обліковий Запис Стороннього Сервісу Відключено\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"Підключити %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Ви збираєтеся підключити новий обліковий запис стороннього сервісу \"\n\"%(provider)s.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"Увійти через %(provider)s\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Ви збираєтеся увійти, використовуючи обліковий запис стороннього сервісу \"\n\"%(provider)s.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Вхід Скасовано\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Ви вирішили скасувати вхід на наш сайт, використовуючи один із ваших \"\n\"існуючих облікових записів. Якщо це була помилка, будь ласка, перейдіть до \"\n\"<a href=\\\"%(login_url)s\\\">входу</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Обліковий запис стороннього сервісу було підключено.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Обліковий запис стороннього сервісу було відключено.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Ви збираєтеся увійти за допомогою облікового запису %(provider_name)s на\\n\"\n\" сайт %(site_name)s. Як завершальний крок, будь ласка, заповніть наступну \"\n\"форму:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Або скористайтеся стороннім сервісом\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Усі інші сеанси завершено.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Розпочато о\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP Адреса\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Браузер\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Останній вхід о\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Поточний\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Вийти З Інших Сеансів\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Сеанси Користувача\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"ключ сеансу\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"Підключені Облікові Записи\"\n"
  },
  {
    "path": "allauth/locale/uz/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# Hojiakbar Barotov barotovhojiakbar.me@gmail.com, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-06-09 11:01+0000\\n\"\n\"Last-Translator: ONVETI <qjkbest@gmail.com>\\n\"\n\"Language-Team: Uzbek <https://hosted.weblate.org/projects/allauth/django-\"\n\"allauth/uz/>\\n\"\n\"Language: uz\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 5.12-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"Bu akkaunt hozirda faol emas.\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"Siz asosiy email manzilingizni olib tashlay olmaysiz.\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"Bu email manzili allaqachon ushbu akkaunt bilan bog'langan.\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"Siz ko'rsatgan email manzili va/yoki parol noto'g'ri.\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"Siz ko'rsatgan telefon raqami va/yoki parol noto'g'ri.\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"Foydalanuvchi allaqachon ushbu email manzili bilan ro'yxatdan o'tgan.\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"Iltimos, joriy parolingizni kiriting.\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"Noto'g'ri kod.\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"Noto'g'ri parol.\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"Yaroqsiz yoki muddati o'tgan kalit.\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"Noto'g'ri tizimga kirish.\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"Parolni tiklash tokeni yaroqsiz.\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"Siz %d dan ortiq email manzilini qo‘sha olmaysiz.\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"Foydalanuvchi allaqachon ushbu telefon raqami bilan ro'yxatdan o'tgan.\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"\"\n\"Kirish uchun juda koʻp muvaffaqiyatsiz urinishlar. Keyinroq qayta urinib \"\n\"ko'ring.\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"Email manzili hech qanday foydalanuvchi akkauntiga biriktirilmagan.\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"Telefon raqami hech qanday foydalanuvchi akkauntiga biriktirilmagan.\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"Asosiy email manzilingiz tasdiqlanishi kerak.\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"\"\n\"Foydalanuvchi nomidan foydalanib bo'lmaydi. Iltimos, boshqa foydalanuvchi \"\n\"nomidan foydalaning.\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"Siz ko'rsatgan foydalanuvchi nomi va/yoki paroli noto'g'ri.\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"Iltimos, faqat bittasini tanlang.\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"Yangi qiymat hozirgi qiymatdan farq qilishi kerak.\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"Sabrli bo'ling, siz judayam koʻp soʻrov yuboryapsiz.\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"Parolingizdan foydalaning\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"Autentifikatsiya ilovasi yoki kodidan foydalaning\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"Xavfsizlik kodidan foydalaning\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"{email} tasdiqlangan deb belgilandi.\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"{email} ni tasdiqlangan deb belgilab bo'lmadi.\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"Tanlangan email manzillarini tasdiqlangan deb belgilash\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"Hisoblar\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"Email\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"Email manzili\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"\"\n\"Telefon raqamini mamlakat kodi bilan birga kiriting (masalan, UZ uchun \"\n\"+998, ).\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"Telefon\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"Har safar bir xil parolni kiritishingiz kerak.\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"Parol\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"Meni Eslab Qolmoq\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"Foydalanuvchi nomi\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"Kirish\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"Foydalanuvchi nomi, email yoki telefon\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"Foydalanuvchi nomi yoki email\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"Foydalanuvchi nomi yoki telefon\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"Email yoki telefon\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"Parolingiz esdan chiqdimi?\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"Email (yana)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"Email manzilini tasdiqlash\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"Email (ixtiyoriy)\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"Foydalanuvchi nomi (ixtiyoriy)\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"Har safar bir xil email manzilini yozishingiz kerak.\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"Parol (yana)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"Joriy Parol\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"Yangi Parol\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"Yangi Parol (yana)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"Kod\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"foydalanuvchi\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"email manzili\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"tasdiqlangan\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"asosiy\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"email manzillari\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"yaratilgan\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"jo'natilgan\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"kalit\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"email orqali tasdiqlash\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"email orqali tasdiqlash\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"Headless\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"Foydalanuvchi identifikatoringizni ko'rish\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"Email manzilingizni ko'rish\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"Asosiy profil ma'lumotlaringizni ko'rish\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"Ruxsatlarni berish\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"\"\n\"'URI joker belgilariga ruxsat berish' yoqilmagan bo'lsa, joker belgilarga \"\n\"ruxsat berilmaydi.\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"\"\n\"URI '{}' bir nechta joker belgini (*) o'z ichiga oladi. Har bir URI uchun \"\n\"faqat bitta joker belgiga ruxsat beriladi.\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"Joker belgilar faqat URI ning xost nomi qismida ruxsat etiladi.\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"Avtorizatsiya kodi\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"Qurilma kodi\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"Mijoz hisob ma'lumotlari\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"Yangilash tokeni\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"Maxfiy\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"Ommaviy\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Mijozga so'rash ruxsat etilgan doira(lar). Har bir qatorga bitta qiymat \"\n\"kiriting, masalan: openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"Agar mijoz hech qanday doirani ko'rsatmasa, ushbu standart doiralar \"\n\"ishlatiladi. Har bir qatorga bitta qiymat kiriting, masalan: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"Ruxsat etilgan grant turlari ro'yxati. Har bir qatorga bitta qiymat \"\n\"kiriting, masalan: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"\"\n\"Cross-origin so'rovlar uchun ruxsat etilgan manbalar ro'yxati, har bir \"\n\"qatorda bittadan.\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"Qayta yo'naltirish URI lari va CORS manbalarida joker belgilarga (*) ruxsat \"\n\"berish. Yoqilganda, URI lar subdomenlarni moslashtirish uchun bitta \"\n\"yulduzcha belgisini o'z ichiga olishi mumkin.\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"Ruxsat etilgan javob turlari ro'yxati. Har bir qatorga bitta qiymat \"\n\"kiriting, masalan: code(ENTER)id_token token(ENTER)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"mijoz\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"mijozlar\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"\"\n\"Siz ikki-bosqichli autentifikatsiya bilan himoyalangan akkauntga email \"\n\"manzilini qo'sha olmaysiz\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"Ikki-bosqichli autentifikatsiyani o'chirib bo'lmaydi.\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"\"\n\"Siz ikki-bosqichli autentifikatsiyasiz tiklash kodlarini yarata olmaysiz.\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"\"\n\"Siz email manzilingizni tasdiqlamaguningizcha ikki-bosqichli \"\n\"autentifikatsiyani faollashtira olmaysiz.\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"Asosiy kalit\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"Zaxira kalit\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"Kalit No. {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"Ko'p faktorli autentifikatsiya\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"Qayta tiklash kodlari\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP Authenticator\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"Autentifikatsiya kodi\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"Parolsiz\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"Parolsiz operatsiyani yoqish sizga faqat shu kalit yordamida tizimga kirish \"\n\"imkonini beradi, lekin biometrik yoki PIN-kod himoyasi kabi qo'shimcha \"\n\"talablarni qo'yadi.\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"Ushbu email manzili bilan akkaunt allaqachon mavjud. Iltimos, avval o'sha \"\n\"akkauntga kiring keyin %s akkauntingizni ulang.\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"Token yaroqsiz.\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"Akkauntingizda parol sozlanmagan.\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"Akkauntingizda tasdiqlangan email manzili yo'q.\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"Oxirgi qolgan uchinchi tomon akkauntingizni oʻchira olmaysiz.\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"Uchinchi tomon akkaunti allaqachon boshqa akkauntga ulangan.\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"Ijtimoiy Akkauntlar\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"provayder\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"provayder ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"nom\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"mijoz identifikatori\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"Ilova identifikatori yoki iste'molchi kaliti\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"maxfiy kalit\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API kaliti, mijoz kaliti yoki iste'molchi kaliti\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"Kalit\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"ijtimoiy ilova\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"ijtimoiy ilovalar\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"uid\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"so'nggi kirish\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"qo'shilgan sana\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"qo'shimcha ma'lumotlar\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"ijtimoiy akkaunt\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"ijtimoiy akkauntlar\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"token\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) yoki kirish tokeni (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"token kaliti\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) yoki yangilash tokeni (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"da tugaydi\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"ijtimoiy tarmoq tokeni\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"ijtimoiy tarmoq tokenlari\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"Profil maʼlumotlari yaroqsiz\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"Kirish\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"Bekor qilish\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"\\\"%s\\\"dan soʻrov tokenini olishda yaroqsiz javob. Olingan javob: %s.\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\"dan kirish tokenini olishda yaroqsiz javob.\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\" uchun soʻrov tokeni saqlanmagan.\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\" uchun kirish tokeni saqlanmagan.\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\" shaxsiy ma'lumotlariga kirish imkoni yo'q.\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"\\\"%s\\\"dan soʻrov tokenini olishda yaroqsiz javob.\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"Nofaol Akkaunt\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"Bu akkaunt faol emas.\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"\"\n\"Biz %(recipient)s manziliga kod yubordik. Kodning amal qilish muddati tez \"\n\"orada tugaydi, iltimos tez orada kodni kiriting.\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"Tasdiqlash\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"Yangi kod so'rash\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"Kirishni Tasdiqlash\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"Akkauntingizni himoya qilish uchun qayta autentifikatsiya qiling.\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"Muqobil variantlar\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"Emailni Tasdiqlash\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"Email Tasdiqlash Kodini Kiritish\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"Boshqa email manzilidan foydalanish\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"Kirish\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"Kirish Kodini Kiritish\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"Parolni Tiklash\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"Parolni tiklash kodini kiritish\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"Telefon tasdiqlash\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"Telefon tasdiqlash kodini kiritish\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"Boshqa telefon raqamidan foydalanish\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Email Manzillari\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"Quyidagi email manzillari akkauntingiz bilan bog'langan:\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"Tasdiqlangan\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"Tasdiqlanmagan\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"Asosiy\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"Asosiy Sifatida O'rnatish\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"Tekshirishni Qayta Yuborish\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"O'chirish\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"Email Manzili Qo'shish\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"Email Qo'shish\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"Haqiqatan ham tanlangan email manzilini o'chirib tashlamoqchimisiz?\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"Siz ushbu xatni siz yoki boshqa birov\\n\"\n\"%(email)s email manzilidan foydalanib akkaunt yaratishga harakat qilgani \"\n\"uchun oldingiz.\\n\"\n\"Biroq, bu email manzilidan foydalanadigan hisob allaqachon mavjud.\\n\"\n\"Bu haqda unutgan bo'lsangiz, hisobingizni tiklash uchun parolni tiklash \"\n\"protsedurasidan foydalaning:\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"Akkaunt Allaqachon Mavjud\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"%(site_name)s dan salom!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"%(site_name)s dan foydalanganingiz uchun tashakkur!\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"\"\n\"Sizga quyidagi akkauntga o‘zgartirish kiritilgani uchun bu xatni olmoqdasiz\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"Agar siz bu oʻzgarishdan bexabar bo'lsangiz, darhol tegishli xavfsizlik \"\n\"choralarini koʻring. Hisobingizga kiritilgan oʻzgarish:\\n\"\n\"\\n\"\n\"- IP manzil: %(ip)s\\n\"\n\"- Brauzer: %(user_agent)s\\n\"\n\"- Sana: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"Sizning emailingiz %(from_email)s dan %(to_email)s ga o‘zgartirildi.\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Email O'zgartirildi\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"Emailngiz tasdiqlandi.\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Emailni Tasdiqlash\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"Siz bu xatni olmoqdasiz, chunki %(user_display)s foydalanuvchisi \"\n\"%(site_domain)s saytida hisob qaydnomasini ro‘yxatdan o‘tkazish uchun email \"\n\"manzilingizni bergan.\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Emailngizni tasdiqlash kodi quyida keltirilgan. Iltimos, uni ochiq brauzer \"\n\"oynasida kiriting.\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"Bu toʻgʻriligini tasdiqlash uchun %(activate_url)s ga oʻting\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"Iltimos, Email Manzilingizni Tasdiqlang\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"%(deleted_email)s email manzili akkauntingizdan olib tashlandi.\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Email Olib Tashlandi\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"\"\n\"Kirish kodingiz quyida keltirilgan. Iltimos, uni ochiq brauzer oynasida \"\n\"kiriting.\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"\"\n\"Agar siz ushbu harakatni boshlamagan bo'lsangiz, bu xatni e'tiborsiz \"\n\"qoldirish mumkin.\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"Kirish Kodi\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"Parolingiz o'zgartirildi.\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"Parol O'zgartirildi\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"\"\n\"Parolni tiklash kodingiz quyida keltirilgan. Iltimos, uni ochiq brauzer \"\n\"oynasida kiriting.\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"Parolni tiklash kodi\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"Siz yoki boshqa birov foydalanuvchi akkauntingiz uchun parolni tiklashni \"\n\"soʻragani uchun bu xatni olmoqdasiz.\\n\"\n\"Agar siz parolni tiklashni so'ramagan bo'lsangiz, buni e'tiborsiz \"\n\"qoldirishingiz mumkin. Parolni tiklash uchun quyidagi havolani bosing.\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"Agar unutgan bo'lsangiz, sizning foydalanuvchi nomingiz %(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"Parolni Tiklash Emaili\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"Parolingiz qayta tiklandi.\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"Parolingiz oʻrnatildi.\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"Parol O'rnatildi\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"Siz yoki boshqa birov %(email)s emaili bilan kirishga harakat qilgani uchun \"\n\"ushbu xatni oldingiz Biroq, bizning ma'lumotlar ba'zasida bunday akkaunt \"\n\"yo'q.\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"\"\n\"Agar bu siz bo'lsangiz, quyidagi havola orqali akkaunt yaratishingiz mumkin.\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"Noma'lum Akkaunt\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Email Manzili\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"Joriy email\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"-ga o'zgartirilyapti\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"email manzilingiz hali tasdiqlanishi kutilmoqda.\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"O'zgartirishni Bekor Qilish\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"-ga o'zgartirmoq\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"Emailni o'zgartirmoq\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"Email Manzilini Tasdiqlash\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"Iltimos, <a href=\\\"mailto:%(email)s\\\">%(email)s</a> email manzili \"\n\"%(user_display)s foydalanuvchisi uchun email ekanligini tasdiqlang.\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"\"\n\"%(email)s ni tasdiqlab bo‘lmadi, chunki u allaqachon boshqa akkaunt \"\n\"tomonidan tasdiqlangan.\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"Ushbu emailni tasdiqlash havolasi muddati tugagan yoki yaroqsiz. Iltimos, <a \"\n\"href=\\\"%(email_url)s\\\">yangi email orqali tasdiqlash so'rovini yuboring</a>.\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"\"\n\"Agar siz hali akkaunt yaratmagan bo'lsangiz, iltimos, birinchi \"\n\"%(link)sakkaunt yarating%(end_link)s.\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"O'tish kaliti bilan tizimga kirish\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"Menga kirish kodini yuboring\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"Chiqish\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"Haqiqatan ham tizimdan chiqmoqchimisiz?\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"Siz asosiy email manzilingizni (%(email)s) olib tashlay olmaysiz.\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"Tasdiqlash xati %(email)s manziliga yuborildi.\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"%(email)s ni tasdiqladingiz.\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"%(email)s email manzili olib tashlandi.\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"%(name)s sifatida muvaffaqiyatli kirildi.\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"Tizimdan chiqdingiz.\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"Kirish kodi %(recipient)s manziliga yuborildi.\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"Parol muvaffaqiyatli almashtirildi.\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"Parol muvaffaqiyatli oʻrnatildi.\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"Tasdiqlash kodi %(phone)s raqamiga yuborildi.\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"Siz %(phone)s telefon raqamini tasdiqladingiz.\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"Asosiy email manzili oʻrnatildi.\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"Parolni O'zgartirmoq\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"Parolni Unutidingizmi?\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"Parolni unutdingizmi? Quyida email manzilingizni kiriting, biz sizga uni \"\n\"qayta o'rnatishga ruxsat beruvchi emailni yuboramiz.\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"Parolimni Tiklamoq\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"\"\n\"Agar parolingizni qayta tiklashda muammoga duch kelsangiz, biz bilan \"\n\"bog'laning.\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"Biz sizga email xabarini yubordik. Agar uni olmagan bo'lsangiz, iltimos, \"\n\"spam jildini tekshiring. Aks holda, agar siz uni bir necha daqiqada olmagan \"\n\"bo'lsangiz, biz bilan bog'laning.\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"Yaroqsiz Token\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"Parolni tiklash havolasi yaroqsiz, ehtimol u allaqachon ishlatilgan. \"\n\"Iltimos, <a href=\\\"%(passwd_reset_url)s\\\">yangi parolni tiklashni so'rang</\"\n\"a>.\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"Parolingiz o'zgartirildi.\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"Parol O'rnatish\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"Telefonni o'zgartirish\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"Joriy telefon\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"Telefon raqamingiz hali tasdiqlanishi kutilmoqda.\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"Telefonni o'zgartirish\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"Parolingizni kirgizing\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"Siz parolsiz kirish uchun maxsus kodni olasiz.\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"Kod So'rash\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"Boshqa kirish variantlari\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"Ro'yxatdan O'tish\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"Ro'yxatdan O'tish\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"\"\n\"Allaqachon akkauntingiz bormi? Unda akkauntingizga \"\n\"%(link)skiring%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"Parol kaliti yordamida ro'yxatdan o'tish\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Parol kaliti bilan ro'yxatdan o'tish\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"Boshqa variantlar\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"Ro'yxatdan O'tish Yopiq\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"Kechirasiz, lekin roʻyxatdan oʻtish hozirda yopiq.\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"Eslatma\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"Siz allaqachon %(user_display)s sifatida tizimga kirgansiz.\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"Ogohlantirish:\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"Sizda hozirda hech qanday email manzili oʻrnatilmagan. Haqiqatan ham \"\n\"bildirishnomalarni qabul qilish, parolni tiklash va h.k. uchun email manzil \"\n\"qoʻshishingiz kerak.\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"Email Manzilingizni Tasdiqlash\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"Tasdiqlash uchun sizga xat yubordik. Roʻyxatdan oʻtish jarayonini yakunlash \"\n\"uchun taqdim etilgan havolaga oʻting. Agar tasdiqlash xatini asosiy pochta \"\n\"qutingizda koʻrmasangiz, spam jildini tekshiring. Agar bir necha daqiqa \"\n\"ichida tasdiqlash xatini olmagan boʻlsangiz, biz bilan bogʻlaning.\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"Saytning ushbu qismi bizdan\\n\"\n\" siz o'zingizni da'vo qilayotgan shaxs ekanligingizni tasdiqlashimizni talab \"\n\"qiladi. Buning uchun\\n\"\n\" email manzilingizga egaligingizni tasdiqlashingizni talab qilamiz.\"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"Tasdiqlash uchun\\n\"\n\" sizga xat yubordik. Iltimos, ushbu xat ichidagi havolani bosing. Agar \"\n\"tasdiqlash xatini asosiy pochta qutingizda koʻrmasangiz, spam jildini \"\n\"tekshiring. Aks holda bir necha daqiqa ichida uniqabul qilmasangiz,\\n\"\n\" biz bilan bogʻlaning. \"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>Eslatma:</strong> siz hali ham <a href=\\\"%(email_url)s\\\">email \"\n\"manzilingizni o‘zgartirishingiz mumkin</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"Xabarlar:\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"Menyu:\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"Ulangan Akkauntlar\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"Ikki-bosqichli Autentifikatsiya\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"Seanslar\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"Avtorizatsiya qilish\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"\"\n\"%(client_name)s sizning %(site_name)s akkauntingizga kirish huquqini \"\n\"so'ramoqda.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"Qurilma kodini kiritish\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"Qurilmangizda ko'rsatilgan kodni kiriting.\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"Davom Etish\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"Qurilmani tasdiqlash\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"\"\n\"Ushbu qurilmani avtorizatsiya qilish uchun %(client_name)s da ko'rsatilgan \"\n\"kodni tasdiqlang.\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"Rad etish\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"Qurilma avtorizatsiya qilindi\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"\"\n\"Siz %(client_name)s qurilmangizni muvaffaqiyatli avtorizatsiya qildingiz.\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"Qurilma rad etildi\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"%(client_name)s qurilmangiz uchun avtorizatsiya rad etildi.\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"Xato\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"Tizimda qolish\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"\"\n\"Akkauntingiz ikki-bosqichli autentifikatsiya bilan himoyalangan. Iltimos, \"\n\"autentifikatsiya kodini kiriting:\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"\"\n\"Ikki-bosqichli autentifikatsiyani tiklash kodlarining yangi to'plami \"\n\"yaratildi.\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"Yangi Tiklash Kodlari Yaratildi\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"Autentifikatsiya ilovasi faollashtirildi.\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"Autentifikatsiya Ilovasi Faollashtirildi\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"Authenticator ilovasi faolsizlantirildi.\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"Authenticator Ilovasi Faolsizlantirildi\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"Yangi elektron kalit qo‘shildi.\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"Elektron Kalit Qo'shildi\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"Elektron kalit olib tashlandi.\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"Elektron Kalit Olib Tashlandi\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"Autentifikatsiya Ilovasi\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"Autentifikatsiya ilovasi orqali autentifikatsiya faol.\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"Autentifikatsiya ilovasi faol emas.\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"Faolsizlantirish\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"Faollashtirish\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"Xavfsizlik Kalitlari\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"%(count)s ta xavfsizlik kaliti qo'shildi.\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"Hech qanday xavfsizlik kalitlari qo'shilmadi.\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"Boshqarish\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"Qo'shish\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"Tiklash Kodlari\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"%(total_count)s ta tiklash kodidan %(unused_count)s tasi mavjud.\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"Qayta tiklash kodlari sozlanmagan.\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"Ko‘rish\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"Yuklab Olish\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"Yaratish\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"Qayta tiklash kodlarining yangi to'plami yaratildi.\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"Elektron kalit qo'shildi.\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"Elektron kalit olib tashlandi.\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"Autentifikatsiya kodini kiriting:\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"Akkauntingiz uchun yangi tiklash kodlari toʻplamini yaratasiz.\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"Ushbu harakat mavjud kodlaringizni bekor qiladi.\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"Ishonchingiz komilmi?\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"Ishlatilmagan kodlar\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"Kodlarni yuklab olish\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"Yangi kodlarni hosil qilish\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"Autentifikatsiya Ilovasini Faollashtirish\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"Akkauntingizni ikki-bosqichli autentifikatsiya bilan himoya qilish uchun \"\n\"autentifikatsiya ilovasi yordamida quyidagi QR kodni skanerlang. Keyin ilova \"\n\"tomonidan yaratilgan tasdiqlash kodini kiriting.\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Autentifikatsiya kaliti\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"\"\n\"Siz ushbu kalitni saqlashingiz va undan keyinroq autentifikatsiya \"\n\"ilovangizni qayta oʻrnatish uchun foydalanishingiz mumkin.\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"Autentifikatsiya Ilovasini Faolsizlantirish\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"\"\n\"Siz autentifikatsiya qiluvchi ilovaga asoslangan autentifikatsiyani o'chirib \"\n\"qo'ymoqchisiz. Ishonchingiz komilmi?\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"Ushbu brauzerga ishonasizmi?\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"\"\n\"Agar siz ushbu brauzerga ishonishni tanlasangiz, keyingi safar tizimga \"\n\"kirganingizda tasdiqlash kodi so'ralmaydi.\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"%(period)s davomida ishonish\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"Ishonmaslik\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"Elektron Kalit Qo'shish\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"Elektron Kalitni Olib Tashlash\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"Haqiqatan ham bu elektron kalitni olib tashlamoqchimisiz?\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"Qo'llanilish\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"O'tish kaliti\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"Xavfsizlik kaliti\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"Bu kalit uning o'tish kaliti yoki yo'qligini bildirmaydi.\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"Aniqlanmagan\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"%(created_at)s da qoʻshilgan\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"%(last_used)s da oxirgi marta ishlatilgan\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"O'zgartirish\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"Elektron Kalitni O'zgartirish\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"Saqlash\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"Parol kalitini yaratish\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"Siz akkauntingiz uchun parol kalitini yaratmoqchisiz. Keyinchalik qo'shimcha \"\n\"kalitlarni qo'shishingiz mumkin bo'lganligi sababli, kalitlarni ajratish \"\n\"uchun tavsifiy nom ishlatishingiz mumkin.\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"Yaratish\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"Bu funksiya JavaScript-ni talab qiladi.\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"Uchinchi Tomon Tizimga Kirishda Xato\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"\"\n\"Uchinchi tomon akkauntingiz orqali kirishga urinishda xatolik yuz berdi.\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"\"\n\"Siz quyidagi uchinchi tomon akkauntlaridan foydalanib akkauntingizga \"\n\"kirishingiz mumkin:\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"Sizda hozirda ushbu akkauntga ulangan uchinchi tomon akkauntlari yo'q.\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"Uchinchi Tomon Aakkauntini Qo'shish\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"\"\n\"%(provider)s kompaniyasining uchinchi tomon akkaunti sizning akkauntingizga \"\n\"ulandi.\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"Uchinchi Tomon Akkaunti Ulandi\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"\"\n\"%(provider)s kompaniyasining uchinchi tomon akkaunti sizning akkauntingizdan \"\n\"uzildi.\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"Uchinchi Tomon Akkaunti Uzildi\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"%(provider)sni Ulash\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"Siz %(provider)s dan yangi uchinchi tomon akkauntini ulamoqchisiz.\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"%(provider)s Orqali Kirish\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"\"\n\"Siz %(provider)s dan uchinchi tomon akkaunti orqali tizimga kirmoqchisiz.\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"Kirish Bekor Qilindi\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"Siz mavjud akkauntlaringizdan biri yordamida saytimizga kirishni bekor \"\n\"qilishga qaror qildingiz. Agar bu xato boʻlsa, <a \"\n\"href=\\\"%(login_url)s\\\">kirishga</a> oʻting.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"Uchinchi tomon akkaunti ulandi.\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"Uchinchi tomon akkaunti uzildi.\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"Siz %(site_name)s saytiga kirish uchun\\n\"\n\"%(provider_name)s akkauntingizdan foydalanmoqchisiz. Yakuniy qadam sifatida \"\n\"quyidagi formani to‘ldiring:\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"Yoki uchinchi tomondan foydalaning\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"Boshqa barcha seanslardan chiqildi.\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"Boshlangan\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP Manzil\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"Brauzer\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"Oxirgi marta ko'rilgan\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"Hozirgi\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"Boshqa Seanslardan Chiqish\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"Foydalanuvchi Seanslari\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"seans kaliti\"\n\n#~ msgid \"Account Connection\"\n#~ msgstr \"Akkauntga Bog'lanish\"\n"
  },
  {
    "path": "allauth/locale/zh_Hans/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-09-15 15:01+0000\\n\"\n\"Last-Translator: Cassian <prismarine@epicraft.top>\\n\"\n\"Language-Team: Chinese (Simplified Han script) <https://hosted.weblate.org/\"\n\"projects/allauth/django-allauth/zh_Hans/>\\n\"\n\"Language: zh_Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 5.14-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"此账号当前未激活。\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"您不能删除您的主要电子邮件地址 (%(email)s)。\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"此电子邮件地址已关联到这个账号。\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"您提供的电子邮件地址和/或密码不正确。\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"您输入的电话号码和/或密码不正确。\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"此电子邮件地址已被其他用户注册。\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"请输入您的当前密码。\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"错误代码。\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"无效密码。\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"令牌无效或过期。\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"登录无效。\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"您重置密码的token是无效的。\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"您不能添加超过%d个电子邮件地址。\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"此电话号码已被其他用户注册。\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"登录失败次数过多，请稍后重试。\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"此电子邮件地址未分配给任何用户账号。\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"此电话号码未分配给任何用户账号。\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"您的主要电子邮件地址必须被验证。\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"此用户名不能使用，请改用其他用户名。\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"您提供的用户名或密码不正确。\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"请仅选择一项。\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"新的输入值必须不同于当前的内容。\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"请稍等，您已经提交过多次请求。\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"使用您的密码\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"请使用认证APP或代码\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"使用安全密钥\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"已将 {email} 标记为已验证。\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"标记 {email} 为已验证失败。\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"将选中的电子邮件地址标记为已验证\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"账户\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"电子邮件\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"电子邮件地址\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"请输入包含国家/地区代码的电话号码（例如，美国为 +1）。\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"电话号码\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"每次输入的密码必须相同。\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"密码\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"记住我\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"用户名\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"登录\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"用户名、电子邮件或电话号码\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"用户名或email\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"用户名或电话号码\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"电子邮件或电话号码\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"忘记密码？\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"电子邮件（再次输入）\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"电子邮件地址确认\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"电子邮件 （选填项）\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"用户名（选填项）\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"每次输入的电子邮件必须相同。\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"密码（重复）\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"当前密码\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"新密码\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"新密码（重复）\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"代码\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"用户\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"电子邮件地址\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"已验证\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"主要\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"电子邮件地址\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"已建立\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"已发送\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"密钥\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"电子邮件确认\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"电子邮件确认\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"无头\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"查看您的用户 ID\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"查看您的电子邮件地址\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"查看您的基本个人资料信息\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"授予权限\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"除非启用“允许 URI 通配符”，否则不允许使用通配符。\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"URI“{}”包含多个通配符 (*)。每个 URI 只允许一个通配符。\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"通配符只允许在 URI 的主机名部分使用。\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"验证码\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"设备代码\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"客户端密钥\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"刷新令牌\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"机密\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"公共\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"客户端被允许请求的范围。每行提供一个值，例如：openid(回车)profile(回\"\n\"车)email(回车)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"如果客户端没有指定任何范围，将使用这些默认范围。每行提供一个值，例如：\"\n\"openid(回车)profile(回车)email(回车)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"允许的授权类型列表。每行提供一个值，例如：authorization_code(回\"\n\"车)client_credentials(回车)refresh_token(回车)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"跨域请求允许的源列表，每行一个。\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"允许在重定向 URI 和 CORS 来源中使用通配符 (*)。启用后，URI 可以包含一个星号来\"\n\"匹配子域名。\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"允许的响应类型列表。每行提供一个值，例如：code(回车)id_token token(回车)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"客户端\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"客户端\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"您不能在开启了两步验证的账户中添加电子邮件地址。\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"您不能停用两步验证。\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"未启用两步验证，您无法生成恢复代码。\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"在验证您的Email地址之前，您不能激活两步验证。\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"主密钥\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"备份密钥\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"密钥 {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"多因素认证\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"恢复代码\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP 认证器\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"WebAuthn\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"认证器代码\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"无密码\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"启用无密码操作允许您仅使用此密钥登录，但会提出其他要求，例如生物特征或PIN保\"\n\"护。\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"已有一个账号与此Email地址关联。请先登录该账号，然后连接您的 %s 账号。\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"令牌无效。\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"您的账号未设置密码。\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"您的账号下无任何验证过的email地址。\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"您不能断开您剩下的唯一的第三方账号。\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"该第三方账号已连接到另一个账户。\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"社交账户\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"提供者\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"提供者ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"名字\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"客户端ID\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"应用ID或消费者密钥\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"密钥\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API密钥、客户端密钥或消费者密钥\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"密钥\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"社交应用\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"社交应用程序\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"用户ID\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"最后一次登录\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"加入日期\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"额外数据\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"社交账户\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"社交账号\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"令牌\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"\\\"oauth_token\\\" (OAuth1) 或访问令牌 (OAuth2)\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"令牌密钥\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"\\\"oauth_token_secret\\\" (OAuth1) 或刷新令牌 (OAuth2)\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"过期时间\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"社交应用令牌\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"社交应用令牌\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"无效个人资料数据\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"登录\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"在请求token时收到无效的响应\\\"%s\\\"。响应如下：%s。\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"从 \\\"%s\\\" 获取访问令牌时响应无效。\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"未保存 \\\"%s\\\" 的请求令牌。\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"未保存 \\\"%s\\\" 的访问令牌。\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"无权访问私有资源 \\\"%s\\\"。\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"从 \\\"%s\\\" 获取请求令牌时响应无效。\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"账号未激活\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"此账号未激活。\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"我们已发送一个代码到 %(recipient)s。该代码将很快过期，请尽快输入。\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"确认\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"请求新代码\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"确认访问\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"请重新验证以保护您的账户安全。\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"可选项\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"电子邮件验证\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"输入电子邮件验证码：\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"使用不同的电子邮件地址\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"登录\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"输入登录代码\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"密码重置\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"输入密码重置代码\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"电话验证\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"输入电话验证代码：\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"使用不同的电话号码\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"Email地址\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"以下Email地址已关联到您的帐号：\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"已验证\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"未验证\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"首选Email\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"设置为首选\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"重发验证Email\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"移除\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"添加Email地址\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"添加Email\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"您真的想移除选定的Email地址吗？\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"您收到这封电子邮件是因为您或其他人尝试使用以下电子邮件地址注册账户：\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"但是，使用该电子邮件地址的账户已经存在。如果您忘记了这一点，请使用密码找回程\"\n\"序来恢复您的账户：\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"账户已经存在\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"来自%(site_name)s的 Hello!\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"感谢您使用 %(site_name)s！\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"您收到这封邮件是因为您的账户产生了以下变动：\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"如果这不是您做出的更改，请立即采取适当的安全措施。对您的账户的更改来自：\\n\"\n\"\\n\"\n\"- IP地址: %(ip)s\\n\"\n\"- 浏览器: %(user_agent)s\\n\"\n\"- 日期: %(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"您的电子邮件已从 %(from_email)s 更改为 %(to_email)s。\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"Email已更改\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"您的Email已经被确认。\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"Email确认\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"您收到此电子邮件是因为用户 %(user_display)s 使用您的电子邮件地址在 \"\n\"%(site_domain)s 上注册了一个账户。\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"您的电子邮件验证代码如下所示。请在打开的浏览器窗口中输入。\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"要确认这是正确的，请访问 %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"请确认您的Email地址\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"Email地址 %(deleted_email)s 已从您的账户中移除。\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Email被移除了\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"您的登录代码如下所示。请在打开的浏览器窗口中输入。\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"如果您没有发起这个操作，您可以安全地忽略这封邮件。\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"登录代码\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"您的密码现已被修改。\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"密码已更改\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"您的密码重置代码如下所示。请在打开的浏览器窗口中输入。\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"密码重置代码\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"您收到此电子邮件是因为您或其他人申请了重置您的用户账户密码。\\n\"\n\"如果您没有申请重置密码，您可以安全地忽略此邮件。点击下面的链接以重置您的密\"\n\"码。\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"作为提示，您的用户名是%(username)s.\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"密码重置邮件\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"您的密码已被重置。\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"您的密码已被设置。\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"密码设置\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"您收到这封邮件是因为您或其他人尝试使用电子邮件 %(email)s 访问一个账户。然而，\"\n\"我们的数据库中没有这个账户的任何记录。\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"如果是您本人，您可以使用下面的链接注册一个账户。\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"未知账号\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"Email地址\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"当前Email\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"改为\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"您的电子邮件地址仍在等待验证。\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"取消变更\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"改为\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"更改Email\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"确认Email地址\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"请确认<a href=\\\"mailto:%(email)s\\\">%(email)s</a>是用户%(user_display)s的电子\"\n\"邮件地址。\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"无法确认%(email)s，因为它已被另一个账户确认。\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"这个电子邮件确认链接已过期或无效。请<a href=\\\"%(email_url)s\\\">发起新的电子邮\"\n\"件确认请求</a>。\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"如果您还没有创建账号，请先 %(link)s注册%(end_link)s 。\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"使用 passkey 登录\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"发送登录代码给我\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"登出\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"您确定要登出吗？\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"您不能删除您的主Email地址 (%(email)s) 。\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"确认邮件已发往 %(email)s。\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"您已确认Email地址 %(email)s。\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"已移除Email地址 %(email)s。\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"以 %(name)s 成功登录。\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"您已登出。\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"登录代码已发送至 %(recipient)s。\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"密码修改成功。\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"密码设置成功。\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"验证码已发送至 %(phone)s。\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"您已验证电话号码 %(phone)s。\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"主Email地址已设置。\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"修改密码\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"忘记密码？\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"忘记您的密码了吗？请在下面输入您的电子邮件地址，我们将发送一封电子邮件，让您\"\n\"可以重置密码。\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"重置我的密码\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"如在重置密码时遇到问题，请与我们联系。\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"我们已经给您发送了一封电子邮件。如果您还没有收到，请检查您的垃圾邮件文件夹。\"\n\"否则，如果几分钟内仍未收到，请联系我们。\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"不正确的 token\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"密码重置链接无效，可能是因为它已被使用。请申请<a \"\n\"href=\\\"%(passwd_reset_url)s\\\">新的密码重置</a>。\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"您的密码现已被修改。\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"设置密码\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"更改电话\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"当前电话\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"您的电话号码仍在等待验证。\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"更改电话\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"输入您的密码:\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"您将收到一个用于免密码登录的特殊代码。\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"请求码\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"其它登录选项\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"注册\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"注册\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"已经有一个账号？ 请%(link)s登录%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"使用 passkey 注册\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"Passkey 注册\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"其它选项\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"注册关闭\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"非常抱歉，当前已关闭注册。\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"注意\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"您已以 %(user_display)s 的身份登录。\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"警告：\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"您当前未设置任何电子邮件地址。您真的应该添加一个电子邮件地址，以便接收通知，\"\n\"重置密码等。\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"验证您的Email地址\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"我们已向您发送了一封验证邮件。请按照邮件中提供的链接完成注册流程。如果您在主\"\n\"收件箱中看不到验证邮件，请检查您的垃圾邮件文件夹。如果几分钟内还没有收到验证\"\n\"邮件，请联系我们。\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"本站的这部分需要我们验证您的身份真实性。为此，我们需要您验证您的电子邮件地址\"\n\"的所有权。\"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"我们已向您发送了一封用于验证的电子邮件。请点击邮件内的链接。如果您在主收件箱\"\n\"中找不到该验证邮件，请检查您的垃圾邮件文件夹。否则，如果几分钟内还未收到，请\"\n\"联系我们。\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>注意：</strong>您仍然可以<a href=\\\"%(email_url)s\\\">更改您的电子邮件地\"\n\"址</a>。\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"消息：\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"菜单：\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"账号连接\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"双因素身份认证\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"会话\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"授权\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s 想要访问您的 %(site_name)s 账户。\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"输入设备代码\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"输入您设备上显示的代码。\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"继续\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"确认设备\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"请确认您的 %(client_name)s 上显示的代码以授权此设备。\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"拒绝\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"设备已授权\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"您已成功授权您的 %(client_name)s 设备。\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"设备已拒绝\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"您的 %(client_name)s 设备的授权已被拒绝。\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"错误\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"保持登录\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"您的帐户已受到双因素身份认证的保护。请输入身份验证器代码：\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"已生成一组新的双因素身份认证恢复代码。\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"已生成新的恢复代码\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"身份验证器应用已激活。\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"身份验证器应用已激活\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"身份验证器应用已停用。\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"身份验证器应用已停用\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"已添加新的安全密钥。\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"已添加新的密钥\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"一个安全密钥已被移除。\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"密钥已被移除\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"身份验证器应用\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"使用身份验证器应用进行身份验证处于活动状态。\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"未激活身份验证器应用。\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"停用\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"激活\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"安全密钥\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"您已添加%(count)s个安全密钥。\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"未添加安全密钥。\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"管理\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"添加\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"恢复代码\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"在 %(total_count)s个恢复码中，有 %(unused_count)s 个可用。\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"未设置恢复代码。\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"查看\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"下载\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"生成\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"已生成新的恢复代码集。\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"已添加安全密钥。\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"已移除安全密钥。\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"输入身份验证器代码：\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"您即将为您的帐户生成一组新的恢复代码。\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"此操作将使您现有的代码失效。\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"确定要执行此操作吗？\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"未使用的代码\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"下载代码\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"生成新代码\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"激活身份验证器应用\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"为使用双因素验证保护您的帐户，您需要使用身份验证器应用扫描下方的二维码。然\"\n\"后，在下方输入应用生成的验证代码。\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"身份验证器密钥\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"您可以保存此密钥，以便以后重新安装您的身份验证器应用程序。\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"停用身份验证器应用\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"您即将停用基于身份验证器应用的身份验证。确定要执行此操作吗？\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"信任此浏览器？\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"如果您选择信任此浏览器，下次登录时将不会要求您输入验证码。\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"信任 %(period)s\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"不信任\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"添加安全密钥\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"移除安全密钥\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"您确定要移除此安全密钥吗？\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"用途\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"Passkey\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"安全密钥\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"此密钥未表明其是否为 passkey。\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"未指定\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"添加于 %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"上次使用：%(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"编辑\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"编辑安全密钥\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"保存\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"创建 Passkey\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"您即将为您的账户创建一个 passkey。由于您以后可以添加其他密钥，因此可以使用描\"\n\"述性名称来区分密钥。\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"创建\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"此功能需要 JavaScript。\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"第三方登录失败\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"尝试通过您的第三方账户登录时发生错误。\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"您可以使用以下任一第三方账号登录您的账户：\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"您当前没有与此账户关联的第三方账号。\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"添加一个第三方账号\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"已连接来自 %(provider)s 的第三方账号到您的账户。\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"第三方账号已连接\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"已从您的账户断开来自 %(provider)s 的第三方账号连接。\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"第三方账号已断开\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"连接 %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"您即将连接一个新的来自 %(provider)s 的第三方账号。\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"通过 %(provider)s 登录\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"您即将使用来自 %(provider)s 的第三方账号登录。\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"登录已取消\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"您决定取消使用您的已有账号登录我们的网站。如果这是一个失误，请继续<a \"\n\"href=\\\"%(login_url)s\\\">登录</a>.\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"第三方账号已连接。\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"第三方账号已断开连接。\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"您即将使用您的 %(provider_name)s 账号登录到\\n\"\n\"%(site_name)s。作为最后一步，请完成以下表单：\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"或使用第三方\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"已退出所有其他会话。\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"开始时间\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP地址\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"浏览器\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"上次查看于\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"当前\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"注销其他会话\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"用户会话\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"会话密钥\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"账号连接\"\n\n#~ msgid \"Use security key or device\"\n#~ msgstr \"请使用安全密钥或设备\"\n\n#~ msgid \"Add Security Key or Device\"\n#~ msgstr \"添加安全密钥或设备\"\n\n#~ msgid \"Add key or device\"\n#~ msgstr \"添加密钥或设备\"\n\n#~ msgid \"Security Keys and Devices\"\n#~ msgstr \"安全密钥和设备\"\n\n#~ msgid \"You have not added any security keys/devices.\"\n#~ msgstr \"您尚未添加任何安全密钥/设备。\"\n\n#~ msgid \"Edit Security Key or Device\"\n#~ msgstr \"编辑安全密钥或设备\"\n"
  },
  {
    "path": "allauth/locale/zh_Hant/LC_MESSAGES/django.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-03-05 08:42-0600\\n\"\n\"PO-Revision-Date: 2025-11-21 12:51+0000\\n\"\n\"Last-Translator: Jeff Ma <jma30056@gmail.com>\\n\"\n\"Language-Team: Chinese (Traditional Han script) <https://hosted.weblate.org/\"\n\"projects/allauth/django-allauth/zh_Hant/>\\n\"\n\"Language: zh_Hant\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 5.15-dev\\n\"\n\n#: account/adapter.py:61\nmsgid \"This account is currently inactive.\"\nmsgstr \"此帳號目前未啟用。\"\n\n#: account/adapter.py:63\nmsgid \"You cannot remove your primary email address.\"\nmsgstr \"您不能移除您的主要電子郵件地址。\"\n\n#: account/adapter.py:66\nmsgid \"This email address is already associated with this account.\"\nmsgstr \"此電子郵件地址已經與此帳號連結了。\"\n\n#: account/adapter.py:69\nmsgid \"The email address and/or password you specified are not correct.\"\nmsgstr \"您提供的電子郵件地址和／或密碼不正確。\"\n\n#: account/adapter.py:72\nmsgid \"The phone number and/or password you specified are not correct.\"\nmsgstr \"您提供的電話號碼和／或密碼不正確。\"\n\n#: account/adapter.py:74\nmsgid \"A user is already registered with this email address.\"\nmsgstr \"已經有使用者使用此電子郵件地址註冊。\"\n\n#: account/adapter.py:75\nmsgid \"Please type your current password.\"\nmsgstr \"請輸入您目前的密碼。\"\n\n#: account/adapter.py:76 mfa/adapter.py:40\nmsgid \"Incorrect code.\"\nmsgstr \"不正確的代碼。\"\n\n#: account/adapter.py:77\nmsgid \"Incorrect password.\"\nmsgstr \"不正確的密碼。\"\n\n#: account/adapter.py:78\nmsgid \"Invalid or expired key.\"\nmsgstr \"無效或已過期的金鑰。\"\n\n#: account/adapter.py:79\nmsgid \"Invalid login.\"\nmsgstr \"登入無效。\"\n\n#: account/adapter.py:80\nmsgid \"The password reset token was invalid.\"\nmsgstr \"密碼重置令牌無效。\"\n\n#: account/adapter.py:81\n#, python-format\nmsgid \"You cannot add more than %d email addresses.\"\nmsgstr \"您不能新增超過 %d 個電子郵件地址。\"\n\n#: account/adapter.py:82\nmsgid \"A user is already registered with this phone number.\"\nmsgstr \"已經有使用者使用此電話號碼註冊。\"\n\n#: account/adapter.py:84\nmsgid \"Too many failed login attempts. Try again later.\"\nmsgstr \"登入嘗試失敗次數過多，請稍後再試。\"\n\n#: account/adapter.py:86\nmsgid \"The email address is not assigned to any user account.\"\nmsgstr \"此電子郵件地址未分配給任何使用者帳號。\"\n\n#: account/adapter.py:87\nmsgid \"The phone number is not assigned to any user account.\"\nmsgstr \"此電話未分配給任何使用者帳號。\"\n\n#: account/adapter.py:88\n#: templates/account/messages/unverified_primary_email.txt:2\nmsgid \"Your primary email address must be verified.\"\nmsgstr \"您必須驗證您的主要電子郵件地址。\"\n\n#: account/adapter.py:90\nmsgid \"Username can not be used. Please use other username.\"\nmsgstr \"無法使用此使用者名稱。請使用其他使用者名稱。\"\n\n#: account/adapter.py:93\nmsgid \"The username and/or password you specified are not correct.\"\nmsgstr \"您提供的使用者名稱和／或密碼不正確。\"\n\n#: account/adapter.py:98\nmsgid \"Please select only one.\"\nmsgstr \"請僅選擇一項。\"\n\n#: account/adapter.py:99\nmsgid \"The new value must be different from the current one.\"\nmsgstr \"新的輸入值必須不同於目前的內容。\"\n\n#: account/adapter.py:100\nmsgid \"Be patient, you are sending too many requests.\"\nmsgstr \"請稍候，您已經送出過多次的請求。\"\n\n#: account/adapter.py:826\nmsgid \"Use your password\"\nmsgstr \"使用您的密碼\"\n\n#: account/adapter.py:835\nmsgid \"Use authenticator app or code\"\nmsgstr \"使用驗證器應用程式或代碼\"\n\n#: account/adapter.py:842 templates/mfa/authenticate.html:41\n#: templates/mfa/webauthn/reauthenticate.html:15\nmsgid \"Use a security key\"\nmsgstr \"使用安全金鑰\"\n\n#: account/admin.py:30\n#, python-brace-format\nmsgid \"Marked {email} as verified.\"\nmsgstr \"已將 {email} 標記為已驗證。\"\n\n#: account/admin.py:36\n#, python-brace-format\nmsgid \"Failed to mark {email} as verified.\"\nmsgstr \"您的主要電子郵件地址{email}未標示造成驗証錯誤\"\n\n#: account/admin.py:42\nmsgid \"Mark selected email addresses as verified\"\nmsgstr \"標記已選取的電子郵件地址為已驗證\"\n\n#: account/apps.py:11\nmsgid \"Accounts\"\nmsgstr \"帳號\"\n\n#: account/fields.py:12 account/forms.py:299 idp/oidc/forms.py:43\nmsgid \"Email\"\nmsgstr \"電子郵件\"\n\n#: account/fields.py:19\nmsgid \"Email address\"\nmsgstr \"電子郵件地址\"\n\n#: account/fields.py:62\nmsgid \"Enter a phone number including country code (e.g. +1 for the US).\"\nmsgstr \"請輸入包含國家碼的電話號碼 (例如：+1 美國)。\"\n\n#: account/fields.py:68 account/fields.py:72 account/forms.py:325\nmsgid \"Phone\"\nmsgstr \"電話\"\n\n#: account/forms.py:61 account/forms.py:524\nmsgid \"You must type the same password each time.\"\nmsgstr \"您必須每次輸入相同的密碼。\"\n\n#: account/forms.py:66 account/forms.py:451 account/forms.py:610\n#: account/forms.py:696\nmsgid \"Password\"\nmsgstr \"密碼\"\n\n#: account/forms.py:67\nmsgid \"Remember Me\"\nmsgstr \"記住我\"\n\n#: account/forms.py:79 account/forms.py:82 account/forms.py:265\n#: account/forms.py:268 account/forms.py:311\nmsgid \"Username\"\nmsgstr \"使用者名稱\"\n\n#: account/forms.py:96\nmsgctxt \"field label\"\nmsgid \"Login\"\nmsgstr \"登入\"\n\n#: account/forms.py:115\nmsgid \"Username, email or phone\"\nmsgstr \"使用者名稱、電子郵件或電話號碼\"\n\n#: account/forms.py:117\nmsgid \"Username or email\"\nmsgstr \"使用者名稱或電子郵件\"\n\n#: account/forms.py:119\nmsgid \"Username or phone\"\nmsgstr \"使用者名稱或電話號碼\"\n\n#: account/forms.py:121\nmsgid \"Email or phone\"\nmsgstr \"電子郵件或電話號碼\"\n\n#: account/forms.py:144\nmsgid \"Forgot your password?\"\nmsgstr \"忘記您的密碼？\"\n\n#: account/forms.py:287\nmsgid \"Email (again)\"\nmsgstr \"電子郵件(再次輸入)\"\n\n#: account/forms.py:292\nmsgid \"Email address confirmation\"\nmsgstr \"電子郵件地址確認\"\n\n#: account/forms.py:302\nmsgid \"Email (optional)\"\nmsgstr \"電子郵件（選擇性）\"\n\n#: account/forms.py:314\nmsgid \"Username (optional)\"\nmsgstr \"使用者名稱（選填）\"\n\n#: account/forms.py:388\nmsgid \"You must type the same email each time.\"\nmsgstr \"您必須每次輸入相同的電子郵件。\"\n\n#: account/forms.py:458 account/forms.py:611\nmsgid \"Password (again)\"\nmsgstr \"密碼(再次輸入)\"\n\n#: account/forms.py:591\nmsgid \"Current Password\"\nmsgstr \"目前密碼\"\n\n#: account/forms.py:593 account/forms.py:649\nmsgid \"New Password\"\nmsgstr \"新密碼\"\n\n#: account/forms.py:594 account/forms.py:650\nmsgid \"New Password (again)\"\nmsgstr \"新密碼(再次輸入)\"\n\n#: account/forms.py:767 account/forms.py:769 idp/oidc/forms.py:51\n#: idp/oidc/forms.py:54 mfa/base/forms.py:12 mfa/base/forms.py:14\n#: mfa/totp/forms.py:13\n#: templates/idp/oidc/device_authorization_confirm_form.html:16\nmsgid \"Code\"\nmsgstr \"代碼\"\n\n#: account/models.py:23\nmsgid \"user\"\nmsgstr \"使用者\"\n\n#: account/models.py:29 account/models.py:37 account/models.py:139\nmsgid \"email address\"\nmsgstr \"電子郵件地址\"\n\n#: account/models.py:31\nmsgid \"verified\"\nmsgstr \"已驗證\"\n\n#: account/models.py:32\nmsgid \"primary\"\nmsgstr \"主要\"\n\n#: account/models.py:38\nmsgid \"email addresses\"\nmsgstr \"電子郵件地址\"\n\n#: account/models.py:142\nmsgid \"created\"\nmsgstr \"已建立\"\n\n#: account/models.py:143\nmsgid \"sent\"\nmsgstr \"已傳送\"\n\n#: account/models.py:144 socialaccount/models.py:70\nmsgid \"key\"\nmsgstr \"金鑰\"\n\n#: account/models.py:149\nmsgid \"email confirmation\"\nmsgstr \"電子郵件確認\"\n\n#: account/models.py:150\nmsgid \"email confirmations\"\nmsgstr \"電子郵件確認\"\n\n#: headless/apps.py:7\nmsgid \"Headless\"\nmsgstr \"無頭\"\n\n#: idp/oidc/adapter.py:30\nmsgid \"View your user ID\"\nmsgstr \"査看你使用者辨識碼\"\n\n#: idp/oidc/adapter.py:31\nmsgid \"View your email address\"\nmsgstr \"查看您的電子郵件地址\"\n\n#: idp/oidc/adapter.py:32\nmsgid \"View your basic profile information\"\nmsgstr \"査看你基本個人資料\"\n\n#: idp/oidc/forms.py:31\nmsgid \"Grant permissions\"\nmsgstr \"使用者賦予許可\"\n\n#: idp/oidc/internal/clientkit.py:22\nmsgid \"Wildcards are not allowed unless 'Allow URI wildcards' is enabled.\"\nmsgstr \"除非啟用「允許 URI 萬用字元」，否則不允許使用萬用字元。\"\n\n#: idp/oidc/internal/clientkit.py:27\nmsgid \"\"\n\"URI '{}' contains more than one wildcard (*). Only one wildcard per URI is \"\n\"allowed.\"\nmsgstr \"URI「{}」包含多個萬用字元 (*)。每個 URI 僅允許一個萬用字元。\"\n\n#: idp/oidc/internal/clientkit.py:39\nmsgid \"Wildcards are only allowed in the hostname portion of the URI.\"\nmsgstr \"萬用字元僅允許在 URI 的主機名稱部分使用。\"\n\n#: idp/oidc/models.py:37\nmsgid \"Authorization code\"\nmsgstr \"驗證代碼\"\n\n#: idp/oidc/models.py:38\nmsgid \"Device code\"\nmsgstr \"元件代碼\"\n\n#: idp/oidc/models.py:39\nmsgid \"Client credentials\"\nmsgstr \"客户信用評等\"\n\n#: idp/oidc/models.py:40\nmsgid \"Refresh token\"\nmsgstr \"重置籌碼\"\n\n#: idp/oidc/models.py:43\nmsgid \"Confidential\"\nmsgstr \"保密\"\n\n#: idp/oidc/models.py:44\nmsgid \"Public\"\nmsgstr \"公眾\"\n\n#: idp/oidc/models.py:58\nmsgid \"\"\n\"The scope(s) the client is allowed to request. Provide one value per line, \"\n\"e.g.: openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"客戶端被允許請求的範圍。每行提供一個值，例如：openid(換行)profile(換\"\n\"行)email(換行)\"\n\n#: idp/oidc/models.py:64\nmsgid \"\"\n\"In case the client does not specify any scope, these default scopes are \"\n\"used. Provide one value per line, e.g.: \"\n\"openid(ENTER)profile(ENTER)email(ENTER)\"\nmsgstr \"\"\n\"如果客戶端沒有指定任何範圍，將使用這些預設範圍。每行提供一個值，例如：\"\n\"openid(換行)profile(換行)email(換行)\"\n\n#: idp/oidc/models.py:75\nmsgid \"\"\n\"A list of allowed grant types. Provide one value per line, e.g.: \"\n\"authorization_code(ENTER)client_credentials(ENTER)refresh_token(ENTER)\"\nmsgstr \"\"\n\"允許的授權類型列表。每行提供一個值，例如：authorization_code(換\"\n\"行)client_credentials(換行)refresh_token(換行)\"\n\n#: idp/oidc/models.py:86\nmsgid \"A list of allowed origins for cross-origin requests, one per line.\"\nmsgstr \"跨域請求允許的來源列表，每行一個。\"\n\n#: idp/oidc/models.py:94\nmsgid \"\"\n\"Allow wildcards (*) in redirect URIs and CORS origins. When enabled, URIs \"\n\"can contain a single asterisk to match subdomains.\"\nmsgstr \"\"\n\"允許在重新導向 URI 和 CORS 來源中使用萬用字元 (*)。啟用後，URI 可以包含一個星\"\n\"號來比對子網域。\"\n\n#: idp/oidc/models.py:102\nmsgid \"\"\n\"A list of allowed response types. Provide one value per line, e.g.: \"\n\"code(ENTER)id_token token(ENTER)\"\nmsgstr \"\"\n\"允許的回應類型列表。每行提供一個值，例如：code(換行)id_token token(換行)\"\n\n#: idp/oidc/models.py:115\nmsgid \"client\"\nmsgstr \"客戶端\"\n\n#: idp/oidc/models.py:116\nmsgid \"clients\"\nmsgstr \"客戶端\"\n\n#: mfa/adapter.py:32\nmsgid \"\"\n\"You cannot add an email address to an account protected by two-factor \"\n\"authentication.\"\nmsgstr \"您不能將電子郵件地址新增至受雙重驗證保護的帳號。\"\n\n#: mfa/adapter.py:35\nmsgid \"You cannot deactivate two-factor authentication.\"\nmsgstr \"您不能停用雙重驗證。\"\n\n#: mfa/adapter.py:38\nmsgid \"\"\n\"You cannot generate recovery codes without having two-factor authentication \"\n\"enabled.\"\nmsgstr \"您不能在未啟用雙重驗證下產生復原代碼。\"\n\n#: mfa/adapter.py:42\nmsgid \"\"\n\"You cannot activate two-factor authentication until you have verified your \"\n\"email address.\"\nmsgstr \"您不能在驗證您的電子郵件地址之前啟用雙重驗證。\"\n\n#: mfa/adapter.py:141\nmsgid \"Master key\"\nmsgstr \"主要金鑰\"\n\n#: mfa/adapter.py:143\nmsgid \"Backup key\"\nmsgstr \"備份金鑰\"\n\n#: mfa/adapter.py:144\n#, python-brace-format\nmsgid \"Key nr. {number}\"\nmsgstr \"鑰匙編號 {number}\"\n\n#: mfa/apps.py:9\nmsgid \"MFA\"\nmsgstr \"多重要素驗證\"\n\n#: mfa/models.py:24\nmsgid \"Recovery codes\"\nmsgstr \"恢復代碼\"\n\n#: mfa/models.py:25\nmsgid \"TOTP Authenticator\"\nmsgstr \"TOTP 驗證器\"\n\n#: mfa/models.py:26\nmsgid \"WebAuthn\"\nmsgstr \"網頁身份驗證\"\n\n#: mfa/totp/forms.py:11\nmsgid \"Authenticator code\"\nmsgstr \"驗證器代碼\"\n\n#: mfa/webauthn/forms.py:56\nmsgid \"Passwordless\"\nmsgstr \"無密碼\"\n\n#: mfa/webauthn/forms.py:59\nmsgid \"\"\n\"Enabling passwordless operation allows you to sign in using just this key, \"\n\"but imposes additional requirements such as biometrics or PIN protection.\"\nmsgstr \"\"\n\"啟用無密碼操作後，您可以僅使用此金鑰登入，但會要求額外的保護措施，如生物識別\"\n\"或 PIN 碼保護。\"\n\n#: socialaccount/adapter.py:30\n#, python-format\nmsgid \"\"\n\"An account already exists with this email address. Please sign in to that \"\n\"account first, then connect your %s account.\"\nmsgstr \"\"\n\"已經有一個帳號與此電子郵件連結了，請先登入該帳號，然後連接你的 %s 帳號。\"\n\n#: socialaccount/adapter.py:34\nmsgid \"Invalid token.\"\nmsgstr \"無效的令牌。\"\n\n#: socialaccount/adapter.py:35\nmsgid \"Your account has no password set up.\"\nmsgstr \"您的帳號沒有設置密碼。\"\n\n#: socialaccount/adapter.py:36\nmsgid \"Your account has no verified email address.\"\nmsgstr \"您的帳號下沒有驗證過的電子郵件地址。\"\n\n#: socialaccount/adapter.py:38\nmsgid \"You cannot disconnect your last remaining third-party account.\"\nmsgstr \"您無法切斷您最後一個的第三方帳號關聯。\"\n\n#: socialaccount/adapter.py:41\n#: templates/socialaccount/messages/account_connected_other.txt:2\nmsgid \"The third-party account is already connected to a different account.\"\nmsgstr \"該第三方帳號已連結至其他帳戶。\"\n\n#: socialaccount/apps.py:9\nmsgid \"Social Accounts\"\nmsgstr \"社群帳號\"\n\n#: socialaccount/models.py:45 socialaccount/models.py:98\nmsgid \"provider\"\nmsgstr \"提供者\"\n\n#: socialaccount/models.py:53\nmsgid \"provider ID\"\nmsgstr \"第三方提供者 ID\"\n\n#: socialaccount/models.py:57\nmsgid \"name\"\nmsgstr \"名稱\"\n\n#: socialaccount/models.py:59\nmsgid \"client id\"\nmsgstr \"client id\"\n\n#: socialaccount/models.py:61\nmsgid \"App ID, or consumer key\"\nmsgstr \"應用程式 ID 或消費者金鑰\"\n\n#: socialaccount/models.py:64\nmsgid \"secret key\"\nmsgstr \"秘密金鑰\"\n\n#: socialaccount/models.py:67\nmsgid \"API secret, client secret, or consumer secret\"\nmsgstr \"API 秘文、客戶秘文或消費者秘文\"\n\n#: socialaccount/models.py:70 templates/mfa/webauthn/authenticator_list.html:18\nmsgid \"Key\"\nmsgstr \"金鑰\"\n\n#: socialaccount/models.py:82\nmsgid \"social application\"\nmsgstr \"社群應用程式\"\n\n#: socialaccount/models.py:83\nmsgid \"social applications\"\nmsgstr \"社群應用程式\"\n\n#: socialaccount/models.py:118\nmsgid \"uid\"\nmsgstr \"使用者 ID\"\n\n#: socialaccount/models.py:120\nmsgid \"last login\"\nmsgstr \"最後一次登入\"\n\n#: socialaccount/models.py:121\nmsgid \"date joined\"\nmsgstr \"加入日期\"\n\n#: socialaccount/models.py:122\nmsgid \"extra data\"\nmsgstr \"額外資料\"\n\n#: socialaccount/models.py:126\nmsgid \"social account\"\nmsgstr \"社群帳號\"\n\n#: socialaccount/models.py:127\nmsgid \"social accounts\"\nmsgstr \"社群帳號\"\n\n#: socialaccount/models.py:161\nmsgid \"token\"\nmsgstr \"令牌\"\n\n#: socialaccount/models.py:162\nmsgid \"\\\"oauth_token\\\" (OAuth1) or access token (OAuth2)\"\nmsgstr \"「oauth_token」（OAuth1）或存取 token（OAuth2）\"\n\n#: socialaccount/models.py:166\nmsgid \"token secret\"\nmsgstr \"token 密鑰\"\n\n#: socialaccount/models.py:167\nmsgid \"\\\"oauth_token_secret\\\" (OAuth1) or refresh token (OAuth2)\"\nmsgstr \"「oauth_token_secret」（OAuth1）或刷新 token（OAuth2）\"\n\n#: socialaccount/models.py:170\nmsgid \"expires at\"\nmsgstr \"過期日\"\n\n#: socialaccount/models.py:175\nmsgid \"social application token\"\nmsgstr \"社群應用程式 Token\"\n\n#: socialaccount/models.py:176\nmsgid \"social application tokens\"\nmsgstr \"社群應用程式 Token\"\n\n#: socialaccount/providers/douban/views.py:35\nmsgid \"Invalid profile data\"\nmsgstr \"無效的資料\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:16\nmsgid \"Login\"\nmsgstr \"登入\"\n\n#: socialaccount/providers/dummy/templates/dummy/authenticate_form.html:19\n#: templates/account/base_confirm_code.html:48\n#: templates/account/base_confirm_code.html:52\n#: templates/account/password_reset_from_key.html:33\n#: templates/idp/oidc/authorization_form.html:26\n#: templates/mfa/authenticate.html:28 templates/mfa/authenticate.html:44\n#: templates/mfa/trust.html:29 templates/mfa/webauthn/signup_form.html:26\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: socialaccount/providers/oauth/client.py:86\n#, python-format\nmsgid \"\"\n\"Invalid response while obtaining request token from \\\"%s\\\". Response was: %s.\"\nmsgstr \"從 \\\"%s\\\" 獲取請求令牌時回應無效。回應內容為：%s。\"\n\n#: socialaccount/providers/oauth/client.py:121\n#: socialaccount/providers/pocket/client.py:81\n#, python-format\nmsgid \"Invalid response while obtaining access token from \\\"%s\\\".\"\nmsgstr \"從 \\\"%s\\\" 獲取 access token 時回應無效。\"\n\n#: socialaccount/providers/oauth/client.py:142\n#, python-format\nmsgid \"No request token saved for \\\"%s\\\".\"\nmsgstr \"未為 \\\"%s\\\" 儲存請求 token。\"\n\n#: socialaccount/providers/oauth/client.py:193\n#, python-format\nmsgid \"No access token saved for \\\"%s\\\".\"\nmsgstr \"未為 \\\"%s\\\" 儲存 access token。\"\n\n#: socialaccount/providers/oauth/client.py:215\n#, python-format\nmsgid \"No access to private resources at \\\"%s\\\".\"\nmsgstr \"無權訪問私有資源 \\\"%s\\\"。\"\n\n#: socialaccount/providers/pocket/client.py:39\n#, python-format\nmsgid \"Invalid response while obtaining request token from \\\"%s\\\".\"\nmsgstr \"從 \\\"%s\\\" 獲取 request token 時回應無效。\"\n\n#: templates/account/account_inactive.html:5\n#: templates/account/account_inactive.html:9\nmsgid \"Account Inactive\"\nmsgstr \"帳號未啟用\"\n\n#: templates/account/account_inactive.html:12\nmsgid \"This account is inactive.\"\nmsgstr \"此帳號未啟用。\"\n\n#: templates/account/base_confirm_code.html:27\n#, python-format\nmsgid \"\"\n\"We've sent a code to %(recipient)s. The code expires shortly, so please \"\n\"enter it soon.\"\nmsgstr \"我們已經代碼傳送給%(recipient)s．此代碼有效期限極短，請盡速輸入。\"\n\n#: templates/account/base_confirm_code.html:39\n#: templates/account/email_confirm.html:24\n#: templates/account/reauthenticate.html:18\n#: templates/idp/oidc/device_authorization_confirm_form.html:26\n#: templates/mfa/reauthenticate.html:18\nmsgid \"Confirm\"\nmsgstr \"確認\"\n\n#: templates/account/base_confirm_code.html:43\nmsgid \"Request new code\"\nmsgstr \"請求新的代碼\"\n\n#: templates/account/base_reauthenticate.html:5\n#: templates/account/base_reauthenticate.html:9\nmsgid \"Confirm Access\"\nmsgstr \"確認存取權限\"\n\n#: templates/account/base_reauthenticate.html:12\nmsgid \"Please reauthenticate to safeguard your account.\"\nmsgstr \"請重新認證以保護您的帳號。\"\n\n#: templates/account/base_reauthenticate.html:19\n#: templates/mfa/authenticate.html:37\nmsgid \"Alternative options\"\nmsgstr \"替代選項\"\n\n#: templates/account/confirm_email_verification_code.html:5\nmsgid \"Email Verification\"\nmsgstr \"電子郵件驗證\"\n\n#: templates/account/confirm_email_verification_code.html:8\nmsgid \"Enter Email Verification Code\"\nmsgstr \"輸入電子郵件驗證碼\"\n\n#: templates/account/confirm_email_verification_code.html:16\nmsgid \"Use a different email address\"\nmsgstr \"使用不同的電子郵件地址\"\n\n#: templates/account/confirm_login_code.html:5 templates/account/login.html:5\n#: templates/account/login.html:9 templates/account/login.html:31\n#: templates/account/request_login_code.html:5\n#: templates/allauth/layouts/base.html:68 templates/mfa/authenticate.html:6\n#: templates/mfa/authenticate.html:24 templates/openid/login.html:5\n#: templates/openid/login.html:9 templates/openid/login.html:20\n#: templates/socialaccount/login.html:5\n#: templates/socialaccount/login_redirect.html:5\nmsgid \"Sign In\"\nmsgstr \"登入\"\n\n#: templates/account/confirm_login_code.html:8\nmsgid \"Enter Sign-In Code\"\nmsgstr \"輸入登入碼\"\n\n#: templates/account/confirm_password_reset_code.html:5\n#: templates/account/email/password_reset_subject.txt:3\n#: templates/account/password_reset.html:4\n#: templates/account/password_reset.html:8\n#: templates/account/password_reset_done.html:6\n#: templates/account/password_reset_done.html:10\nmsgid \"Password Reset\"\nmsgstr \"密碼重設\"\n\n#: templates/account/confirm_password_reset_code.html:8\nmsgid \"Enter Password Reset Code\"\nmsgstr \"輸入密碼重設代碼\"\n\n#: templates/account/confirm_phone_verification_code.html:5\nmsgid \"Phone Verification\"\nmsgstr \"電話驗證\"\n\n#: templates/account/confirm_phone_verification_code.html:8\nmsgid \"Enter Phone Verification Code\"\nmsgstr \"輸入電話驗證代碼\"\n\n#: templates/account/confirm_phone_verification_code.html:15\nmsgid \"Use a different phone number\"\nmsgstr \"使用不同的電話號碼\"\n\n#: templates/account/email.html:4 templates/account/email.html:8\nmsgid \"Email Addresses\"\nmsgstr \"電子郵件地址\"\n\n#: templates/account/email.html:12\nmsgid \"The following email addresses are associated with your account:\"\nmsgstr \"下列電子郵件已與您的帳號連結：\"\n\n#: templates/account/email.html:25\nmsgid \"Verified\"\nmsgstr \"已驗證\"\n\n#: templates/account/email.html:29\nmsgid \"Unverified\"\nmsgstr \"未驗證\"\n\n#: templates/account/email.html:34\nmsgid \"Primary\"\nmsgstr \"主要的\"\n\n#: templates/account/email.html:44\nmsgid \"Make Primary\"\nmsgstr \"設為主要的\"\n\n#: templates/account/email.html:47 templates/account/email_change.html:37\n#: templates/account/phone_change.html:24\nmsgid \"Re-send Verification\"\nmsgstr \"重寄驗証信\"\n\n#: templates/account/email.html:50\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:16\n#: templates/mfa/webauthn/authenticator_list.html:60\n#: templates/socialaccount/connections.html:40\nmsgid \"Remove\"\nmsgstr \"移除\"\n\n#: templates/account/email.html:59\nmsgid \"Add Email Address\"\nmsgstr \"增加電子郵件\"\n\n#: templates/account/email.html:70\nmsgid \"Add Email\"\nmsgstr \"增加電子郵件\"\n\n#: templates/account/email.html:80\nmsgid \"Do you really want to remove the selected email address?\"\nmsgstr \"您真的要移除所選擇電子郵件嗎？\"\n\n#: templates/account/email/account_already_exists_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you or someone else tried to signup for \"\n\"an\\n\"\n\"account using email address:\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"However, an account using that email address already exists.  In case you \"\n\"have\\n\"\n\"forgotten about this, please use the password forgotten procedure to \"\n\"recover\\n\"\n\"your account:\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\nmsgstr \"\"\n\"您收到此電子郵件是因為您(或其他人)嘗試使用以下電子郵件地址\\n\"\n\"註冊帳戶：\\n\"\n\"\\n\"\n\"%(email)s\\n\"\n\"\\n\"\n\"然而，目前已經有使用該電子郵件地址的帳戶存在。\\n\"\n\"\\n\"\n\"如果您忘記了帳戶，請使用忘記密碼程序來找回您的帳戶：\\n\"\n\"\\n\"\n\"%(password_reset_url)s\"\n\n#: templates/account/email/account_already_exists_subject.txt:3\nmsgid \"Account Already Exists\"\nmsgstr \"帳號已存在\"\n\n#: templates/account/email/base_message.txt:1\n#, python-format\nmsgid \"Hello from %(site_name)s!\"\nmsgstr \"來自%(site_name)s!的問候！\"\n\n#: templates/account/email/base_message.txt:5\n#, python-format\nmsgid \"\"\n\"Thank you for using %(site_name)s!\\n\"\n\"%(site_domain)s\"\nmsgstr \"\"\n\"感謝您使用%(site_name)s。\\n\"\n\"%(site_domain)s\"\n\n#: templates/account/email/base_notification.txt:5\nmsgid \"\"\n\"You are receiving this mail because the following change was made to your \"\n\"account:\"\nmsgstr \"您收到此封郵件是因為您的帳號已做出以下變更：\"\n\n#: templates/account/email/base_notification.txt:10\n#, python-format\nmsgid \"\"\n\"If you do not recognize this change then please take proper security \"\n\"precautions immediately. The change to your account originates from:\\n\"\n\"\\n\"\n\"- IP address: %(ip)s\\n\"\n\"- Browser: %(user_agent)s\\n\"\n\"- Date: %(timestamp)s\"\nmsgstr \"\"\n\"如果您沒有進行此變更，請立即採取適當的安全措施。\\n\"\n\"此變更來源：\\n\"\n\"- IP 位址：%(ip)s\\n\"\n\"- 瀏覽器：%(user_agent)s\\n\"\n\"- 日期：%(timestamp)s\"\n\n#: templates/account/email/email_changed_message.txt:4\n#, python-format\nmsgid \"Your email has been changed from %(from_email)s to %(to_email)s.\"\nmsgstr \"您的 Email 已從 %(from_email)s 修改成 %(to_email)s。\"\n\n#: templates/account/email/email_changed_subject.txt:3\nmsgid \"Email Changed\"\nmsgstr \"電子郵件已更改\"\n\n#: templates/account/email/email_confirm_message.txt:4\nmsgid \"Your email has been confirmed.\"\nmsgstr \"您的電子郵件已確認。\"\n\n#: templates/account/email/email_confirm_subject.txt:3\nmsgid \"Email Confirmation\"\nmsgstr \"電子郵件確認\"\n\n#: templates/account/email/email_confirmation_message.txt:5\n#, python-format\nmsgid \"\"\n\"You're receiving this email because user %(user_display)s has given your \"\n\"email address to register an account on %(site_domain)s.\"\nmsgstr \"\"\n\"您會收到此 Email 是因為使用者 %(user_display)s 提供此 Email 於網\"\n\"站%(site_domain)s 上註冊帳號。\"\n\n#: templates/account/email/email_confirmation_message.txt:7\nmsgid \"\"\n\"Your email verification code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"您的 Email 驗證代碼如下所列，請在您已開啟的瀏覽器視窗中輸入。\"\n\n#: templates/account/email/email_confirmation_message.txt:9\n#, python-format\nmsgid \"To confirm this is correct, go to %(activate_url)s\"\nmsgstr \"若確認無誤，請前往 %(activate_url)s\"\n\n#: templates/account/email/email_confirmation_subject.txt:3\nmsgid \"Please Confirm Your Email Address\"\nmsgstr \"確認您的電子郵件\"\n\n#: templates/account/email/email_deleted_message.txt:4\n#, python-format\nmsgid \"Email address %(deleted_email)s has been removed from your account.\"\nmsgstr \"電子郵件地址 %(deleted_email)s 已從您的帳戶中移除。\"\n\n#: templates/account/email/email_deleted_subject.txt:3\nmsgid \"Email Removed\"\nmsgstr \"Email 已移除\"\n\n#: templates/account/email/login_code_message.txt:5\nmsgid \"\"\n\"Your sign-in code is listed below. Please enter it in your open browser \"\n\"window.\"\nmsgstr \"您的登入代碼如下所列，請在您已開啟的瀏覽器視窗中輸入。\"\n\n#: templates/account/email/login_code_message.txt:9\n#: templates/account/email/password_reset_code_message.txt:9\n#: templates/account/email/unknown_account_message.txt:6\nmsgid \"This mail can be safely ignored if you did not initiate this action.\"\nmsgstr \"若確定非您所為，請忽略此郵件。\"\n\n#: templates/account/email/login_code_subject.txt:3\nmsgid \"Sign-In Code\"\nmsgstr \"登入代碼\"\n\n#: templates/account/email/password_changed_message.txt:4\nmsgid \"Your password has been changed.\"\nmsgstr \"您的密碼已變更。\"\n\n#: templates/account/email/password_changed_subject.txt:3\nmsgid \"Password Changed\"\nmsgstr \"密碼已更改\"\n\n#: templates/account/email/password_reset_code_message.txt:5\nmsgid \"\"\n\"Your password reset code is listed below. Please enter it in your open \"\n\"browser window.\"\nmsgstr \"您的密碼重設代碼如下所列，請在您已開啟的瀏覽器視窗中輸入。\"\n\n#: templates/account/email/password_reset_code_subject.txt:3\nmsgid \"Password Reset Code\"\nmsgstr \"密碼重設代碼\"\n\n#: templates/account/email/password_reset_key_message.txt:4\nmsgid \"\"\n\"You're receiving this email because you or someone else has requested a \"\n\"password reset for your user account.\\n\"\n\"It can be safely ignored if you did not request a password reset. Click the \"\n\"link below to reset your password.\"\nmsgstr \"\"\n\"您收到此電子郵件是因為您或其他人已請求重設您的帳戶密碼。\\n\"\n\"如果您沒有請求重設密碼，則可以安全忽略此郵件。請點擊以下連結來重設您的密碼。\"\n\n#: templates/account/email/password_reset_key_message.txt:9\n#, python-format\nmsgid \"In case you forgot, your username is %(username)s.\"\nmsgstr \"提醒您，您的使用者名稱是 %(username)s 。\"\n\n#: templates/account/email/password_reset_key_subject.txt:3\nmsgid \"Password Reset Email\"\nmsgstr \"密碼重設電子郵件\"\n\n#: templates/account/email/password_reset_message.txt:4\nmsgid \"Your password has been reset.\"\nmsgstr \"您的密碼已被重設。\"\n\n#: templates/account/email/password_set_message.txt:4\nmsgid \"Your password has been set.\"\nmsgstr \"您的密碼已設定完成。\"\n\n#: templates/account/email/password_set_subject.txt:3\nmsgid \"Password Set\"\nmsgstr \"密碼已設定\"\n\n#: templates/account/email/unknown_account_message.txt:4\n#, python-format\nmsgid \"\"\n\"You are receiving this email because you, or someone else, tried to access \"\n\"an account with email %(email)s. However, we do not have any record of such \"\n\"an account in our database.\"\nmsgstr \"\"\n\"您會收到此封 Email 是因為您/或是有人嘗試使用 %(email)s 此 Email 存取帳號。然\"\n\"而，我們於資料庫中找不到任何關聯的帳號紀錄。\"\n\n#: templates/account/email/unknown_account_message.txt:8\nmsgid \"If it was you, you can sign up for an account using the link below.\"\nmsgstr \"如果確定是您，您可以透過下列連結註冊一個帳號。\"\n\n#: templates/account/email/unknown_account_subject.txt:3\nmsgid \"Unknown Account\"\nmsgstr \"未知帳戶\"\n\n#: templates/account/email_change.html:5 templates/account/email_change.html:9\nmsgid \"Email Address\"\nmsgstr \"電子郵件地址\"\n\n#: templates/account/email_change.html:21\n#: templates/account/email_change.html:29\nmsgid \"Current email\"\nmsgstr \"目前電子郵件\"\n\n#: templates/account/email_change.html:31\nmsgid \"Changing to\"\nmsgstr \"變更為\"\n\n#: templates/account/email_change.html:35\nmsgid \"Your email address is still pending verification.\"\nmsgstr \"您的電子郵件地址仍在等待驗證。\"\n\n#: templates/account/email_change.html:41\nmsgid \"Cancel Change\"\nmsgstr \"取消變更\"\n\n#: templates/account/email_change.html:49\n#: templates/account/phone_change.html:32\nmsgid \"Change to\"\nmsgstr \"變更為\"\n\n#: templates/account/email_change.html:55\n#: templates/allauth/layouts/base.html:31\nmsgid \"Change Email\"\nmsgstr \"更改電子郵件\"\n\n#: templates/account/email_confirm.html:6\n#: templates/account/email_confirm.html:10\nmsgid \"Confirm Email Address\"\nmsgstr \"確認電子郵件\"\n\n#: templates/account/email_confirm.html:16\n#, python-format\nmsgid \"\"\n\"Please confirm that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an email \"\n\"address for user %(user_display)s.\"\nmsgstr \"\"\n\"請確認 <a href=\\\"mailto:%(email)s\\\">%(email)s</a> 是使用者 %(user_display)s \"\n\"所使用的電子郵件地址。\"\n\n#: templates/account/email_confirm.html:30\n#: templates/account/messages/email_confirmation_failed.txt:2\n#, python-format\nmsgid \"\"\n\"Unable to confirm %(email)s because it is already confirmed by a different \"\n\"account.\"\nmsgstr \"無法驗證 %(email)s，因為該電子郵件已由其他帳戶驗證。\"\n\n#: templates/account/email_confirm.html:36\n#, python-format\nmsgid \"\"\n\"This email confirmation link expired or is invalid. Please <a \"\n\"href=\\\"%(email_url)s\\\">issue a new email confirmation request</a>.\"\nmsgstr \"\"\n\"此電子郵件確認連結已過期或無效。請<a href=\\\"%(email_url)s\\\">重新發送電子郵件\"\n\"確認請求</a>。\"\n\n#: templates/account/login.html:19\n#, python-format\nmsgid \"\"\n\"If you have not created an account yet, then please %(link)ssign \"\n\"up%(end_link)s first.\"\nmsgstr \"若您沒有帳號，請先 %(link)s註冊%(end_link)s 。\"\n\n#: templates/account/login.html:42\nmsgid \"Sign in with a passkey\"\nmsgstr \"使用通行密鑰登入\"\n\n#: templates/account/login.html:47 templates/account/request_login_code.html:9\nmsgid \"Send me a sign-in code\"\nmsgstr \"寄給我登入代碼\"\n\n#: templates/account/logout.html:4 templates/account/logout.html:8\n#: templates/account/logout.html:21 templates/allauth/layouts/base.html:61\n#: templates/idp/oidc/logout.html:4 templates/idp/oidc/logout.html:8\n#: templates/idp/oidc/logout.html:21\n#: templates/usersessions/usersession_list.html:76\nmsgid \"Sign Out\"\nmsgstr \"登出\"\n\n#: templates/account/logout.html:11 templates/idp/oidc/logout.html:11\nmsgid \"Are you sure you want to sign out?\"\nmsgstr \"您確定要登出嗎？\"\n\n#: templates/account/messages/cannot_delete_primary_email.txt:2\n#, python-format\nmsgid \"You cannot remove your primary email address (%(email)s).\"\nmsgstr \"您不能移除您的主要的電子郵件地址 (%(email)s) 。\"\n\n#: templates/account/messages/email_confirmation_sent.txt:2\n#, python-format\nmsgid \"Confirmation email sent to %(email)s.\"\nmsgstr \"確認信已發至 %(email)s 。\"\n\n#: templates/account/messages/email_confirmed.txt:2\n#, python-format\nmsgid \"You have confirmed %(email)s.\"\nmsgstr \"您已確認 %(email)s。\"\n\n#: templates/account/messages/email_deleted.txt:2\n#, python-format\nmsgid \"Removed email address %(email)s.\"\nmsgstr \"電子郵件地址 %(email)s 已刪除。\"\n\n#: templates/account/messages/logged_in.txt:4\n#, python-format\nmsgid \"Successfully signed in as %(name)s.\"\nmsgstr \"成功以 %(name)s..的身份登入。\"\n\n#: templates/account/messages/logged_out.txt:2\nmsgid \"You have signed out.\"\nmsgstr \"您已登出。\"\n\n#: templates/account/messages/login_code_sent.txt:2\n#, python-format\nmsgid \"A sign-in code has been sent to %(recipient)s.\"\nmsgstr \"登入代碼已經寄給 %(recipient)s。\"\n\n#: templates/account/messages/password_changed.txt:2\nmsgid \"Password successfully changed.\"\nmsgstr \"密碼修改完成。\"\n\n#: templates/account/messages/password_set.txt:2\nmsgid \"Password successfully set.\"\nmsgstr \"密碼設定完成。\"\n\n#: templates/account/messages/phone_verification_sent.txt:2\n#, python-format\nmsgid \"A verification code has been sent to %(phone)s.\"\nmsgstr \"登入代碼已經寄給 %(phone)s。\"\n\n#: templates/account/messages/phone_verified.txt:2\n#, python-format\nmsgid \"You have verified phone number %(phone)s.\"\nmsgstr \"您已完成驗證電話號碼 %(phone)s 。\"\n\n#: templates/account/messages/primary_email_set.txt:2\nmsgid \"Primary email address set.\"\nmsgstr \"已設定好主要的電子郵件地址。\"\n\n#: templates/account/password_change.html:4\n#: templates/account/password_change.html:8\n#: templates/account/password_change.html:20\n#: templates/account/password_reset_from_key.html:5\n#: templates/account/password_reset_from_key.html:12\n#: templates/account/password_reset_from_key.html:30\n#: templates/account/password_reset_from_key_done.html:5\n#: templates/account/password_reset_from_key_done.html:9\n#: templates/allauth/layouts/base.html:37\nmsgid \"Change Password\"\nmsgstr \"修改密碼\"\n\n#: templates/account/password_change.html:22\nmsgid \"Forgot Password?\"\nmsgstr \"忘記密碼了？\"\n\n#: templates/account/password_reset.html:14\nmsgid \"\"\n\"Forgotten your password? Enter your email address below, and we'll send you \"\n\"an email allowing you to reset it.\"\nmsgstr \"\"\n\"忘記您的密碼了嗎？ 請在下方輸入您的電子郵件，我們會發送一封電子郵件給您，以便\"\n\"重新設定您的密碼。\"\n\n#: templates/account/password_reset.html:26\nmsgid \"Reset My Password\"\nmsgstr \"重設我的密碼\"\n\n#: templates/account/password_reset.html:31\nmsgid \"Please contact us if you have any trouble resetting your password.\"\nmsgstr \"如果在重設密碼時碰到問題，請與我們聯絡。\"\n\n#: templates/account/password_reset_done.html:16\nmsgid \"\"\n\"We have sent you an email. If you have not received it please check your \"\n\"spam folder. Otherwise contact us if you do not receive it in a few minutes.\"\nmsgstr \"\"\n\"我們已經寄送了一封電子郵件給您。如果您沒有收到，請檢查您的垃圾郵件資料夾。如\"\n\"果仍未收到，請在幾分鐘後聯繫我們。\"\n\n#: templates/account/password_reset_from_key.html:10\nmsgid \"Bad Token\"\nmsgstr \"無效的 token\"\n\n#: templates/account/password_reset_from_key.html:18\n#, python-format\nmsgid \"\"\n\"The password reset link was invalid, possibly because it has already been \"\n\"used.  Please request a <a href=\\\"%(passwd_reset_url)s\\\">new password reset</\"\n\"a>.\"\nmsgstr \"\"\n\"密碼重設連結已失效，可能是因為該連結已經被人用過了，請重新申請<a \"\n\"href=\\\"%(passwd_reset_url)s\\\">重設密碼</a>。\"\n\n#: templates/account/password_reset_from_key_done.html:12\nmsgid \"Your password is now changed.\"\nmsgstr \"您的密碼已變更。\"\n\n#: templates/account/password_set.html:5 templates/account/password_set.html:9\n#: templates/account/password_set.html:21\nmsgid \"Set Password\"\nmsgstr \"設定密碼\"\n\n#: templates/account/phone_change.html:5 templates/account/phone_change.html:9\nmsgid \"Change Phone\"\nmsgstr \"更改電話號碼\"\n\n#: templates/account/phone_change.html:18\nmsgid \"Current phone\"\nmsgstr \"目前電話號碼\"\n\n#: templates/account/phone_change.html:22\nmsgid \"Your phone number is still pending verification.\"\nmsgstr \"您的電話號碼仍在等待驗證。\"\n\n#: templates/account/phone_change.html:38\nmsgctxt \"action\"\nmsgid \"Change Phone\"\nmsgstr \"更改電話號碼\"\n\n#: templates/account/reauthenticate.html:6\nmsgid \"Enter your password:\"\nmsgstr \"輸入您的密碼：\"\n\n#: templates/account/request_login_code.html:12\nmsgid \"You will receive a special code for a password-free sign-in.\"\nmsgstr \"您將會收到一組特殊代碼用於免密碼登入。\"\n\n#: templates/account/request_login_code.html:24\nmsgid \"Request Code\"\nmsgstr \"請求代碼\"\n\n#: templates/account/request_login_code.html:30\nmsgid \"Other sign-in options\"\nmsgstr \"其他登入選項\"\n\n#: templates/account/signup.html:4 templates/account/signup_by_passkey.html:4\n#: templates/socialaccount/signup.html:5\nmsgid \"Signup\"\nmsgstr \"註冊\"\n\n#: templates/account/signup.html:8 templates/account/signup.html:30\n#: templates/account/signup_by_passkey.html:29\n#: templates/allauth/layouts/base.html:74 templates/socialaccount/signup.html:9\n#: templates/socialaccount/signup.html:25\nmsgid \"Sign Up\"\nmsgstr \"註冊\"\n\n#: templates/account/signup.html:17 templates/account/signup_by_passkey.html:17\n#, python-format\nmsgid \"Already have an account? Then please %(link)ssign in%(end_link)s.\"\nmsgstr \"已有帳號了嗎？請%(link)s登入%(end_link)s.\"\n\n#: templates/account/signup.html:39\nmsgid \"Sign up using a passkey\"\nmsgstr \"使用通行密鑰註冊\"\n\n#: templates/account/signup_by_passkey.html:8\nmsgid \"Passkey Sign Up\"\nmsgstr \"使用通行密鑰註冊\"\n\n#: templates/account/signup_by_passkey.html:36\nmsgid \"Other options\"\nmsgstr \"其他選項\"\n\n#: templates/account/signup_closed.html:5\n#: templates/account/signup_closed.html:9\nmsgid \"Sign Up Closed\"\nmsgstr \"註冊未開放\"\n\n#: templates/account/signup_closed.html:12\nmsgid \"We are sorry, but the sign up is currently closed.\"\nmsgstr \"很抱歉，目前不開放註冊。\"\n\n#: templates/account/snippets/already_logged_in.html:7\nmsgid \"Note\"\nmsgstr \"注意\"\n\n#: templates/account/snippets/already_logged_in.html:7\n#, python-format\nmsgid \"You are already logged in as %(user_display)s.\"\nmsgstr \"您已經以 %(user_display)s 的身份登入了。\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"Warning:\"\nmsgstr \"警告：\"\n\n#: templates/account/snippets/warn_no_email.html:3\nmsgid \"\"\n\"You currently do not have any email address set up. You should really add an \"\n\"email address so you can receive notifications, reset your password, etc.\"\nmsgstr \"\"\n\"您尚未設定任何電子郵件。建議您最好設定一個電子郵件，以便您接收通知或重新設定\"\n\"密碼等等。\"\n\n#: templates/account/verification_sent.html:5\n#: templates/account/verification_sent.html:9\n#: templates/account/verified_email_required.html:5\n#: templates/account/verified_email_required.html:9\nmsgid \"Verify Your Email Address\"\nmsgstr \"驗證您的電子郵件地址\"\n\n#: templates/account/verification_sent.html:12\nmsgid \"\"\n\"We have sent an email to you for verification. Follow the link provided to \"\n\"finalize the signup process. If you do not see the verification email in \"\n\"your main inbox, check your spam folder. Please contact us if you do not \"\n\"receive the verification email within a few minutes.\"\nmsgstr \"\"\n\"我們已經向您發送了一封電子郵件進行驗證。請按照郵件中的連結完成註冊過程。如果\"\n\"您在主要收件匣中沒有看到驗證郵件，請檢查您的垃圾郵件資料夾。如果幾分鐘後仍未\"\n\"收到驗證郵件，請與我們聯繫。\"\n\n#: templates/account/verified_email_required.html:13\nmsgid \"\"\n\"This part of the site requires us to verify that\\n\"\n\"you are who you claim to be. For this purpose, we require that you\\n\"\n\"verify ownership of your email address. \"\nmsgstr \"\"\n\"此網站的此部分要求我們驗證您的身份。\\n\"\n\"為此，\\n\"\n\"我們要求您驗證您的電子郵件地址的所有權。 \"\n\n#: templates/account/verified_email_required.html:18\nmsgid \"\"\n\"We have sent an email to you for\\n\"\n\"verification. Please click on the link inside that email. If you do not see \"\n\"the verification email in your main inbox, check your spam folder. \"\n\"Otherwise\\n\"\n\"contact us if you do not receive it within a few minutes.\"\nmsgstr \"\"\n\"我們已經向您發送了一封電子郵件進行驗證。\\n\"\n\"請點擊郵件中的連結。如果您在主要收件匣中沒有看到驗證郵件，請檢查您的垃圾郵件\"\n\"資料夾。\\n\"\n\"如果幾分鐘後仍未收到，請與我們聯繫。\"\n\n#: templates/account/verified_email_required.html:23\n#, python-format\nmsgid \"\"\n\"<strong>Note:</strong> you can still <a href=\\\"%(email_url)s\\\">change your \"\n\"email address</a>.\"\nmsgstr \"\"\n\"<strong>注意：</strong> 您仍能<a href=\\\"%(email_url)s\\\">修改您的電子郵件地址 \"\n\"</a>.\"\n\n#: templates/allauth/layouts/base.html:18\nmsgid \"Messages:\"\nmsgstr \"訊息：\"\n\n#: templates/allauth/layouts/base.html:25\nmsgid \"Menu:\"\nmsgstr \"選單：\"\n\n#: templates/allauth/layouts/base.html:43\n#: templates/socialaccount/connections.html:5\n#: templates/socialaccount/connections.html:9\nmsgid \"Account Connections\"\nmsgstr \"帳號連結\"\n\n#: templates/allauth/layouts/base.html:49 templates/mfa/authenticate.html:10\n#: templates/mfa/index.html:5 templates/mfa/index.html:9\nmsgid \"Two-Factor Authentication\"\nmsgstr \"二階段認證\"\n\n#: templates/allauth/layouts/base.html:55\n#: templates/usersessions/usersession_list.html:6\n#: templates/usersessions/usersession_list.html:10\nmsgid \"Sessions\"\nmsgstr \"登入階段\"\n\n#: templates/idp/oidc/authorization_form.html:5\n#: templates/idp/oidc/authorization_form.html:9\n#: templates/idp/oidc/authorization_form.html:23\n#: templates/idp/oidc/device_authorization_code_form.html:5\n#: templates/idp/oidc/device_authorization_confirm_form.html:5\n#: templates/idp/oidc/device_authorization_confirmed.html:5\n#: templates/idp/oidc/device_authorization_denied.html:5\nmsgid \"Authorize\"\nmsgstr \"授權\"\n\n#: templates/idp/oidc/authorization_form.html:12\n#, python-format\nmsgid \"%(client_name)s wants to access your %(site_name)s account.\"\nmsgstr \"%(client_name)s 想要存取您的 %(site_name)s 帳戶。\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:9\nmsgid \"Enter Device Code\"\nmsgstr \"輸入裝置代碼\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:12\nmsgid \"Enter the code displayed on your device.\"\nmsgstr \"輸入您裝置上顯示的代碼。\"\n\n#: templates/idp/oidc/device_authorization_code_form.html:21\n#: templates/socialaccount/login.html:27\n#: templates/socialaccount/login_redirect.html:10\nmsgid \"Continue\"\nmsgstr \"繼續\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:9\nmsgid \"Confirm Device\"\nmsgstr \"確認裝置\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:12\n#, python-format\nmsgid \"\"\n\"Please confirm the code shown on your %(client_name)s to authorize this \"\n\"device.\"\nmsgstr \"請確認您的 %(client_name)s 上顯示的代碼以授權此裝置。\"\n\n#: templates/idp/oidc/device_authorization_confirm_form.html:29\nmsgid \"Deny\"\nmsgstr \"拒絕\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:9\nmsgid \"Device Authorized\"\nmsgstr \"裝置已授權\"\n\n#: templates/idp/oidc/device_authorization_confirmed.html:12\n#, python-format\nmsgid \"You successfully authorized your %(client_name)s device.\"\nmsgstr \"您已成功授權您的 %(client_name)s 裝置。\"\n\n#: templates/idp/oidc/device_authorization_denied.html:9\nmsgid \"Device Denied\"\nmsgstr \"裝置已拒絕\"\n\n#: templates/idp/oidc/device_authorization_denied.html:12\n#, python-format\nmsgid \"Authorization for your %(client_name)s device has been denied.\"\nmsgstr \"您的 %(client_name)s 裝置的授權已被拒絕。\"\n\n#: templates/idp/oidc/error.html:5 templates/idp/oidc/error.html:9\nmsgid \"Error\"\nmsgstr \"錯誤\"\n\n#: templates/idp/oidc/logout.html:24\nmsgid \"Stay Signed In\"\nmsgstr \"保持登入\"\n\n#: templates/mfa/authenticate.html:13\nmsgid \"\"\n\"Your account is protected by two-factor authentication. Please enter an \"\n\"authenticator code:\"\nmsgstr \"您的帳號由二階驗證所保護，請輸入驗證器中的代碼：\"\n\n#: templates/mfa/email/recovery_codes_generated_message.txt:4\nmsgid \"\"\n\"A new set of Two-Factor Authentication recovery codes has been generated.\"\nmsgstr \"新的二階驗證復原代碼已建立。\"\n\n#: templates/mfa/email/recovery_codes_generated_subject.txt:3\nmsgid \"New Recovery Codes Generated\"\nmsgstr \"新的復原代碼已建立\"\n\n#: templates/mfa/email/totp_activated_message.txt:4\n#: templates/mfa/messages/totp_activated.txt:2\nmsgid \"Authenticator app activated.\"\nmsgstr \"驗證器已啟用。\"\n\n#: templates/mfa/email/totp_activated_subject.txt:3\nmsgid \"Authenticator App Activated\"\nmsgstr \"驗證器已啟用\"\n\n#: templates/mfa/email/totp_deactivated_message.txt:4\n#: templates/mfa/messages/totp_deactivated.txt:2\nmsgid \"Authenticator app deactivated.\"\nmsgstr \"驗證器已停用。\"\n\n#: templates/mfa/email/totp_deactivated_subject.txt:3\nmsgid \"Authenticator App Deactivated\"\nmsgstr \"驗證器已停用\"\n\n#: templates/mfa/email/webauthn_added_message.txt:4\nmsgid \"A new security key has been added.\"\nmsgstr \"新的安全金鑰已成功新增。\"\n\n#: templates/mfa/email/webauthn_added_subject.txt:3\nmsgid \"Security Key Added\"\nmsgstr \"已新增安全金鑰\"\n\n#: templates/mfa/email/webauthn_removed_message.txt:4\nmsgid \"A security key has been removed.\"\nmsgstr \"安全金鑰已被移除。\"\n\n#: templates/mfa/email/webauthn_removed_subject.txt:3\nmsgid \"Security Key Removed\"\nmsgstr \"安全金鑰已移除\"\n\n#: templates/mfa/index.html:14 templates/mfa/totp/base.html:4\nmsgid \"Authenticator App\"\nmsgstr \"驗證器\"\n\n#: templates/mfa/index.html:19\nmsgid \"Authentication using an authenticator app is active.\"\nmsgstr \"已啟用驗證器進行驗證。\"\n\n#: templates/mfa/index.html:23\nmsgid \"An authenticator app is not active.\"\nmsgstr \"authenticator 驗證器應用程式未啟用。\"\n\n#: templates/mfa/index.html:32 templates/mfa/totp/deactivate_form.html:24\nmsgid \"Deactivate\"\nmsgstr \"停用\"\n\n#: templates/mfa/index.html:36 templates/mfa/totp/activate_form.html:32\nmsgid \"Activate\"\nmsgstr \"啟用\"\n\n#: templates/mfa/index.html:45 templates/mfa/webauthn/authenticator_list.html:8\n#: templates/mfa/webauthn/base.html:4\nmsgid \"Security Keys\"\nmsgstr \"安全金鑰\"\n\n#: templates/mfa/index.html:50\n#, python-format\nmsgid \"You have added %(count)s security key.\"\nmsgid_plural \"You have added %(count)s security keys.\"\nmsgstr[0] \"您已新增 %(count)s 個安全金鑰。\"\n\n#: templates/mfa/index.html:54\n#: templates/mfa/webauthn/authenticator_list.html:12\nmsgid \"No security keys have been added.\"\nmsgstr \"尚未新增任何安全金鑰。\"\n\n#: templates/mfa/index.html:62\nmsgid \"Manage\"\nmsgstr \"管理\"\n\n#: templates/mfa/index.html:67 templates/mfa/webauthn/add_form.html:18\n#: templates/mfa/webauthn/authenticator_list.html:70\nmsgid \"Add\"\nmsgstr \"新增\"\n\n#: templates/mfa/index.html:77 templates/mfa/recovery_codes/base.html:4\n#: templates/mfa/recovery_codes/generate.html:6\n#: templates/mfa/recovery_codes/index.html:6\nmsgid \"Recovery Codes\"\nmsgstr \"復原碼\"\n\n#: templates/mfa/index.html:82 templates/mfa/recovery_codes/index.html:9\n#, python-format\nmsgid \"\"\n\"There is %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgid_plural \"\"\n\"There are %(unused_count)s out of %(total_count)s recovery codes available.\"\nmsgstr[0] \"共有 %(total_count)s 個恢復碼，其中剩餘 %(unused_count)s 個可用。\"\n\n#: templates/mfa/index.html:86\nmsgid \"No recovery codes set up.\"\nmsgstr \"尚未設定恢復碼。\"\n\n#: templates/mfa/index.html:96\nmsgid \"View\"\nmsgstr \"檢視\"\n\n#: templates/mfa/index.html:102\nmsgid \"Download\"\nmsgstr \"下載\"\n\n#: templates/mfa/index.html:110 templates/mfa/recovery_codes/generate.html:29\nmsgid \"Generate\"\nmsgstr \"產生\"\n\n#: templates/mfa/messages/recovery_codes_generated.txt:2\nmsgid \"A new set of recovery codes has been generated.\"\nmsgstr \"已產生一組新的恢復碼。\"\n\n#: templates/mfa/messages/webauthn_added.txt:2\nmsgid \"Security key added.\"\nmsgstr \"已成功新增安全金鑰。\"\n\n#: templates/mfa/messages/webauthn_removed.txt:2\nmsgid \"Security key removed.\"\nmsgstr \"安全金鑰已成功移除。\"\n\n#: templates/mfa/reauthenticate.html:6\nmsgid \"Enter an authenticator code:\"\nmsgstr \"輸入驗證器代碼：\"\n\n#: templates/mfa/recovery_codes/generate.html:9\nmsgid \"You are about to generate a new set of recovery codes for your account.\"\nmsgstr \"您即將為您的帳戶產生一組新的恢復碼。\"\n\n#: templates/mfa/recovery_codes/generate.html:11\nmsgid \"This action will invalidate your existing codes.\"\nmsgstr \"此操作將使您現有的恢復碼失效。\"\n\n#: templates/mfa/recovery_codes/generate.html:13\nmsgid \"Are you sure?\"\nmsgstr \"您確定嗎？\"\n\n#: templates/mfa/recovery_codes/index.html:13\nmsgid \"Unused codes\"\nmsgstr \"未使用之代碼\"\n\n#: templates/mfa/recovery_codes/index.html:25\nmsgid \"Download codes\"\nmsgstr \"下載代碼\"\n\n#: templates/mfa/recovery_codes/index.html:30\nmsgid \"Generate new codes\"\nmsgstr \"產生新的代碼\"\n\n#: templates/mfa/totp/activate_form.html:4\n#: templates/mfa/totp/activate_form.html:8\nmsgid \"Activate Authenticator App\"\nmsgstr \"啟用驗證器\"\n\n#: templates/mfa/totp/activate_form.html:11\nmsgid \"\"\n\"To protect your account with two-factor authentication, scan the QR code \"\n\"below with your authenticator app. Then, input the verification code \"\n\"generated by the app below.\"\nmsgstr \"\"\n\"為了使用雙重驗證保護您的帳戶，請使用您的驗證器應用程式掃描下方的 QR 碼，然後\"\n\"輸入應用程式產生的驗證碼。\"\n\n#: templates/mfa/totp/activate_form.html:21\nmsgid \"Authenticator secret\"\nmsgstr \"Authenticator 驗證器密鑰\"\n\n#: templates/mfa/totp/activate_form.html:24\nmsgid \"\"\n\"You can store this secret and use it to reinstall your authenticator app at \"\n\"a later time.\"\nmsgstr \"您可以儲存此密鑰，稍後重新安裝 authenticator 驗證器應用程式時使用。\"\n\n#: templates/mfa/totp/deactivate_form.html:5\n#: templates/mfa/totp/deactivate_form.html:9\nmsgid \"Deactivate Authenticator App\"\nmsgstr \"停用驗證器\"\n\n#: templates/mfa/totp/deactivate_form.html:12\nmsgid \"\"\n\"You are about to deactivate authenticator app based authentication. Are you \"\n\"sure?\"\nmsgstr \"您即將停用基於 authenticator 驗證器應用程式的身份驗證。確定要繼續嗎？\"\n\n#: templates/mfa/trust.html:4 templates/mfa/trust.html:8\nmsgid \"Trust this Browser?\"\nmsgstr \"信任此瀏覽器？\"\n\n#: templates/mfa/trust.html:11\nmsgid \"\"\n\"If you choose to trust this browser, you will not be asked for a \"\n\"verification code the next time you sign in.\"\nmsgstr \"如果您選擇信任此瀏覽器，下次登入時將不會要求輸入驗證碼。\"\n\n#: templates/mfa/trust.html:23\n#, python-format\nmsgid \"Trust for %(period)s\"\nmsgstr \"於 %(period)s 期間信任\"\n\n#: templates/mfa/trust.html:26\nmsgid \"Don't Trust\"\nmsgstr \"不要信任\"\n\n#: templates/mfa/webauthn/add_form.html:7\nmsgid \"Add Security Key\"\nmsgstr \"新增安全金鑰\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:6\nmsgid \"Remove Security Key\"\nmsgstr \"移除安全金鑰\"\n\n#: templates/mfa/webauthn/authenticator_confirm_delete.html:9\nmsgid \"Are you sure you want to remove this security key?\"\nmsgstr \"您確定要移除此安全金鑰嗎？\"\n\n#: templates/mfa/webauthn/authenticator_list.html:21\nmsgid \"Usage\"\nmsgstr \"使用方式\"\n\n#: templates/mfa/webauthn/authenticator_list.html:33\nmsgid \"Passkey\"\nmsgstr \"通行密鑰\"\n\n#: templates/mfa/webauthn/authenticator_list.html:37\nmsgid \"Security key\"\nmsgstr \"安全金鑰\"\n\n#: templates/mfa/webauthn/authenticator_list.html:40\nmsgid \"This key does not indicate whether it is a passkey.\"\nmsgstr \"此金鑰無法判斷是否為通行密鑰（Passkey）。\"\n\n#: templates/mfa/webauthn/authenticator_list.html:41\nmsgid \"Unspecified\"\nmsgstr \"未指定\"\n\n#: templates/mfa/webauthn/authenticator_list.html:46\n#, python-format\nmsgid \"Added on %(created_at)s\"\nmsgstr \"新增於 %(created_at)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:48\n#, python-format\nmsgid \"Last used %(last_used)s\"\nmsgstr \"上次使用時間：%(last_used)s\"\n\n#: templates/mfa/webauthn/authenticator_list.html:56\nmsgid \"Edit\"\nmsgstr \"編輯\"\n\n#: templates/mfa/webauthn/edit_form.html:7\nmsgid \"Edit Security Key\"\nmsgstr \"編輯安全金鑰\"\n\n#: templates/mfa/webauthn/edit_form.html:18\nmsgid \"Save\"\nmsgstr \"儲存\"\n\n#: templates/mfa/webauthn/signup_form.html:7\nmsgid \"Create Passkey\"\nmsgstr \"建立通行密鑰\"\n\n#: templates/mfa/webauthn/signup_form.html:10\nmsgid \"\"\n\"You are about to create a passkey for your account. As you can add \"\n\"additional keys later on, you can use a descriptive name to tell the keys \"\n\"apart.\"\nmsgstr \"\"\n\"您即將為您的帳戶建立通行密鑰（Passkey）。由於您可以稍後新增其他金鑰，建議使用\"\n\"具描述性的名稱來區分不同金鑰。\"\n\n#: templates/mfa/webauthn/signup_form.html:21\nmsgid \"Create\"\nmsgstr \"建立\"\n\n#: templates/mfa/webauthn/snippets/scripts.html:2\nmsgid \"This functionality requires JavaScript.\"\nmsgstr \"此功能需要JavaScript支援。\"\n\n#: templates/socialaccount/authentication_error.html:5\n#: templates/socialaccount/authentication_error.html:9\nmsgid \"Third-Party Login Failure\"\nmsgstr \"第三方帳號登入失敗\"\n\n#: templates/socialaccount/authentication_error.html:12\nmsgid \"\"\n\"An error occurred while attempting to login via your third-party account.\"\nmsgstr \"嘗試使用您的第三方帳號登入時發生錯誤。\"\n\n#: templates/socialaccount/connections.html:13\nmsgid \"\"\n\"You can sign in to your account using any of the following third-party \"\n\"accounts:\"\nmsgstr \"您可以使用下列任何第三方帳號登入您的帳號：\"\n\n#: templates/socialaccount/connections.html:46\nmsgid \"You currently have no third-party accounts connected to this account.\"\nmsgstr \"您目前沒有任何第三方帳號與此帳號連結。\"\n\n#: templates/socialaccount/connections.html:50\nmsgid \"Add a Third-Party Account\"\nmsgstr \"新增一個第三方帳號\"\n\n#: templates/socialaccount/email/account_connected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been connected to your account.\"\nmsgstr \"來自 %(provider)s 的第三方帳號已連結至您的帳號。\"\n\n#: templates/socialaccount/email/account_connected_subject.txt:3\nmsgid \"Third-Party Account Connected\"\nmsgstr \"已連接第三方帳號\"\n\n#: templates/socialaccount/email/account_disconnected_message.txt:4\n#, python-format\nmsgid \"\"\n\"A third-party account from %(provider)s has been disconnected from your \"\n\"account.\"\nmsgstr \"已移除來自 %(provider)s 的第三方帳戶與您的帳戶關聯。\"\n\n#: templates/socialaccount/email/account_disconnected_subject.txt:3\nmsgid \"Third-Party Account Disconnected\"\nmsgstr \"已取消第三方帳號關聯\"\n\n#: templates/socialaccount/login.html:10\n#, python-format\nmsgid \"Connect %(provider)s\"\nmsgstr \"連接 %(provider)s\"\n\n#: templates/socialaccount/login.html:13\n#, python-format\nmsgid \"You are about to connect a new third-party account from %(provider)s.\"\nmsgstr \"您即將連結來自 %(provider)s 的新第三方帳戶。\"\n\n#: templates/socialaccount/login.html:17\n#, python-format\nmsgid \"Sign In Via %(provider)s\"\nmsgstr \"透過 %(provider)s 登入\"\n\n#: templates/socialaccount/login.html:20\n#, python-format\nmsgid \"You are about to sign in using a third-party account from %(provider)s.\"\nmsgstr \"您即將使用來自 %(provider)s 的第三方帳號登入。\"\n\n#: templates/socialaccount/login_cancelled.html:5\n#: templates/socialaccount/login_cancelled.html:9\nmsgid \"Login Cancelled\"\nmsgstr \"登入已取消\"\n\n#: templates/socialaccount/login_cancelled.html:13\n#, python-format\nmsgid \"\"\n\"You decided to cancel logging in to our site using one of your existing \"\n\"accounts. If this was a mistake, please proceed to <a \"\n\"href=\\\"%(login_url)s\\\">sign in</a>.\"\nmsgstr \"\"\n\"您決定不繼續登入這一個網站。若這是一個失誤，請<a href=\\\"%(login_url)s\\\">由此\"\n\"</a>重新登入。\"\n\n#: templates/socialaccount/messages/account_connected.txt:2\nmsgid \"The third-party account has been connected.\"\nmsgstr \"已建立第三方帳號關聯。\"\n\n#: templates/socialaccount/messages/account_disconnected.txt:2\nmsgid \"The third-party account has been disconnected.\"\nmsgstr \"已中斷第三方帳號關聯。\"\n\n#: templates/socialaccount/signup.html:12\n#, python-format\nmsgid \"\"\n\"You are about to use your %(provider_name)s account to login to\\n\"\n\"%(site_name)s. As a final step, please complete the following form:\"\nmsgstr \"\"\n\"您即將使用您的 %(provider_name)s 帳戶登入\\n\"\n\"%(site_name)s。作為最後一步，請完成以下表單：\"\n\n#: templates/socialaccount/snippets/login.html:10\nmsgid \"Or use a third-party\"\nmsgstr \"或是使用第三方\"\n\n#: templates/usersessions/messages/sessions_logged_out.txt:2\nmsgid \"Signed out of all other sessions.\"\nmsgstr \"登出所有其他登入階段。\"\n\n#: templates/usersessions/usersession_list.html:24\nmsgid \"Started At\"\nmsgstr \"開始於\"\n\n#: templates/usersessions/usersession_list.html:27\nmsgid \"IP Address\"\nmsgstr \"IP 地址\"\n\n#: templates/usersessions/usersession_list.html:30\nmsgid \"Browser\"\nmsgstr \"瀏覽器\"\n\n#: templates/usersessions/usersession_list.html:34\nmsgid \"Last seen at\"\nmsgstr \"最後出現於\"\n\n#: templates/usersessions/usersession_list.html:59\nmsgid \"Current\"\nmsgstr \"目前\"\n\n#: templates/usersessions/usersession_list.html:72\nmsgid \"Sign Out Other Sessions\"\nmsgstr \"登出其他使用階段\"\n\n#: usersessions/apps.py:9\nmsgid \"User Sessions\"\nmsgstr \"使用者會話\"\n\n#: usersessions/models.py:94\nmsgid \"session key\"\nmsgstr \"會話金鑰\"\n\n#, fuzzy\n#~ msgid \"Account Connection\"\n#~ msgstr \"帳號連結\"\n\n#~ msgid \"Use security key or device\"\n#~ msgstr \"使用安全金鑰或裝置\"\n\n#, python-brace-format\n#~ msgid \"Password must be a minimum of {0} characters.\"\n#~ msgstr \"密碼長度至少要有 {0} 個字元。\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"You are receiving this email because you or someone else has requested a\\n\"\n#~ \"password for your user account. However, we do not have any record of a \"\n#~ \"user\\n\"\n#~ \"with email %(email)s in our database.\\n\"\n#~ \"\\n\"\n#~ \"This mail can be safely ignored if you did not request a password reset.\\n\"\n#~ \"\\n\"\n#~ \"If it was you, you can sign up for an account using the link below.\"\n#~ msgstr \"\"\n#~ \"您會收到這封信是因為您或是某人在 %(site_domain)s 這個網站上要求重設您帳號\"\n#~ \"的密碼。\\n\"\n#~ \"若您沒有要求我們重設密碼，請您直接忽略這封信。若要重設您的密碼，請點擊下面\"\n#~ \"的連結。\"\n\n#, fuzzy\n#~ msgid \"The following email address is associated with your account:\"\n#~ msgstr \"下列電子郵件已與你的帳號連結：\"\n\n#, fuzzy\n#~ msgid \"Change Email Address\"\n#~ msgstr \"確認電子郵件\"\n\n#, fuzzy, python-format\n#~ msgid \"\"\n#~ \"Please sign in with one\\n\"\n#~ \"of your existing third party accounts. Or, <a \"\n#~ \"href=\\\"%(signup_url)s\\\">sign up</a>\\n\"\n#~ \"for a %(site_name)s account and sign in below:\"\n#~ msgstr \"\"\n#~ \"請用您的第三方帳號登入。\\n\"\n#~ \"或者%(link)s註冊%(end_link)s \\n\"\n#~ \"一個 %(site_name)s帳號後登入：\"\n\n#~ msgid \"or\"\n#~ msgstr \"或\"\n\n#~ msgid \"change password\"\n#~ msgstr \"修改密碼\"\n\n#~ msgid \"OpenID Sign In\"\n#~ msgstr \"OpenID 登入\"\n\n#~ msgid \"This email address is already associated with another account.\"\n#~ msgstr \"此電子郵件已經與別的帳號連結了。\"\n\n#~ msgid \"\"\n#~ \"We have sent you an e-mail. Please contact us if you do not receive it \"\n#~ \"within a few minutes.\"\n#~ msgstr \"\"\n#~ \"我們已經寄了一封電子郵件給您，如果數分鐘內您沒有收到，請與我們聯絡。\"\n\n#~ msgid \"The login and/or password you specified are not correct.\"\n#~ msgstr \"您提供的帳號或密碼不正確。\"\n\n#~ msgid \"Usernames can only contain letters, digits and @/./+/-/_.\"\n#~ msgstr \"使用者名稱只能包含字母，數字及 @/./+/-/_.\"\n\n#~ msgid \"This username is already taken. Please choose another.\"\n#~ msgstr \"這個使用者名稱已經有人用了，請換一個。\"\n\n#~ msgid \"\"\n#~ \"You have confirmed that <a href=\\\"mailto:%(email)s\\\">%(email)s</a> is an \"\n#~ \"e-mail address for user %(user_display)s.\"\n#~ msgstr \"\"\n#~ \"您以確認<a href=\\\"mailto:%(email)s\\\">%(email)s</a>是使用者%(user_display)s\"\n#~ \"的電子郵件地址。\"\n\n#~ msgid \"Thanks for using our site!\"\n#~ msgstr \"感謝您使用我們的網站！\"\n\n#~ msgid \"Confirmation email sent to %(email)s\"\n#~ msgstr \"确认e-mail已发往 %(email)s\"\n\n#~ msgid \"Delete Password\"\n#~ msgstr \"删除密码\"\n\n#~ msgid \"\"\n#~ \"You may delete your password since you are currently logged in using \"\n#~ \"OpenID.\"\n#~ msgstr \"您当前使用OpenID登录，因此您可以删除你的密码。\"\n\n#~ msgid \"delete my password\"\n#~ msgstr \"删除我的密码\"\n\n#~ msgid \"Password Deleted\"\n#~ msgstr \"密码已删除\"\n\n#~ msgid \"\"\n#~ \"If you have any trouble resetting your password, contact us at <a \"\n#~ \"href=\\\"mailto:%(CONTACT_EMAIL)s\\\">%(CONTACT_EMAIL)s</a>.\"\n#~ msgstr \"\"\n#~ \"Als je problemen hebt je wachtwoord opnieuw in te stellen, neem dan \"\n#~ \"contact op met <a href=\\\"mailto:%(CONTACT_EMAIL)s\\\">%(CONTACT_EMAIL)s</a>.\"\n\n#~ msgid \"OpenID\"\n#~ msgstr \"OpenID\"\n\n#~ msgid \"Already have an account?\"\n#~ msgstr \"Heb je al een account?\"\n\n#~ msgid \"Sign in\"\n#~ msgstr \"Aanmelden\"\n\n#~ msgid \"Language\"\n#~ msgstr \"Taal\"\n\n#~ msgid \"Pinax can be used in your preferred language.\"\n#~ msgstr \"Deze site kan in jouw voorkeurstaal gebruikt worden.\"\n\n#~ msgid \"Change my language\"\n#~ msgstr \"Verander mijn taal\"\n\n#~ msgid \"Timezone\"\n#~ msgstr \"Tijdzone\"\n\n#, fuzzy\n#~ msgid \"\"\n#~ \"You're receiving this e-mail because you requested a password reset\\n\"\n#~ \"for your user account at Pinax.\\n\"\n#~ \"\\n\"\n#~ \"Your new password is: %(new_password)s\\n\"\n#~ \"\\n\"\n#~ \"Your username, in case you've forgotten: %(username)s\\n\"\n#~ \"\\n\"\n#~ \"You should log in as soon as possible and change your password.\\n\"\n#~ \"\\n\"\n#~ \"Thanks for using our site!\\n\"\n#~ msgstr \"\"\n#~ \"Je ontvangt deze mail omdat er een verzoek is ingelegd om het wachtwoord\\n\"\n#~ \"behorende bij je %(site_name)s account opnieuw in te stellen.\\n\"\n#~ \"\\n\"\n#~ \"Je nieuwe wachtwoord is: %(new_password)s\\n\"\n#~ \"\\n\"\n#~ \"Je gebruikersnaam, voor het geval je die vergeten bent, is: %(username)s\\n\"\n#~ \"\\n\"\n#~ \"Je moet zo snel mogelijk inloggen en bovenstaand wachtwoord veranderen.\\n\"\n#~ \"\\n\"\n#~ \"Bedankt voor het gebruik van onze site!\\n\"\n\n#~ msgid \"If checked you will stay logged in for 3 weeks\"\n#~ msgstr \"Bij 'Onthouden' blijf je ingelogd gedurende 3 weken\"\n\n#~ msgid \"Timezone successfully updated.\"\n#~ msgstr \"Tijdzone gewijzigd.\"\n\n#~ msgid \"Language successfully updated.\"\n#~ msgstr \"Taal gewijzigd.\"\n\n#~ msgid \"None\"\n#~ msgstr \"Geen\"\n\n#~ msgid \"Log In\"\n#~ msgstr \"Inloggen\"\n\n#~ msgid \"Log in\"\n#~ msgstr \"Inloggen\"\n\n#~ msgid \"Logout\"\n#~ msgstr \"Afmelden\"\n\n#~ msgid \"\"\n#~ \"When you receive the new password, you should <a href=\\\"%\"\n#~ \"(login_url)s\\\">log in</a> and change it as soon as possible.\"\n#~ msgstr \"\"\n#~ \"Zodra je het nieuwe wachtwoord ontvangen hebt moet je zo snel mogelijk <a \"\n#~ \"href=\\\"%(login_url)s\\\">inloggen</a> en het wachtwoord wijzigen.\"\n\n#~ msgid \"You are already logged in.\"\n#~ msgstr \"Je bent al ingelogd.\"\n\n#~ msgid \"\"\n#~ \"By clicking \\\"Sign Up\\\", you are indicating that you have read and agree \"\n#~ \"to the <a href=\\\"%(terms_url)s\\\">Terms of Use</a> and <a href=\\\"%\"\n#~ \"(privacy_url)s\\\">Privacy Policy</a>.\"\n#~ msgstr \"\"\n#~ \"Door te registreren geef je aan dat je de <a href=\\\"%\"\n#~ \"(terms_url)s\\\">gebruiksvoorwaarden</a> en de <a href=\\\"%\"\n#~ \"(privacy_url)s\\\">privacy policy</a> gelezen hebt en ermee akkoord gaat.\"\n\n#~ msgid \"\"\n#~ \"If you have any trouble creating your account, contact us at <a \"\n#~ \"href=\\\"mailto:%(contact_email)s\\\">%(contact_email)s</a>.\"\n#~ msgstr \"\"\n#~ \"Als je problemen hebt om een account aan te maken, neem dan contact op \"\n#~ \"met <a href=\\\"mailto:%(contact_email)s\\\">%(contact_email)s</a>.\"\n\n#~ msgid \"Log in &raquo;\"\n#~ msgstr \"Inloggen\"\n"
  },
  {
    "path": "allauth/mfa/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/mfa/adapter.py",
    "content": "from io import BytesIO\nfrom urllib.parse import quote, urlencode\n\nfrom django.utils.translation import gettext, gettext_lazy as _\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.utils import (\n    user_display,\n    user_email,\n    user_pk_to_url_str,\n    user_username,\n)\nfrom allauth.core import context\nfrom allauth.core.internal.adapter import BaseAdapter\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.models import Authenticator\nfrom allauth.utils import import_attribute\n\n\nclass DefaultMFAAdapter(BaseAdapter):\n    \"\"\"The adapter class allows you to override various functionality of the\n    ``allauth.mfa`` app.  To do so, point ``settings.MFA_ADAPTER`` to your own\n    class that derives from ``DefaultMFAAdapter`` and override the behavior by\n    altering the implementation of the methods according to your own needs.\n    \"\"\"\n\n    error_messages = {\n        \"add_email_blocked\": _(\n            \"You cannot add an email address to an account protected by two-factor authentication.\"\n        ),\n        \"cannot_delete_authenticator\": _(\n            \"You cannot deactivate two-factor authentication.\"\n        ),\n        \"cannot_generate_recovery_codes\": _(\n            \"You cannot generate recovery codes without having two-factor authentication enabled.\"\n        ),\n        \"incorrect_code\": _(\"Incorrect code.\"),\n        \"unverified_email\": _(\n            \"You cannot activate two-factor authentication until you have verified your email address.\"\n        ),\n    }\n    \"The error messages that can occur as part of MFA form handling.\"\n\n    def get_totp_label(self, user) -> str:\n        \"\"\"Returns the label used for representing the given user in a TOTP QR\n        code.\n        \"\"\"\n        return self._get_user_identifier(user)\n\n    def _get_user_identifier(self, user) -> str:\n        \"\"\"Human-palatable identifier for a user account. It is intended only\n        for display.\n        \"\"\"\n        label = user_email(user)\n        if not label:\n            label = user_username(user)\n        if not label:\n            label = str(user)\n        return label\n\n    def get_totp_issuer(self) -> str:\n        \"\"\"Returns the TOTP issuer name that will be contained in the TOTP QR\n        code.\n        \"\"\"\n        issuer = app_settings.TOTP_ISSUER\n        if not issuer:\n            issuer = self._get_site_name()\n        return issuer\n\n    def build_totp_url(self, user, secret: str) -> str:\n        label = self.get_totp_label(user)\n        issuer = self.get_totp_issuer()\n        params = {\n            \"secret\": secret,\n            # This is the default\n            # \"algorithm\": \"SHA1\",\n            \"issuer\": issuer,\n        }\n        if app_settings.TOTP_DIGITS != 6:\n            params[\"digits\"] = app_settings.TOTP_DIGITS\n        if app_settings.TOTP_PERIOD != 30:\n            params[\"period\"] = app_settings.TOTP_PERIOD\n        return f\"otpauth://totp/{quote(label)}?{urlencode(params, quote_via=quote)}\"\n\n    def build_totp_svg(self, url: str) -> str:\n        import qrcode\n        from qrcode.image.svg import SvgPathImage\n\n        img = qrcode.make(url, image_factory=SvgPathImage)\n        buf = BytesIO()\n        img.save(buf)\n        return buf.getvalue().decode(\"utf8\")\n\n    def _get_site_name(self) -> str:\n        if allauth_settings.SITES_ENABLED:\n            from django.contrib.sites.models import Site\n\n            return Site.objects.get_current(context.request).name\n        else:\n            return context.request.get_host()\n\n    def encrypt(self, text: str) -> str:\n        \"\"\"Secrets such as the TOTP key are stored in the database.  This\n        hook can be used to encrypt those so that they are not stored in the\n        clear in the database.\n        \"\"\"\n        return text\n\n    def decrypt(self, encrypted_text: str) -> str:\n        \"\"\"Counter part of ``encrypt()``.\"\"\"\n        text = encrypted_text\n        return text\n\n    def can_delete_authenticator(self, authenticator: Authenticator) -> bool:\n        return True\n\n    def send_notification_mail(self, *args, **kwargs):\n        return get_account_adapter().send_notification_mail(*args, **kwargs)\n\n    def is_mfa_enabled(self, user, types=None) -> bool:\n        \"\"\"\n        Returns ``True`` if (and only if) the user has 2FA enabled.\n        \"\"\"\n        if user.is_anonymous:\n            return False\n        qs = Authenticator.objects.filter(user=user)\n        if types is not None:\n            qs = qs.filter(type__in=types)\n        return qs.exists()\n\n    def generate_authenticator_name(self, user, type: Authenticator.Type) -> str:\n        \"\"\"\n        Generate a human friendly name for the key. Used to prefill the \"Add\n        key\" form.\n        \"\"\"\n        n = Authenticator.objects.filter(user=user, type=type).count()\n        if n == 0:\n            return gettext(\"Master key\")\n        elif n == 1:\n            return gettext(\"Backup key\")\n        return gettext(\"Key nr. {number}\").format(number=n + 1)\n\n    def get_public_key_credential_rp_entity(self) -> dict[str, str]:\n        name = self._get_site_name()\n        return {\n            \"id\": context.request.get_host().partition(\":\")[0],\n            \"name\": name,\n        }\n\n    def get_public_key_credential_user_entity(self, user) -> dict:\n        return {\n            \"id\": user_pk_to_url_str(user).encode(\"utf8\"),\n            \"display_name\": user_display(user),\n            \"name\": self._get_user_identifier(user),\n        }\n\n\ndef get_adapter() -> DefaultMFAAdapter:\n    return import_attribute(app_settings.ADAPTER)()\n"
  },
  {
    "path": "allauth/mfa/admin.py",
    "content": "from django.contrib import admin\n\nfrom allauth.mfa.models import Authenticator\n\n\n@admin.register(Authenticator)\nclass AuthenticatorAdmin(admin.ModelAdmin):\n    raw_id_fields = (\"user\",)\n    list_display = (\"user\", \"type\", \"created_at\", \"last_used_at\")\n    list_filter = (\"type\", \"created_at\", \"last_used_at\")\n"
  },
  {
    "path": "allauth/mfa/app_settings.py",
    "content": "from datetime import timedelta\n\n\nclass AppSettings:\n    def __init__(self, prefix: str) -> None:\n        self.prefix = prefix\n\n    def _setting(self, name: str, dflt):\n        from allauth.utils import get_setting\n\n        return get_setting(f\"{self.prefix}{name}\", dflt)\n\n    @property\n    def ADAPTER(self) -> str:\n        return self._setting(\"ADAPTER\", \"allauth.mfa.adapter.DefaultMFAAdapter\")\n\n    @property\n    def ALLOW_UNVERIFIED_EMAIL(self) -> bool:\n        return self._setting(\"ALLOW_UNVERIFIED_EMAIL\", False)\n\n    @property\n    def FORMS(self) -> dict:\n        return self._setting(\"FORMS\", {})\n\n    @property\n    def RECOVERY_CODE_COUNT(self) -> int:\n        \"\"\"\n        The number of recovery codes.\n        \"\"\"\n        return self._setting(\"RECOVERY_CODE_COUNT\", 10)\n\n    @property\n    def RECOVERY_CODE_DIGITS(self) -> int:\n        \"\"\"\n        The number of digits of each recovery code.\n        \"\"\"\n        return self._setting(\"RECOVERY_CODE_DIGITS\", 8)\n\n    @property\n    def TOTP_PERIOD(self) -> int:\n        \"\"\"\n        The period that a TOTP code will be valid for, in seconds.\n        \"\"\"\n        return self._setting(\"TOTP_PERIOD\", 30)\n\n    @property\n    def TOTP_DIGITS(self) -> int:\n        \"\"\"\n        The number of digits for TOTP codes\n        \"\"\"\n        return self._setting(\"TOTP_DIGITS\", 6)\n\n    @property\n    def TOTP_ISSUER(self) -> str:\n        \"\"\"\n        The issuer.\n        \"\"\"\n        return self._setting(\"TOTP_ISSUER\", \"\")\n\n    @property\n    def TOTP_INSECURE_BYPASS_CODE(self):\n        \"\"\"\n        Don't use this on production. Useful for development & E2E tests only.\n        \"\"\"\n        from django.conf import settings\n        from django.core.exceptions import ImproperlyConfigured\n\n        code = self._setting(\"TOTP_INSECURE_BYPASS_CODE\", None)\n        if (not settings.DEBUG) and code:\n            raise ImproperlyConfigured(\n                \"MFA_TOTP_INSECURE_BYPASS_CODE is for testing purposes only\"\n            )\n        return code\n\n    @property\n    def TOTP_TOLERANCE(self) -> int:\n        \"\"\"\n        The number of time steps in the past or future to allow. Lower values are more secure, but more likely to fail due to clock drift.\n        \"\"\"\n        return self._setting(\"TOTP_TOLERANCE\", 0)\n\n    @property\n    def SUPPORTED_TYPES(self) -> list[str]:\n        dflt = [\"recovery_codes\", \"totp\"]\n        return self._setting(\"SUPPORTED_TYPES\", dflt)\n\n    @property\n    def WEBAUTHN_ALLOW_INSECURE_ORIGIN(self) -> bool:\n        return self._setting(\"WEBAUTHN_ALLOW_INSECURE_ORIGIN\", False)\n\n    @property\n    def PASSKEY_LOGIN_ENABLED(self) -> bool:\n        return \"webauthn\" in self.SUPPORTED_TYPES and self._setting(\n            \"PASSKEY_LOGIN_ENABLED\", False\n        )\n\n    @property\n    def PASSKEY_SIGNUP_ENABLED(self) -> bool:\n        return \"webauthn\" in self.SUPPORTED_TYPES and self._setting(\n            \"PASSKEY_SIGNUP_ENABLED\", False\n        )\n\n    @property\n    def TRUST_ENABLED(self) -> bool:\n        return self._setting(\"TRUST_ENABLED\", False)\n\n    @property\n    def _TRUST_STAGE_ENABLED(self) -> bool:\n        from allauth.account import app_settings as account_settings\n\n        return self.TRUST_ENABLED or account_settings.LOGIN_BY_CODE_TRUST_ENABLED\n\n    @property\n    def TRUST_COOKIE_AGE(self) -> timedelta:\n        age = self._setting(\"TRUST_COOKIE_AGE\", timedelta(days=14))\n        if not isinstance(age, timedelta):\n            age = timedelta(seconds=age)\n        return age\n\n    @property\n    def TRUST_COOKIE_NAME(self) -> str:\n        return self._setting(\"TRUST_COOKIE_NAME\", \"mfa_trusted\")\n\n    @property\n    def TRUST_COOKIE_DOMAIN(self) -> str | None:\n        from django.conf import settings\n\n        return self._setting(\"TRUST_COOKIE_DOMAIN\", settings.SESSION_COOKIE_DOMAIN)\n\n    @property\n    def TRUST_COOKIE_HTTPONLY(self) -> bool:\n        from django.conf import settings\n\n        return self._setting(\"TRUST_COOKIE_HTTPONLY\", settings.SESSION_COOKIE_HTTPONLY)\n\n    @property\n    def TRUST_COOKIE_PATH(self) -> str:\n        from django.conf import settings\n\n        return self._setting(\"TRUST_COOKIE_PATH\", settings.SESSION_COOKIE_PATH)\n\n    @property\n    def TRUST_COOKIE_SAMESITE(self) -> str:\n        from django.conf import settings\n\n        return self._setting(\"TRUST_COOKIE_SAMESITE\", settings.SESSION_COOKIE_SAMESITE)\n\n    @property\n    def TRUST_COOKIE_SECURE(self) -> str | None:\n        from django.conf import settings\n\n        return self._setting(\"TRUST_COOKIE_SECURE\", settings.SESSION_COOKIE_SECURE)\n\n\n_app_settings = AppSettings(\"MFA_\")\n\n\ndef __getattr__(name):\n    # See https://peps.python.org/pep-0562/\n    return getattr(_app_settings, name)\n"
  },
  {
    "path": "allauth/mfa/apps.py",
    "content": "from django.apps import AppConfig\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth import app_settings\n\n\nclass MFAConfig(AppConfig):\n    name = \"allauth.mfa\"\n    verbose_name = _(\"MFA\")\n    default_auto_field = (\n        app_settings.DEFAULT_AUTO_FIELD or \"django.db.models.BigAutoField\"\n    )\n\n    def ready(self):\n        from allauth.account import signals as account_signals\n        from allauth.mfa import checks  # noqa\n        from allauth.mfa import signals\n\n        account_signals._add_email.connect(signals.on_add_email)\n"
  },
  {
    "path": "allauth/mfa/base/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/mfa/base/forms.py",
    "content": "from django import forms\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth.core import context\nfrom allauth.mfa.adapter import get_adapter\nfrom allauth.mfa.base.internal.flows import check_rate_limit, post_authentication\nfrom allauth.mfa.models import Authenticator\n\n\nclass BaseAuthenticateForm(forms.Form):\n    code = forms.CharField(\n        label=_(\"Code\"),\n        widget=forms.TextInput(\n            attrs={\"placeholder\": _(\"Code\"), \"autocomplete\": \"one-time-code\"},\n        ),\n    )\n\n    def __init__(self, *args, **kwargs) -> None:\n        self.user = kwargs.pop(\"user\")\n        super().__init__(*args, **kwargs)\n\n    def clean_code(self) -> str:\n        clear_rl = check_rate_limit(self.user)\n        code = self.cleaned_data[\"code\"]\n        for auth in Authenticator.objects.filter(user=self.user).exclude(\n            # WebAuthn cannot validate manual codes.\n            type=Authenticator.Type.WEBAUTHN\n        ):\n            if auth.wrap().validate_code(code):\n                auth.user = self.user\n                self.authenticator = auth\n                clear_rl()\n                return code\n\n        raise get_adapter().validation_error(\"incorrect_code\")\n\n\nclass AuthenticateForm(BaseAuthenticateForm):\n    def save(self) -> None:\n        post_authentication(context.request, self.authenticator)\n\n\nclass ReauthenticateForm(BaseAuthenticateForm):\n    def save(self) -> None:\n        post_authentication(context.request, self.authenticator, reauthenticated=True)\n"
  },
  {
    "path": "allauth/mfa/base/internal/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/mfa/base/internal/flows.py",
    "content": "from collections.abc import Callable\n\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.internal.flows.login import record_authentication\nfrom allauth.core import context, ratelimit\nfrom allauth.mfa import signals\nfrom allauth.mfa.models import Authenticator\n\n\ndef delete_dangling_recovery_codes(user) -> Authenticator | None:\n    deleted_authenticator = None\n    qs = Authenticator.objects.filter(user=user)\n    if not qs.exclude(type=Authenticator.Type.RECOVERY_CODES).exists():\n        deleted_authenticator = qs.first()\n        qs.delete()\n    return deleted_authenticator\n\n\ndef delete_and_cleanup(request, authenticator) -> None:\n    authenticator.delete()\n    rc_auth = delete_dangling_recovery_codes(authenticator.user)\n    for auth in [authenticator, rc_auth]:\n        if auth:\n            signals.authenticator_removed.send(\n                sender=Authenticator,\n                request=request,\n                user=request.user,\n                authenticator=auth,\n            )\n\n\ndef post_authentication(\n    request,\n    authenticator: Authenticator,\n    reauthenticated: bool = False,\n    passwordless: bool = False,\n) -> None:\n    authenticator.record_usage()\n    extra_data = {\n        \"id\": authenticator.pk,\n        \"type\": authenticator.type,\n    }\n    if reauthenticated:\n        extra_data[\"reauthenticated\"] = True\n    if passwordless:\n        extra_data[\"passwordless\"] = True\n    record_authentication(request, authenticator.user, \"mfa\", **extra_data)\n\n\ndef check_rate_limit(user) -> Callable[[], None]:\n    key = f\"mfa-auth-user-{str(user.pk)}\"\n    if not ratelimit.consume(\n        context.request,\n        action=\"login_failed\",\n        key=key,\n    ):\n        raise get_account_adapter().validation_error(\"too_many_login_attempts\")\n    return lambda: ratelimit.clear(context.request, action=\"login_failed\", key=key)\n"
  },
  {
    "path": "allauth/mfa/base/urls.py",
    "content": "from django.urls import URLPattern, URLResolver, path\n\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.base import views\n\n\nurlpatterns: list[URLPattern | URLResolver] = [\n    path(\"\", views.index, name=\"mfa_index\"),\n    path(\"authenticate/\", views.authenticate, name=\"mfa_authenticate\"),\n    path(\"reauthenticate/\", views.reauthenticate, name=\"mfa_reauthenticate\"),\n]\n\nif app_settings._TRUST_STAGE_ENABLED:\n    urlpatterns.append(path(\"trust/\", views.trust, name=\"mfa_trust\"))\n"
  },
  {
    "path": "allauth/mfa/base/views.py",
    "content": "from django.contrib.auth.decorators import login_required\nfrom django.forms import Form\nfrom django.http import HttpResponse, HttpResponseBase, HttpResponseRedirect\nfrom django.urls import reverse\nfrom django.utils import timezone\nfrom django.utils.decorators import method_decorator\nfrom django.views.generic import TemplateView\nfrom django.views.generic.edit import FormView\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.internal.decorators import login_stage_required\nfrom allauth.account.views import BaseReauthenticateView\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.base.forms import AuthenticateForm, ReauthenticateForm\nfrom allauth.mfa.internal.flows import trust as trust_\nfrom allauth.mfa.models import Authenticator\nfrom allauth.mfa.stages import AuthenticateStage, TrustStage\nfrom allauth.mfa.utils import is_mfa_enabled\nfrom allauth.mfa.webauthn.forms import AuthenticateWebAuthnForm\nfrom allauth.mfa.webauthn.internal.flows import auth as webauthn_auth\nfrom allauth.utils import get_form_class\n\n\n@method_decorator(\n    login_stage_required(stage=AuthenticateStage.key, redirect_urlname=\"account_login\"),\n    name=\"dispatch\",\n)\nclass AuthenticateView(TemplateView):\n    form_class = AuthenticateForm\n    webauthn_form_class = AuthenticateWebAuthnForm\n    template_name = f\"mfa/authenticate.{account_settings.TEMPLATE_EXTENSION}\"\n\n    def dispatch(self, request, *args, **kwargs) -> HttpResponseBase:\n        self.stage = request._login_stage\n        if not is_mfa_enabled(\n            self.stage.login.user,\n            [Authenticator.Type.TOTP, Authenticator.Type.WEBAUTHN],\n        ):\n            return HttpResponseRedirect(reverse(\"account_login\"))\n        self.form = self._build_forms()\n        return super().dispatch(request, *args, **kwargs)\n\n    def post(self, request, *args, **kwargs) -> HttpResponse:\n        if self.form.is_valid():\n            return self.form_valid(self.form)\n        else:\n            return self.form_invalid(self.form)\n\n    def _build_forms(self):\n        posted_form = None\n        AuthenticateFormClass = self.get_form_class()\n        AuthenticateWebAuthnFormClass = self.get_webauthn_form_class()\n        user = self.stage.login.user\n        support_webauthn = \"webauthn\" in app_settings.SUPPORTED_TYPES\n        if self.request.method == \"POST\":\n            if \"code\" in self.request.POST:\n                posted_form = self.auth_form = AuthenticateFormClass(\n                    user=user, data=self.request.POST\n                )\n                self.webauthn_form = (\n                    AuthenticateWebAuthnFormClass(user=user)\n                    if support_webauthn\n                    else None\n                )\n            else:\n                self.auth_form = (\n                    AuthenticateFormClass(user=user) if support_webauthn else None\n                )\n                posted_form = self.webauthn_form = AuthenticateWebAuthnFormClass(\n                    user=user, data=self.request.POST\n                )\n        else:\n            self.auth_form = AuthenticateFormClass(user=user)\n            self.webauthn_form = (\n                AuthenticateWebAuthnFormClass(user=user) if support_webauthn else None\n            )\n        return posted_form\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"authenticate\", self.form_class)\n\n    def get_webauthn_form_class(self):\n        return get_form_class(\n            app_settings.FORMS, \"authenticate_webauthn\", self.webauthn_form_class\n        )\n\n    def form_valid(self, form) -> HttpResponse:\n        form.save()\n        return self.stage.exit()\n\n    def form_invalid(self, form) -> HttpResponse:\n        return super().get(self.request)\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data()\n        ret.update(\n            {\n                \"form\": self.auth_form,\n                \"MFA_SUPPORTED_TYPES\": app_settings.SUPPORTED_TYPES,\n            }\n        )\n        if self.webauthn_form:\n            request_options = webauthn_auth.begin_authentication(self.stage.login.user)\n            ret.update(\n                {\n                    \"webauthn_form\": self.webauthn_form,\n                    \"js_data\": {\"request_options\": request_options},\n                }\n            )\n        return ret\n\n\nauthenticate = AuthenticateView.as_view()\n\n\n@method_decorator(login_required, name=\"dispatch\")\nclass ReauthenticateView(BaseReauthenticateView):\n    form_class = ReauthenticateForm\n    template_name = f\"mfa/reauthenticate.{account_settings.TEMPLATE_EXTENSION}\"\n\n    def get_form_kwargs(self) -> dict:\n        ret = super().get_form_kwargs()\n        ret[\"user\"] = self.request.user\n        return ret\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"reauthenticate\", self.form_class)\n\n    def form_valid(self, form) -> HttpResponse:\n        form.save()\n        return super().form_valid(form)\n\n\nreauthenticate = ReauthenticateView.as_view()\n\n\n@method_decorator(login_required, name=\"dispatch\")\nclass IndexView(TemplateView):\n    template_name = f\"mfa/index.{account_settings.TEMPLATE_EXTENSION}\"\n\n    def get_context_data(self, **kwargs):\n        ret = super().get_context_data(**kwargs)\n        authenticators = {}\n        for auth in Authenticator.objects.filter(user=self.request.user):\n            if auth.type == Authenticator.Type.WEBAUTHN:\n                auths = authenticators.setdefault(auth.type, [])\n                auths.append(auth.wrap())\n            else:\n                authenticators[auth.type] = auth.wrap()\n        ret[\"authenticators\"] = authenticators\n        ret[\"MFA_SUPPORTED_TYPES\"] = app_settings.SUPPORTED_TYPES\n        ret[\"is_mfa_enabled\"] = is_mfa_enabled(self.request.user)\n        return ret\n\n\nindex = IndexView.as_view()\n\n\n@method_decorator(\n    login_stage_required(stage=TrustStage.key, redirect_urlname=\"account_login\"),\n    name=\"dispatch\",\n)\nclass TrustView(FormView):\n    form_class = Form\n    template_name = f\"mfa/trust.{account_settings.TEMPLATE_EXTENSION}\"\n\n    def form_valid(self, form):\n        do_trust = self.request.POST.get(\"action\") == \"trust\"\n        stage = self.request._login_stage\n        response = stage.exit()\n        if do_trust:\n            trust_.trust_browser(self.request, stage.login.user, response)\n        return response\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        now = timezone.now()\n        ret[\"trust_from\"] = now\n        ret[\"trust_until\"] = now + app_settings.TRUST_COOKIE_AGE\n        return ret\n\n\ntrust = TrustView.as_view()\n"
  },
  {
    "path": "allauth/mfa/checks.py",
    "content": "from django.core.checks import Critical, register\n\n\n@register()\ndef settings_check(app_configs, **kwargs):\n    from allauth.account import app_settings as account_settings\n    from allauth.mfa import app_settings\n    from allauth.mfa.models import Authenticator\n\n    ret = []\n    if app_settings.PASSKEY_SIGNUP_ENABLED:\n        if Authenticator.Type.WEBAUTHN not in app_settings.SUPPORTED_TYPES:\n            ret.append(\n                Critical(\n                    msg=\"MFA_PASSKEY_SIGNUP_ENABLED requires MFA_SUPPORTED_TYPES to include 'webauthn'\"\n                )\n            )\n        if not account_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED:\n            # The fact that a signup is passkey based is stored in the session,\n            # which gets lost when using link based verification.\n            ret.append(\n                Critical(\n                    msg=\"MFA_PASSKEY_SIGNUP_ENABLED requires ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED\"\n                )\n            )\n        email_required = account_settings.SIGNUP_FIELDS.get(\"email\", {}).get(\"required\")\n        if not email_required:\n            ret.append(\n                Critical(\n                    msg=\"MFA_PASSKEY_SIGNUP_ENABLED requires ACCOUNT_SIGNUP_FIELDS to contain 'email*'\"\n                )\n            )\n        if (\n            account_settings.EMAIL_VERIFICATION\n            != account_settings.EmailVerificationMethod.MANDATORY\n        ):\n            ret.append(\n                Critical(\n                    msg=\"MFA_PASSKEY_SIGNUP_ENABLED requires ACCOUNT_EMAIL_VERIFICATION = 'mandatory'\"\n                )\n            )\n    return ret\n"
  },
  {
    "path": "allauth/mfa/internal/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/mfa/internal/constants.py",
    "content": "from enum import Enum\n\n\nclass LoginStageKey(str, Enum):\n    MFA_SIGNUP_WEBAUTHN = \"mfa_signup_webauthn\"\n    MFA_AUTHENTICATE = \"mfa_authenticate\"\n    MFA_TRUST = \"mfa_trust\"\n"
  },
  {
    "path": "allauth/mfa/internal/flows/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/mfa/internal/flows/add.py",
    "content": "from functools import wraps\n\nfrom django.contrib import messages\nfrom django.contrib.auth.base_user import AbstractBaseUser\nfrom django.core.exceptions import ValidationError\nfrom django.http import HttpResponseRedirect\nfrom django.urls import reverse\n\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.models import EmailAddress\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.adapter import get_adapter\n\n\ndef validate_can_add_authenticator(user: AbstractBaseUser) -> None:\n    \"\"\"\n    If we would allow users to enable 2FA with unverified email address,\n    that would allow for an attacker to signup, not verify and prevent the real\n    owner of the account from ever regaining access.\n    \"\"\"\n    if app_settings.ALLOW_UNVERIFIED_EMAIL:\n        return\n    email_verified = not EmailAddress.objects.filter(\n        user_id=user.pk, verified=False\n    ).exists()\n    if not email_verified:\n        raise get_adapter().validation_error(\"unverified_email\")\n\n\ndef redirect_if_add_not_allowed(function=None):\n    def decorator(view_func):\n        @wraps(view_func)\n        def _wrapper_view(request, *args, **kwargs):\n            if request.user.is_authenticated:  # allow for this to go before reauth\n                try:\n                    validate_can_add_authenticator(request.user)\n                except ValidationError as e:\n                    for message in e.messages:\n                        adapter = get_account_adapter()\n                        adapter.add_message(request, messages.ERROR, message=message)\n                    return HttpResponseRedirect(reverse(\"mfa_index\"))\n            return view_func(request, *args, **kwargs)\n\n        return _wrapper_view\n\n    if function:\n        return decorator(function)\n    return decorator\n"
  },
  {
    "path": "allauth/mfa/internal/flows/trust.py",
    "content": "import time\nfrom dataclasses import dataclass\n\nfrom django.contrib.auth.models import AbstractBaseUser\nfrom django.core.signing import BadSignature, Signer\nfrom django.http import HttpRequest, HttpResponse\nfrom django.utils.crypto import salted_hmac\n\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.models import Authenticator\n\n\n@dataclass\nclass IssuedTrust:\n    fingerprint: str\n    at: int\n\n\ndef create_config_fingerprint(user: AbstractBaseUser) -> str:\n    \"\"\"\n    If the user changes anything about his security setup, we want to invalidate\n    any trust that was issued before.\n    \"\"\"\n    salt = \"allauth.mfa.trust\"\n    parts: list[str] = []\n    parts.append(str(user.pk))\n    parts.append(user.password)\n    for authenticator in Authenticator.objects.filter(user_id=user.pk).order_by(\"pk\"):\n        parts.append(str(authenticator.pk))\n        parts.append(str(authenticator.type))\n        seed = authenticator.data.get(\"seed\")\n        if seed is not None:\n            parts.append(str(seed))\n    return salted_hmac(salt, \"|\".join(parts), algorithm=\"sha256\").hexdigest()\n\n\ndef decode_trust_cookie(request: HttpRequest) -> list[IssuedTrust]:\n    value = request.COOKIES.get(app_settings.TRUST_COOKIE_NAME)\n    if not value:\n        return []\n    signer = Signer()\n    try:\n        data = signer.unsign_object(value)\n    except BadSignature:\n        return []\n    trusts = [IssuedTrust(fingerprint=entry[0], at=entry[1]) for entry in data]\n    now = time.time()\n    trusts = list(\n        filter(\n            lambda t: t.at + app_settings.TRUST_COOKIE_AGE.total_seconds() > now, trusts\n        )\n    )\n    return trusts\n\n\ndef encode_trust_cookie(trusts: list[IssuedTrust]) -> str:\n    signer = Signer()\n    return signer.sign_object([(it.fingerprint, it.at) for it in trusts])\n\n\ndef trust_browser(\n    request: HttpRequest, user: AbstractBaseUser, response: HttpResponse\n) -> None:\n    fingerprint = create_config_fingerprint(user)\n    trusts = decode_trust_cookie(request)\n    trusts.append(IssuedTrust(fingerprint=fingerprint, at=int(time.time())))\n    response.set_cookie(\n        app_settings.TRUST_COOKIE_NAME,\n        encode_trust_cookie(trusts),\n        max_age=app_settings.TRUST_COOKIE_AGE,\n        path=app_settings.TRUST_COOKIE_PATH,\n        domain=app_settings.TRUST_COOKIE_DOMAIN,\n        secure=app_settings.TRUST_COOKIE_SECURE,\n        httponly=app_settings.TRUST_COOKIE_HTTPONLY,\n        samesite=app_settings.TRUST_COOKIE_SAMESITE,\n    )\n\n\ndef is_trusted_browser(request: HttpRequest, user: AbstractBaseUser) -> bool:\n    if not app_settings._TRUST_STAGE_ENABLED:\n        return False\n    trusts = decode_trust_cookie(request)\n    fingerprint = create_config_fingerprint(user)\n    return any([t.fingerprint == fingerprint for t in trusts])\n"
  },
  {
    "path": "allauth/mfa/migrations/0001_initial.py",
    "content": "# Generated by Django 3.2.20 on 2023-08-19 14:43\n\nimport django.db.models.deletion\nfrom django.conf import settings\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n    initial = True\n\n    dependencies = [\n        migrations.swappable_dependency(settings.AUTH_USER_MODEL),\n    ]\n\n    operations = [\n        migrations.CreateModel(\n            name=\"Authenticator\",\n            fields=[\n                (\n                    \"id\",\n                    models.BigAutoField(\n                        auto_created=True,\n                        primary_key=True,\n                        serialize=False,\n                        verbose_name=\"ID\",\n                    ),\n                ),\n                (\n                    \"type\",\n                    models.CharField(\n                        choices=[\n                            (\"recovery_codes\", \"Recovery codes\"),\n                            (\"totp\", \"TOTP Authenticator\"),\n                        ],\n                        max_length=20,\n                    ),\n                ),\n                (\"data\", models.JSONField()),\n                (\n                    \"user\",\n                    models.ForeignKey(\n                        on_delete=django.db.models.deletion.CASCADE,\n                        to=settings.AUTH_USER_MODEL,\n                    ),\n                ),\n            ],\n            options={\n                \"unique_together\": {(\"user\", \"type\")},\n            },\n        ),\n    ]\n"
  },
  {
    "path": "allauth/mfa/migrations/0002_authenticator_timestamps.py",
    "content": "# Generated by Django 3.2.22 on 2023-11-06 12:04\n\nimport django.utils.timezone\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        (\"mfa\", \"0001_initial\"),\n    ]\n\n    operations = [\n        migrations.AddField(\n            model_name=\"authenticator\",\n            name=\"created_at\",\n            field=models.DateTimeField(default=django.utils.timezone.now),\n        ),\n        migrations.AddField(\n            model_name=\"authenticator\",\n            name=\"last_used_at\",\n            field=models.DateTimeField(null=True),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/mfa/migrations/0003_authenticator_type_uniq.py",
    "content": "# Generated by Django 3.2.20 on 2023-09-27 11:59\n\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        (\"mfa\", \"0002_authenticator_timestamps\"),\n    ]\n\n    operations = [\n        migrations.AlterField(\n            model_name=\"authenticator\",\n            name=\"type\",\n            field=models.CharField(\n                choices=[\n                    (\"recovery_codes\", \"Recovery codes\"),\n                    (\"totp\", \"TOTP Authenticator\"),\n                    (\"webauthn\", \"WebAuthn\"),\n                ],\n                max_length=20,\n            ),\n        ),\n        migrations.AlterUniqueTogether(\n            name=\"authenticator\",\n            unique_together=set(),\n        ),\n        migrations.AddConstraint(\n            model_name=\"authenticator\",\n            constraint=models.UniqueConstraint(\n                condition=models.Q((\"type__in\", (\"totp\", \"recovery_codes\"))),\n                fields=(\"user\", \"type\"),\n                name=\"unique_authenticator_type\",\n            ),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/mfa/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/mfa/models.py",
    "content": "from django.conf import settings\nfrom django.core.exceptions import ImproperlyConfigured\nfrom django.db import models\nfrom django.db.models import Q\nfrom django.db.models.constraints import UniqueConstraint\nfrom django.utils import timezone\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth import app_settings as allauth_settings\n\n\nif not allauth_settings.MFA_ENABLED:\n    raise ImproperlyConfigured(\n        \"allauth.mfa not installed, yet its models are imported.\"\n    )\n\n\nclass AuthenticatorManager(models.Manager):\n    pass\n\n\nclass Authenticator(models.Model):\n    class Type(models.TextChoices):\n        RECOVERY_CODES = \"recovery_codes\", _(\"Recovery codes\")\n        TOTP = \"totp\", _(\"TOTP Authenticator\")\n        WEBAUTHN = \"webauthn\", _(\"WebAuthn\")\n\n    objects = AuthenticatorManager()\n\n    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)\n    type = models.CharField(max_length=20, choices=Type.choices)\n    data = models.JSONField()\n    created_at = models.DateTimeField(default=timezone.now)\n    last_used_at = models.DateTimeField(null=True)\n\n    class Meta:\n        constraints = [\n            UniqueConstraint(\n                fields=[\"user\", \"type\"],\n                name=\"unique_authenticator_type\",\n                condition=Q(\n                    type__in=(\n                        \"totp\",\n                        \"recovery_codes\",\n                    )\n                ),\n            )\n        ]\n\n    def __str__(self) -> str:\n        if self.type == self.Type.WEBAUTHN:\n            return self.wrap().name\n        return self.get_type_display()\n\n    def wrap(self):\n        from allauth.mfa.recovery_codes.internal.auth import RecoveryCodes\n        from allauth.mfa.totp.internal.auth import TOTP\n        from allauth.mfa.webauthn.internal.auth import WebAuthn\n\n        return {\n            self.Type.TOTP: TOTP,\n            self.Type.RECOVERY_CODES: RecoveryCodes,\n            self.Type.WEBAUTHN: WebAuthn,\n        }[self.type](self)\n\n    def record_usage(self) -> None:\n        self.last_used_at = timezone.now()\n        self.save(update_fields=[\"last_used_at\"])\n"
  },
  {
    "path": "allauth/mfa/recovery_codes/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/mfa/recovery_codes/forms.py",
    "content": "from django import forms\n\nfrom allauth.mfa.adapter import get_adapter\nfrom allauth.mfa.recovery_codes.internal import flows\n\n\nclass GenerateRecoveryCodesForm(forms.Form):\n    def __init__(self, *args, **kwargs) -> None:\n        self.user = kwargs.pop(\"user\")\n        super().__init__(*args, **kwargs)\n\n    def clean(self):\n        cleaned_data = super().clean()\n        if not flows.can_generate_recovery_codes(self.user):\n            raise get_adapter().validation_error(\"cannot_generate_recovery_codes\")\n        return cleaned_data\n"
  },
  {
    "path": "allauth/mfa/recovery_codes/internal/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/mfa/recovery_codes/internal/auth.py",
    "content": "import hmac\nimport secrets\nfrom hashlib import sha1\n\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.models import Authenticator\nfrom allauth.mfa.utils import decrypt, encrypt\n\n\nclass RecoveryCodes:\n    def __init__(self, instance: Authenticator) -> None:\n        self.instance = instance\n\n    @classmethod\n    def activate(cls, user) -> \"RecoveryCodes\":\n        instance = Authenticator.objects.filter(\n            user=user, type=Authenticator.Type.RECOVERY_CODES\n        ).first()\n        if instance:\n            return cls(instance)\n        instance = Authenticator(\n            user=user,\n            type=Authenticator.Type.RECOVERY_CODES,\n            data={\n                \"seed\": encrypt(cls.generate_seed()),\n                \"used_mask\": 0,\n            },\n        )\n        instance.save()\n        return cls(instance)\n\n    @classmethod\n    def generate_seed(self) -> str:\n        key = secrets.token_hex(40)\n        return key\n\n    def _get_migrated_codes(self) -> list[str] | None:\n        codes = self.instance.data.get(\"migrated_codes\")\n        if codes is not None:\n            return [decrypt(code) for code in codes]\n        return None\n\n    def generate_codes(self) -> list[str]:\n        migrated_codes = self._get_migrated_codes()\n        if migrated_codes is not None:\n            return migrated_codes\n\n        ret = []\n        seed = decrypt(self.instance.data[\"seed\"])\n        h = hmac.new(key=seed.encode(\"ascii\"), msg=None, digestmod=sha1)\n        byte_count = min(app_settings.RECOVERY_CODE_DIGITS // 2, h.digest_size)\n        for i in range(app_settings.RECOVERY_CODE_COUNT):\n            h.update((f\"{i:3},\").encode())\n            value = int.from_bytes(\n                h.digest()[:byte_count], byteorder=\"big\", signed=False\n            )\n            value %= 10**app_settings.RECOVERY_CODE_DIGITS\n            fmt_value = str(value).zfill(app_settings.RECOVERY_CODE_DIGITS)\n            ret.append(fmt_value)\n        return ret\n\n    def _is_code_used(self, i: int) -> bool:\n        used_mask = self.instance.data[\"used_mask\"]\n        return bool(used_mask & (1 << i))\n\n    def _mark_code_used(self, i: int) -> None:\n        used_mask = self.instance.data[\"used_mask\"]\n        used_mask |= 1 << i\n        self.instance.data[\"used_mask\"] = used_mask\n        self.instance.save()\n\n    def get_unused_codes(self) -> list[str]:\n        migrated_codes = self._get_migrated_codes()\n        if migrated_codes is not None:\n            return migrated_codes\n\n        ret = []\n        for i, code in enumerate(self.generate_codes()):\n            if self._is_code_used(i):\n                continue\n            ret.append(code)\n        return ret\n\n    def _validate_migrated_code(self, code: str) -> bool | None:\n        migrated_codes = self._get_migrated_codes()\n        if migrated_codes is None:\n            return None\n        try:\n            idx = migrated_codes.index(code)\n        except ValueError:\n            return False\n        else:\n            migrated_codes = self.instance.data[\"migrated_codes\"]\n            assert isinstance(migrated_codes, list)  # nosec\n            migrated_codes.pop(idx)\n            self.instance.data[\"migrated_codes\"] = migrated_codes\n            self.instance.save()\n            return True\n\n    def validate_code(self, code: str) -> bool:\n        ret = self._validate_migrated_code(code)\n        if ret is not None:\n            return ret\n\n        for i, c in enumerate(self.generate_codes()):\n            if self._is_code_used(i):\n                continue\n            if code == c:\n                self._mark_code_used(i)\n                return True\n        return False\n"
  },
  {
    "path": "allauth/mfa/recovery_codes/internal/flows.py",
    "content": "from django.contrib import messages\n\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.internal.flows.reauthentication import (\n    raise_if_reauthentication_required,\n)\nfrom allauth.mfa import app_settings, signals\nfrom allauth.mfa.models import Authenticator\nfrom allauth.mfa.recovery_codes.internal.auth import RecoveryCodes\n\n\ndef can_generate_recovery_codes(user) -> bool:\n    return (\n        Authenticator.objects.filter(user=user)\n        .exclude(type=Authenticator.Type.RECOVERY_CODES)\n        .exists()\n    )\n\n\ndef generate_recovery_codes(request) -> Authenticator:\n    raise_if_reauthentication_required(request)\n    Authenticator.objects.filter(\n        user=request.user, type=Authenticator.Type.RECOVERY_CODES\n    ).delete()\n    rc_auth = RecoveryCodes.activate(request.user)\n    authenticator = rc_auth.instance\n    adapter = get_account_adapter(request)\n    adapter.add_message(\n        request, messages.SUCCESS, \"mfa/messages/recovery_codes_generated.txt\"\n    )\n    signals.authenticator_reset.send(\n        sender=Authenticator,\n        request=request,\n        user=request.user,\n        authenticator=authenticator,\n    )\n    adapter.send_notification_mail(\"mfa/email/recovery_codes_generated\", request.user)\n    return authenticator\n\n\ndef view_recovery_codes(request) -> Authenticator | None:\n    authenticator = Authenticator.objects.filter(\n        user=request.user,\n        type=Authenticator.Type.RECOVERY_CODES,\n    ).first()\n    if not authenticator:\n        return None\n    raise_if_reauthentication_required(request)\n    return authenticator\n\n\ndef auto_generate_recovery_codes(request) -> Authenticator | None:\n    \"\"\"Automatically (implicitly) setup recovery codes when another\n    authenticator is setup for. As this is part of setting up another (primary)\n    authenticator, we do not send a notification email in this case.\n    \"\"\"\n    if Authenticator.Type.RECOVERY_CODES not in app_settings.SUPPORTED_TYPES:\n        return None\n    has_rc = Authenticator.objects.filter(\n        user=request.user, type=Authenticator.Type.RECOVERY_CODES\n    ).exists()\n    if has_rc:\n        return None\n    rc = RecoveryCodes.activate(request.user)\n    signals.authenticator_added.send(\n        sender=Authenticator,\n        request=request,\n        user=request.user,\n        authenticator=rc.instance,\n    )\n    adapter = get_account_adapter(request)\n    adapter.add_message(\n        request, messages.SUCCESS, \"mfa/messages/recovery_codes_generated.txt\"\n    )\n    return rc.instance\n"
  },
  {
    "path": "allauth/mfa/recovery_codes/urls.py",
    "content": "from django.urls import URLPattern, URLResolver, path\n\nfrom allauth.mfa.recovery_codes import views\n\n\nurlpatterns: list[URLPattern | URLResolver] = [\n    path(\"\", views.view_recovery_codes, name=\"mfa_view_recovery_codes\"),\n    path(\n        \"generate/\",\n        views.generate_recovery_codes,\n        name=\"mfa_generate_recovery_codes\",\n    ),\n    path(\n        \"download/\",\n        views.download_recovery_codes,\n        name=\"mfa_download_recovery_codes\",\n    ),\n]\n"
  },
  {
    "path": "allauth/mfa/recovery_codes/views.py",
    "content": "from django.contrib.auth.decorators import login_required\nfrom django.http import Http404, HttpResponse, HttpResponseBase\nfrom django.urls import reverse_lazy\nfrom django.utils.decorators import method_decorator\nfrom django.views.decorators.cache import never_cache\nfrom django.views.generic import TemplateView\nfrom django.views.generic.edit import FormView\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.decorators import reauthentication_required\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.models import Authenticator\nfrom allauth.mfa.recovery_codes.forms import GenerateRecoveryCodesForm\nfrom allauth.mfa.recovery_codes.internal import flows\nfrom allauth.utils import get_form_class\n\n\n@method_decorator(reauthentication_required, name=\"dispatch\")\nclass GenerateRecoveryCodesView(FormView):\n    form_class = GenerateRecoveryCodesForm\n    template_name = f\"mfa/recovery_codes/generate.{account_settings.TEMPLATE_EXTENSION}\"\n    success_url = reverse_lazy(\"mfa_view_recovery_codes\")\n\n    def form_valid(self, form) -> HttpResponse:\n        flows.generate_recovery_codes(self.request)\n        return super().form_valid(form)\n\n    def get_context_data(self, **kwargs):\n        ret = super().get_context_data(**kwargs)\n        unused_codes = []\n        authenticator = Authenticator.objects.filter(\n            user=self.request.user, type=Authenticator.Type.RECOVERY_CODES\n        ).first()\n        if authenticator:\n            unused_codes = authenticator.wrap().get_unused_codes()\n        ret[\"unused_code_count\"] = len(unused_codes)\n        return ret\n\n    def get_form_kwargs(self) -> dict:\n        ret = super().get_form_kwargs()\n        ret[\"user\"] = self.request.user\n        return ret\n\n    def get_form_class(self):\n        return get_form_class(\n            app_settings.FORMS, \"generate_recovery_codes\", self.form_class\n        )\n\n\ngenerate_recovery_codes = GenerateRecoveryCodesView.as_view()\n\n\n@method_decorator(login_required, name=\"dispatch\")\n@method_decorator(never_cache, name=\"dispatch\")\nclass DownloadRecoveryCodesView(TemplateView):\n    template_name = \"mfa/recovery_codes/download.txt\"\n    content_type = \"text/plain\"\n\n    def dispatch(self, request, *args, **kwargs) -> HttpResponseBase:\n        self.authenticator = flows.view_recovery_codes(self.request)\n        if not self.authenticator:\n            raise Http404()\n        self.unused_codes = self.authenticator.wrap().get_unused_codes()\n        if not self.unused_codes:\n            raise Http404()\n        return super().dispatch(request, *args, **kwargs)\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        ret[\"unused_codes\"] = self.unused_codes\n        return ret\n\n    def render_to_response(self, context, **response_kwargs):\n        response = super().render_to_response(context, **response_kwargs)\n        response[\"Content-Disposition\"] = 'attachment; filename=\"recovery-codes.txt\"'\n        return response\n\n\ndownload_recovery_codes = DownloadRecoveryCodesView.as_view()\n\n\n@method_decorator(login_required, name=\"dispatch\")\nclass ViewRecoveryCodesView(TemplateView):\n    template_name = f\"mfa/recovery_codes/index.{account_settings.TEMPLATE_EXTENSION}\"\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        authenticator = flows.view_recovery_codes(self.request)\n        if not authenticator:\n            raise Http404()\n        ret.update(\n            {\n                \"unused_codes\": authenticator.wrap().get_unused_codes(),\n                \"total_count\": app_settings.RECOVERY_CODE_COUNT,\n            }\n        )\n        return ret\n\n\nview_recovery_codes = ViewRecoveryCodesView.as_view()\n"
  },
  {
    "path": "allauth/mfa/signals.py",
    "content": "from django.dispatch import Signal\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.adapter import get_adapter\nfrom allauth.mfa.utils import is_mfa_enabled\n\n\n# Emitted when an authenticator is added.\n# Arguments: request, user, authenticator\nauthenticator_added = Signal()\n\n# Emitted when an authenticator is removed.\n# Arguments: request, user, authenticator\nauthenticator_removed = Signal()\n\n# Emitted when an authenticator is reset (e.g. recovery codes regenerated).\n# Arguments: request, user, authenticator\nauthenticator_reset = Signal()\n\n\ndef on_add_email(sender, email, user, **kwargs):\n    if app_settings.ALLOW_UNVERIFIED_EMAIL:\n        return\n    if account_settings.EMAIL_VERIFICATION_BY_CODE_ENABLED:\n        return\n    if is_mfa_enabled(user):\n        adapter = get_adapter()\n        raise adapter.validation_error(\"add_email_blocked\")\n"
  },
  {
    "path": "allauth/mfa/stages.py",
    "content": "from allauth.account import app_settings as account_settings\nfrom allauth.account.internal.constants import LoginStageKey as AccountLoginStageKey\nfrom allauth.account.stages import LoginStage\nfrom allauth.core.internal.httpkit import headed_redirect_response, is_headless_request\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.internal.constants import LoginStageKey\nfrom allauth.mfa.internal.flows import trust\nfrom allauth.mfa.models import Authenticator\nfrom allauth.mfa.utils import is_mfa_enabled\nfrom allauth.mfa.webauthn.internal.flows import did_use_passwordless_login\n\n\nclass AuthenticateStage(LoginStage):\n    key = LoginStageKey.MFA_AUTHENTICATE.value\n    urlname = \"mfa_authenticate\"\n\n    def handle(self):\n        response, cont = None, True\n        if self._should_handle(self.request):\n            self.state[\"authentication_required\"] = True\n            response = headed_redirect_response(\"mfa_authenticate\")\n        return response, cont\n\n    def _should_handle(self, request) -> bool:\n        if self.login.user is None:\n            return False\n        if not is_mfa_enabled(\n            self.login.user, [Authenticator.Type.TOTP, Authenticator.Type.WEBAUTHN]\n        ):\n            return False\n        if did_use_passwordless_login(request):\n            return False\n        if trust.is_trusted_browser(request, self.login.user):\n            return False\n        return True\n\n\nclass TrustStage(LoginStage):\n    key = LoginStageKey.MFA_TRUST.value\n    urlname = \"mfa_trust\"\n\n    def handle(self):\n        lbc_stage = self.controller.get_stage(AccountLoginStageKey.LOGIN_BY_CODE)\n        auth_stage = self.controller.get_stage(AuthenticateStage.key)\n\n        if (\n            not app_settings.TRUST_ENABLED\n            or not auth_stage\n            or not auth_stage.state.get(\"authentication_required\")\n        ) and (\n            not account_settings.LOGIN_BY_CODE_TRUST_ENABLED\n            or not lbc_stage\n            or not lbc_stage.state.get(\"login_by_code_required\")\n        ):\n            return None, True\n        client = is_headless_request(self.request)\n        if client and client == \"app\":\n            # Trust-this-browser relies on cookies.\n            return None, True\n        response = headed_redirect_response(\"mfa_trust\")\n        return response, True\n"
  },
  {
    "path": "allauth/mfa/static/mfa/js/webauthn-json.js",
    "content": "// https://github.com/github/webauthn-json\n'use strict';\n(() => {\n  const __defProp = Object.defineProperty\n  const __export = (target, all) => {\n    for (const name in all) { __defProp(target, name, { get: all[name], enumerable: true }) }\n  }\n  const __async = (__this, __arguments, generator) => {\n    return new Promise((resolve, reject) => {\n      const fulfilled = (value) => {\n        try {\n          step(generator.next(value))\n        } catch (e) {\n          reject(e)\n        }\n      }\n      const rejected = (value) => {\n        try {\n          step(generator.throw(value))\n        } catch (e) {\n          reject(e)\n        }\n      }\n      var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected)\n      step((generator = generator.apply(__this, __arguments)).next())\n    })\n  }\n\n  // src/webauthn-json/index.ts\n  const webauthn_json_exports = {}\n  __export(webauthn_json_exports, {\n    create: () => create,\n    get: () => get,\n    schema: () => schema,\n    supported: () => supported\n  })\n\n  // src/webauthn-json/base64url.ts\n  function base64urlToBuffer (baseurl64String) {\n    const padding = '=='.slice(0, (4 - baseurl64String.length % 4) % 4)\n    const base64String = baseurl64String.replace(/-/g, '+').replace(/_/g, '/') + padding\n    const str = atob(base64String)\n    const buffer = new ArrayBuffer(str.length)\n    const byteView = new Uint8Array(buffer)\n    for (let i = 0; i < str.length; i++) {\n      byteView[i] = str.charCodeAt(i)\n    }\n    return buffer\n  }\n  function bufferToBase64url (buffer) {\n    const byteView = new Uint8Array(buffer)\n    let str = ''\n    for (const charCode of byteView) {\n      str += String.fromCharCode(charCode)\n    }\n    const base64String = btoa(str)\n    const base64urlString = base64String.replace(/\\+/g, '-').replace(\n      /\\//g,\n      '_'\n    ).replace(/=/g, '')\n    return base64urlString\n  }\n\n  // src/webauthn-json/convert.ts\n  const copyValue = 'copy'\n  const convertValue = 'convert'\n  function convert (conversionFn, schema2, input) {\n    if (schema2 === copyValue) {\n      return input\n    }\n    if (schema2 === convertValue) {\n      return conversionFn(input)\n    }\n    if (schema2 instanceof Array) {\n      return input.map((v) => convert(conversionFn, schema2[0], v))\n    }\n    if (schema2 instanceof Object) {\n      const output = {}\n      for (const [key, schemaField] of Object.entries(schema2)) {\n        if (schemaField.derive) {\n          const v = schemaField.derive(input)\n          if (v !== void 0) {\n            input[key] = v\n          }\n        }\n        if (!(key in input)) {\n          if (schemaField.required) {\n            throw new Error(`Missing key: ${key}`)\n          }\n          continue\n        }\n        if (input[key] == null) {\n          output[key] = null\n          continue\n        }\n        output[key] = convert(\n          conversionFn,\n          schemaField.schema,\n          input[key]\n        )\n      }\n      return output\n    }\n  }\n  function derived (schema2, derive) {\n    return {\n      required: true,\n      schema: schema2,\n      derive\n    }\n  }\n  function required (schema2) {\n    return {\n      required: true,\n      schema: schema2\n    }\n  }\n  function optional (schema2) {\n    return {\n      required: false,\n      schema: schema2\n    }\n  }\n\n  // src/webauthn-json/basic/schema.ts\n  const publicKeyCredentialDescriptorSchema = {\n    type: required(copyValue),\n    id: required(convertValue),\n    transports: optional(copyValue)\n  }\n  const simplifiedExtensionsSchema = {\n    appid: optional(copyValue),\n    appidExclude: optional(copyValue),\n    credProps: optional(copyValue)\n  }\n  const simplifiedClientExtensionResultsSchema = {\n    appid: optional(copyValue),\n    appidExclude: optional(copyValue),\n    credProps: optional(copyValue)\n  }\n  const credentialCreationOptions = {\n    publicKey: required({\n      rp: required(copyValue),\n      user: required({\n        id: required(convertValue),\n        name: required(copyValue),\n        displayName: required(copyValue)\n      }),\n      challenge: required(convertValue),\n      pubKeyCredParams: required(copyValue),\n      timeout: optional(copyValue),\n      excludeCredentials: optional([publicKeyCredentialDescriptorSchema]),\n      authenticatorSelection: optional(copyValue),\n      attestation: optional(copyValue),\n      extensions: optional(simplifiedExtensionsSchema)\n    }),\n    signal: optional(copyValue)\n  }\n  const publicKeyCredentialWithAttestation = {\n    type: required(copyValue),\n    id: required(copyValue),\n    rawId: required(convertValue),\n    authenticatorAttachment: optional(copyValue),\n    response: required({\n      clientDataJSON: required(convertValue),\n      attestationObject: required(convertValue),\n      transports: derived(\n        copyValue,\n        (response) => {\n          let _a\n          return ((_a = response.getTransports) == null ? void 0 : _a.call(response)) || []\n        }\n      )\n    }),\n    clientExtensionResults: derived(\n      simplifiedClientExtensionResultsSchema,\n      (pkc) => pkc.getClientExtensionResults()\n    )\n  }\n  const credentialRequestOptions = {\n    mediation: optional(copyValue),\n    publicKey: required({\n      challenge: required(convertValue),\n      timeout: optional(copyValue),\n      rpId: optional(copyValue),\n      allowCredentials: optional([publicKeyCredentialDescriptorSchema]),\n      userVerification: optional(copyValue),\n      extensions: optional(simplifiedExtensionsSchema)\n    }),\n    signal: optional(copyValue)\n  }\n  const publicKeyCredentialWithAssertion = {\n    type: required(copyValue),\n    id: required(copyValue),\n    rawId: required(convertValue),\n    authenticatorAttachment: optional(copyValue),\n    response: required({\n      clientDataJSON: required(convertValue),\n      authenticatorData: required(convertValue),\n      signature: required(convertValue),\n      userHandle: required(convertValue)\n    }),\n    clientExtensionResults: derived(\n      simplifiedClientExtensionResultsSchema,\n      (pkc) => pkc.getClientExtensionResults()\n    )\n  }\n  var schema = {\n    credentialCreationOptions,\n    publicKeyCredentialWithAttestation,\n    credentialRequestOptions,\n    publicKeyCredentialWithAssertion\n  }\n\n  // src/webauthn-json/basic/api.ts\n  function createRequestFromJSON (requestJSON) {\n    return convert(base64urlToBuffer, credentialCreationOptions, requestJSON)\n  }\n  function createResponseToJSON (credential) {\n    return convert(\n      bufferToBase64url,\n      publicKeyCredentialWithAttestation,\n      credential\n    )\n  }\n  function create (requestJSON) {\n    return __async(this, null, function * () {\n      const credential = yield navigator.credentials.create(\n        createRequestFromJSON(requestJSON)\n      )\n      return createResponseToJSON(credential)\n    })\n  }\n  function getRequestFromJSON (requestJSON) {\n    return convert(base64urlToBuffer, credentialRequestOptions, requestJSON)\n  }\n  function getResponseToJSON (credential) {\n    return convert(\n      bufferToBase64url,\n      publicKeyCredentialWithAssertion,\n      credential\n    )\n  }\n  function get (requestJSON) {\n    return __async(this, null, function * () {\n      const credential = yield navigator.credentials.get(\n        getRequestFromJSON(requestJSON)\n      )\n      return getResponseToJSON(credential)\n    })\n  }\n\n  // src/webauthn-json/basic/supported.ts\n  function supported () {\n    return !!(navigator.credentials && navigator.credentials.create && navigator.credentials.get && window.PublicKeyCredential)\n  }\n\n  // src/webauthn-json/browser-global.ts\n  globalThis.webauthnJSON = webauthn_json_exports\n})()\n// # sourceMappingURL=webauthn-json.browser-global.js.map\n"
  },
  {
    "path": "allauth/mfa/static/mfa/js/webauthn.js",
    "content": "(function () {\n  const allauth = window.allauth = window.allauth || {}\n  const webauthnJSON = window.webauthnJSON\n\n  function dispatchError (exception) {\n    const event = new CustomEvent('allauth.error', { detail: { tags: ['mfa', 'webauthn'], exception }, cancelable: true })\n    document.dispatchEvent(event)\n    if (!event.defaultPrevented) {\n      console.error(exception)\n    }\n  }\n\n  async function createCredentials (credentials, passwordless) {\n    credentials = JSON.parse(JSON.stringify(credentials))\n    const sel = credentials.publicKey.authenticatorSelection\n    if (passwordless != null) {\n      sel.residentKey = passwordless ? 'required' : 'discouraged'\n      sel.requireResidentKey = passwordless\n      sel.userVerification = passwordless ? 'required' : 'discouraged'\n    }\n    return await webauthnJSON.create(credentials)\n  }\n\n  function signupForm (o) {\n    const signupBtn = document.getElementById(o.ids.signup)\n    return addOrSignupForm(o, signupBtn, null)\n  }\n\n  function addForm (o) {\n    const addBtn = document.getElementById(o.ids.add)\n    const passwordlessCb = o.ids.passwordless ? document.getElementById(o.ids.passwordless) : null\n    const passwordlessFn = () => passwordlessCb ? passwordlessCb.checked : false\n    return addOrSignupForm(o, addBtn, passwordlessFn)\n  }\n\n  function getData (o) {\n    if (typeof o.ids.data !== 'undefined') {\n      return JSON.parse(document.getElementById(o.ids.data).textContent)\n    }\n    return o.data\n  }\n\n  function addOrSignupForm (o, actionBtn, passwordlessFn) {\n    const credentialInput = document.getElementById(o.ids.credential)\n    const form = credentialInput.closest('form')\n    actionBtn.addEventListener('click', async function () {\n      const passwordless = passwordlessFn ? passwordlessFn() : undefined\n      try {\n        const credential = await createCredentials(getData(o).creation_options, passwordless)\n        credentialInput.value = JSON.stringify(credential)\n        form.submit()\n      } catch (e) {\n        dispatchError(e)\n      }\n    })\n  }\n\n  function loginForm (o) {\n    const loginBtn = document.getElementById(o.ids.login)\n    const form = loginBtn.form\n    const credentialInput = document.getElementById(o.ids.credential)\n    loginBtn.addEventListener('click', async function (e) {\n      e.preventDefault()\n      try {\n        const response = await fetch(form.action, {\n          method: 'GET',\n          headers: {\n            Accept: 'application/json'\n          }\n        })\n        if (!response.ok) {\n          throw new Error('Unable to fetch passkey data from server.')\n        }\n        const data = await response.json()\n        const credential = await webauthnJSON.get(data.request_options)\n        credentialInput.value = JSON.stringify(credential)\n        form.submit()\n      } catch (e) {\n        dispatchError(e)\n      }\n    })\n  }\n\n  function authenticateForm (o) {\n    const authenticateBtn = document.getElementById(o.ids.authenticate)\n    const credentialInput = document.getElementById(o.ids.credential)\n    const form = credentialInput.closest('form')\n    authenticateBtn.addEventListener('click', async function (e) {\n      e.preventDefault()\n      try {\n        const credential = await webauthnJSON.get(getData(o).request_options)\n        credentialInput.value = JSON.stringify(credential)\n        form.submit()\n      } catch (e) {\n        dispatchError(e)\n      }\n    })\n  }\n\n  allauth.webauthn = {\n    forms: {\n      addForm,\n      authenticateForm,\n      loginForm,\n      signupForm\n    }\n  }\n})()\n"
  },
  {
    "path": "allauth/mfa/totp/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/mfa/totp/forms.py",
    "content": "from django import forms\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth.mfa.adapter import get_adapter\nfrom allauth.mfa.internal.flows.add import validate_can_add_authenticator\nfrom allauth.mfa.totp.internal import auth\n\n\nclass ActivateTOTPForm(forms.Form):\n    code = forms.CharField(\n        label=_(\"Authenticator code\"),\n        widget=forms.TextInput(\n            attrs={\"placeholder\": _(\"Code\"), \"autocomplete\": \"one-time-code\"},\n        ),\n    )\n\n    def __init__(self, *args, **kwargs) -> None:\n        self.user = kwargs.pop(\"user\")\n        super().__init__(*args, **kwargs)\n        self.secret = auth.get_totp_secret(regenerate=not self.is_bound)\n\n    def clean_code(self) -> str:\n        validate_can_add_authenticator(self.user)\n        code = self.cleaned_data[\"code\"]\n        if not auth.validate_totp_code(self.secret, code):\n            raise get_adapter().validation_error(\"incorrect_code\")\n        return code\n\n\nclass DeactivateTOTPForm(forms.Form):\n    def __init__(self, *args, **kwargs) -> None:\n        self.authenticator = kwargs.pop(\"authenticator\")\n        super().__init__(*args, **kwargs)\n\n    def clean(self):\n        cleaned_data = super().clean()\n        adapter = get_adapter()\n        if not adapter.can_delete_authenticator(self.authenticator):\n            raise adapter.validation_error(\"cannot_delete_authenticator\")\n        return cleaned_data\n"
  },
  {
    "path": "allauth/mfa/totp/internal/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/mfa/totp/internal/auth.py",
    "content": "import base64\nimport hashlib\nimport hmac\nimport secrets\nimport struct\nimport time\nfrom collections.abc import Iterator\n\nfrom django.core.cache import cache\n\nfrom allauth.core import context\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.models import Authenticator\nfrom allauth.mfa.utils import decrypt, encrypt\n\n\nSECRET_SESSION_KEY = \"mfa.totp.secret\"  # nosec\n\n\ndef generate_totp_secret(length: int = 20) -> str:\n    random_bytes = secrets.token_bytes(length)\n    return base64.b32encode(random_bytes).decode(\"utf-8\")\n\n\ndef get_totp_secret(regenerate: bool = False) -> str:\n    secret = None\n    if not regenerate:\n        secret = context.request.session.get(SECRET_SESSION_KEY)\n    if not secret:\n        secret = context.request.session[SECRET_SESSION_KEY] = generate_totp_secret()\n    return secret\n\n\ndef yield_hotp_counters_from_time() -> Iterator[int]:\n    current_time = int(time.time())  # Get the current Unix timestamp\n    counter = current_time // app_settings.TOTP_PERIOD\n    for i in range(-app_settings.TOTP_TOLERANCE, app_settings.TOTP_TOLERANCE + 1):\n        yield counter + i\n\n\ndef hotp_value(secret: str, counter: int) -> int:\n    # Convert the counter to a byte array using big-endian encoding\n    counter_bytes = struct.pack(\">Q\", counter)\n    secret_enc = base64.b32decode(secret.encode(\"ascii\"), casefold=True)\n    # Calculate the HMAC-SHA1 hash using the secret and counter\n    hmac_result = hmac.new(secret_enc, counter_bytes, hashlib.sha1).digest()\n    # Get the last 4 bits of the HMAC result to determine the offset\n    offset = hmac_result[-1] & 0x0F\n    # Extract an 31-bit slice from the HMAC result starting at the offset + 1 bit\n    truncated_hash = bytearray(hmac_result[offset : offset + 4])\n    truncated_hash[0] = truncated_hash[0] & 0x7F\n    # Convert the truncated hash to an integer value\n    value = struct.unpack(\">I\", truncated_hash)[0]\n    # Apply modulo to get a value within the specified number of digits\n    value %= 10**app_settings.TOTP_DIGITS\n    return value\n\n\ndef format_hotp_value(value: int) -> str:\n    return f\"{value:0{app_settings.TOTP_DIGITS}}\"\n\n\ndef _is_insecure_bypass(code: str) -> bool:\n    return bool(code and app_settings.TOTP_INSECURE_BYPASS_CODE == code)\n\n\ndef validate_totp_code(secret: str, code: str) -> bool:\n    if _is_insecure_bypass(code):\n        return True\n    counters = yield_hotp_counters_from_time()\n    for counter in counters:\n        value = hotp_value(secret, counter)\n        if code == format_hotp_value(value):\n            return True\n    return False\n\n\nclass TOTP:\n    def __init__(self, instance: Authenticator) -> None:\n        self.instance = instance\n\n    @classmethod\n    def activate(cls, user, secret: str) -> \"TOTP\":\n        instance = Authenticator(\n            user=user, type=Authenticator.Type.TOTP, data={\"secret\": encrypt(secret)}\n        )\n        instance.save()\n        return cls(instance)\n\n    def validate_code(self, code: str) -> bool:\n        if _is_insecure_bypass(code):\n            return True\n        if self._is_code_used(code):\n            return False\n\n        secret = decrypt(self.instance.data[\"secret\"])\n        valid = validate_totp_code(secret, code)\n        if valid:\n            self._mark_code_used(code)\n        return valid\n\n    def _get_used_cache_key(self, code: str) -> str:\n        return f\"allauth.mfa.totp.used?user={self.instance.user_id}&code={code}\"\n\n    def _is_code_used(self, code: str) -> bool:\n        return cache.get(self._get_used_cache_key(code)) == \"y\"\n\n    def _mark_code_used(self, code: str) -> None:\n        cache.set(self._get_used_cache_key(code), \"y\", timeout=app_settings.TOTP_PERIOD)\n"
  },
  {
    "path": "allauth/mfa/totp/internal/flows.py",
    "content": "from django.contrib import messages\n\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.internal.flows.reauthentication import (\n    raise_if_reauthentication_required,\n)\nfrom allauth.mfa import signals\nfrom allauth.mfa.base.internal.flows import delete_and_cleanup\nfrom allauth.mfa.models import Authenticator\nfrom allauth.mfa.recovery_codes.internal.flows import auto_generate_recovery_codes\nfrom allauth.mfa.totp.internal.auth import TOTP\n\n\ndef activate_totp(request, form) -> tuple[Authenticator, Authenticator | None]:\n    raise_if_reauthentication_required(request)\n    totp_auth = TOTP.activate(request.user, form.secret).instance\n    signals.authenticator_added.send(\n        sender=Authenticator,\n        request=request,\n        user=request.user,\n        authenticator=totp_auth,\n    )\n    adapter = get_account_adapter(request)\n    adapter.add_message(request, messages.SUCCESS, \"mfa/messages/totp_activated.txt\")\n    adapter.send_notification_mail(\"mfa/email/totp_activated\", request.user)\n    rc_auth = auto_generate_recovery_codes(request)\n    return totp_auth, rc_auth\n\n\ndef deactivate_totp(request, authenticator: Authenticator) -> None:\n    raise_if_reauthentication_required(request)\n    delete_and_cleanup(request, authenticator)\n    adapter = get_account_adapter(request)\n    adapter.add_message(request, messages.SUCCESS, \"mfa/messages/totp_deactivated.txt\")\n    adapter.send_notification_mail(\"mfa/email/totp_deactivated\", request.user)\n"
  },
  {
    "path": "allauth/mfa/totp/urls.py",
    "content": "from django.urls import URLPattern, URLResolver, path\n\nfrom allauth.mfa.totp import views\n\n\nurlpatterns: list[URLPattern | URLResolver] = [\n    path(\"activate/\", views.activate_totp, name=\"mfa_activate_totp\"),\n    path(\"deactivate/\", views.deactivate_totp, name=\"mfa_deactivate_totp\"),\n]\n"
  },
  {
    "path": "allauth/mfa/totp/views.py",
    "content": "import base64\n\nfrom django.contrib.auth.decorators import login_required\nfrom django.http import HttpResponse, HttpResponseBase, HttpResponseRedirect\nfrom django.shortcuts import get_object_or_404\nfrom django.urls import reverse, reverse_lazy\nfrom django.utils.decorators import method_decorator\nfrom django.views.generic.edit import FormView\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.decorators import reauthentication_required\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.adapter import get_adapter\nfrom allauth.mfa.internal.flows.add import redirect_if_add_not_allowed\nfrom allauth.mfa.models import Authenticator\nfrom allauth.mfa.totp.forms import ActivateTOTPForm, DeactivateTOTPForm\nfrom allauth.mfa.totp.internal import flows\nfrom allauth.mfa.utils import is_mfa_enabled\nfrom allauth.utils import get_form_class\n\n\n@method_decorator(redirect_if_add_not_allowed, name=\"dispatch\")\n@method_decorator(reauthentication_required, name=\"dispatch\")\nclass ActivateTOTPView(FormView):\n    form_class = ActivateTOTPForm\n    template_name = f\"mfa/totp/activate_form.{account_settings.TEMPLATE_EXTENSION}\"\n\n    def dispatch(self, request, *args, **kwargs) -> HttpResponseBase:\n        if is_mfa_enabled(request.user, [Authenticator.Type.TOTP]):\n            return HttpResponseRedirect(reverse(\"mfa_deactivate_totp\"))\n        return super().dispatch(request, *args, **kwargs)\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        adapter = get_adapter()\n        totp_url = adapter.build_totp_url(\n            self.request.user,\n            ret[\"form\"].secret,\n        )\n        totp_svg = adapter.build_totp_svg(totp_url)\n        base64_data = base64.b64encode(totp_svg.encode(\"utf8\")).decode(\"utf-8\")\n        totp_data_uri = f\"data:image/svg+xml;base64,{base64_data}\"\n        ret.update(\n            {\n                \"totp_svg\": totp_svg,\n                \"totp_svg_data_uri\": totp_data_uri,\n                \"totp_url\": totp_url,\n            }\n        )\n        return ret\n\n    def get_form_kwargs(self) -> dict:\n        ret = super().get_form_kwargs()\n        ret[\"user\"] = self.request.user\n        return ret\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"activate_totp\", self.form_class)\n\n    def get_success_url(self) -> str:\n        if self.did_generate_recovery_codes:\n            return reverse(\"mfa_view_recovery_codes\")\n        return reverse(\"mfa_index\")\n\n    def form_valid(self, form) -> HttpResponse:\n        totp_auth, rc_auth = flows.activate_totp(self.request, form)\n        self.did_generate_recovery_codes = bool(rc_auth)\n        return super().form_valid(form)\n\n\nactivate_totp = ActivateTOTPView.as_view()\n\n\n@method_decorator(login_required, name=\"dispatch\")\nclass DeactivateTOTPView(FormView):\n    form_class = DeactivateTOTPForm\n    template_name = f\"mfa/totp/deactivate_form.{account_settings.TEMPLATE_EXTENSION}\"\n    success_url = reverse_lazy(\"mfa_index\")\n\n    def dispatch(self, request, *args, **kwargs) -> HttpResponseBase:\n        self.authenticator = get_object_or_404(\n            Authenticator,\n            user=self.request.user,\n            type=Authenticator.Type.TOTP,\n        )\n        if not is_mfa_enabled(request.user, [Authenticator.Type.TOTP]):\n            return HttpResponseRedirect(reverse(\"mfa_activate_totp\"))\n        return self._dispatch(request, *args, **kwargs)\n\n    @method_decorator(reauthentication_required)\n    def _dispatch(self, request, *args, **kwargs):\n        \"\"\"There's no point to reauthenticate when MFA is not enabled, so the\n        `is_mfa_enabled` check needs to go first, which is why we cannot slap a\n        `reauthentication_required` decorator on the `dispatch` directly.\n        \"\"\"\n        return super().dispatch(request, *args, **kwargs)\n\n    def get_form_kwargs(self) -> dict:\n        ret = super().get_form_kwargs()\n        ret[\"authenticator\"] = self.authenticator\n        # The deactivation form does not require input, yet, can generate\n        # validation errors in case deactivation is not allowed. We want to\n        # immediately present such errors even before the user actually posts\n        # the form, which is why we put an empty data payload in here.\n        ret.setdefault(\"data\", {})\n        return ret\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"deactivate_totp\", self.form_class)\n\n    def form_valid(self, form) -> HttpResponse:\n        flows.deactivate_totp(self.request, self.authenticator)\n        return super().form_valid(form)\n\n\ndeactivate_totp = DeactivateTOTPView.as_view()\n"
  },
  {
    "path": "allauth/mfa/urls.py",
    "content": "from django.urls import URLPattern, URLResolver, include, path\n\nfrom allauth.mfa import app_settings\n\n\nurlpatterns: list[URLPattern | URLResolver] = [\n    path(\"\", include(\"allauth.mfa.base.urls\"))\n]\n\nif \"totp\" in app_settings.SUPPORTED_TYPES:\n    urlpatterns.append(path(\"totp/\", include(\"allauth.mfa.totp.urls\")))\n\nif \"recovery_codes\" in app_settings.SUPPORTED_TYPES:\n    urlpatterns.append(\n        path(\"recovery-codes/\", include(\"allauth.mfa.recovery_codes.urls\"))\n    )\n\nif \"webauthn\" in app_settings.SUPPORTED_TYPES:\n    urlpatterns.append(path(\"webauthn/\", include(\"allauth.mfa.webauthn.urls\")))\n"
  },
  {
    "path": "allauth/mfa/utils.py",
    "content": "from allauth.mfa.adapter import get_adapter\n\n\ndef encrypt(text: str) -> str:\n    return get_adapter().encrypt(text)\n\n\ndef decrypt(encrypted_text: str) -> str:\n    return get_adapter().decrypt(encrypted_text)\n\n\ndef is_mfa_enabled(user, types=None) -> bool:\n    return get_adapter().is_mfa_enabled(user, types=types)\n"
  },
  {
    "path": "allauth/mfa/webauthn/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/mfa/webauthn/forms.py",
    "content": "from django import forms\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth.core import context\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.adapter import get_adapter\nfrom allauth.mfa.base.internal.flows import check_rate_limit, post_authentication\nfrom allauth.mfa.models import Authenticator\nfrom allauth.mfa.webauthn.internal import auth, flows\n\n\nclass _BaseAddWebAuthnForm(forms.Form):\n    name = forms.CharField(required=False)\n    credential = forms.JSONField(required=True, widget=forms.HiddenInput)\n\n    def __init__(self, *args, **kwargs) -> None:\n        self.user = kwargs.pop(\"user\")\n        initial = kwargs.setdefault(\"initial\", {})\n        initial.setdefault(\n            \"name\",\n            get_adapter().generate_authenticator_name(\n                self.user, Authenticator.Type.WEBAUTHN\n            ),\n        )\n        super().__init__(*args, **kwargs)\n\n    def clean_name(self) -> str:\n        \"\"\"\n        We don't want to make `name` a required field, as the WebAuthn\n        ceremony happens before posting the resulting credential, and we don't\n        want to reject a valid credential because of a missing name -- it might\n        be resident already. So, gracefully plug in a name.\n        \"\"\"\n        name = self.cleaned_data[\"name\"]\n        if not name:\n            name = get_adapter().generate_authenticator_name(\n                self.user, Authenticator.Type.WEBAUTHN\n            )\n        return name\n\n    def clean(self):\n        cleaned_data = super().clean()\n        credential = cleaned_data.get(\"credential\")\n        if credential:\n            # Explicitly parse JSON payload -- otherwise, register_complete()\n            # crashes with some random TypeError and we don't want to do\n            # Pokemon-style exception handling.\n            auth.parse_registration_response(credential)\n            auth.complete_registration(credential)\n        return cleaned_data\n\n\nclass AddWebAuthnForm(_BaseAddWebAuthnForm):\n    if app_settings.PASSKEY_LOGIN_ENABLED:\n        passwordless = forms.BooleanField(\n            label=_(\"Passwordless\"),\n            required=False,\n            help_text=_(\n                \"Enabling passwordless operation allows you to sign in using just this key, but imposes additional requirements such as biometrics or PIN protection.\"\n            ),\n        )\n\n\nclass SignupWebAuthnForm(_BaseAddWebAuthnForm):\n    pass\n\n\nclass AuthenticateWebAuthnForm(forms.Form):\n    credential = forms.JSONField(required=True, widget=forms.HiddenInput)\n    reauthenticated = False\n    passwordless = False\n\n    def __init__(self, *args, **kwargs) -> None:\n        self.user = kwargs.pop(\"user\")\n        super().__init__(*args, **kwargs)\n\n    def clean_credential(self) -> Authenticator:\n        credential = self.cleaned_data[\"credential\"]\n        # Explicitly parse JSON payload -- otherwise, authenticate_complete()\n        # crashes with some random TypeError and we don't want to do\n        # Pokemon-style exception handling.\n        auth.parse_authentication_response(credential)\n        user = self.user\n        if user is None:\n            user = auth.extract_user_from_response(credential)\n        clear_rl = check_rate_limit(user)\n        authenticator = auth.complete_authentication(user, credential)\n        clear_rl()\n        return authenticator\n\n    def save(self) -> None:\n        authenticator = self.cleaned_data[\"credential\"]\n        post_authentication(\n            context.request,\n            authenticator,\n            reauthenticated=self.reauthenticated,\n            passwordless=self.passwordless,\n        )\n\n\nclass LoginWebAuthnForm(AuthenticateWebAuthnForm):\n    reauthenticated = False\n    passwordless = True\n\n    def __init__(self, *args, **kwargs) -> None:\n        super().__init__(*args, user=None, **kwargs)\n\n\nclass ReauthenticateWebAuthnForm(AuthenticateWebAuthnForm):\n    reauthenticated = True\n    passwordless = False\n\n\nclass EditWebAuthnForm(forms.Form):\n    name = forms.CharField(required=True)\n\n    def __init__(self, *args, **kwargs) -> None:\n        self.instance = kwargs.pop(\"instance\")\n        initial = kwargs.setdefault(\"initial\", {})\n        initial.setdefault(\"name\", self.instance.wrap().name)\n        super().__init__(*args, **kwargs)\n\n    def save(self) -> Authenticator:\n        flows.rename_authenticator(\n            context.request, self.instance, self.cleaned_data[\"name\"]\n        )\n        return self.instance\n"
  },
  {
    "path": "allauth/mfa/webauthn/internal/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/mfa/webauthn/internal/auth.py",
    "content": "from typing import Any\n\nfrom django.contrib.auth import get_user_model\n\nimport fido2.features\nfrom fido2.server import Fido2Server\nfrom fido2.utils import websafe_decode\nfrom fido2.webauthn import (\n    AttestedCredentialData,\n    AuthenticationResponse,\n    AuthenticatorData,\n    PublicKeyCredentialRpEntity,\n    PublicKeyCredentialUserEntity,\n    RegistrationResponse,\n    ResidentKeyRequirement,\n    UserVerificationRequirement,\n)\n\nfrom allauth.account.utils import url_str_to_user_pk\nfrom allauth.core import context\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.adapter import get_adapter\nfrom allauth.mfa.models import Authenticator\n\n\ntry:\n    fido2.features.webauthn_json_mapping.enabled = True  # type:ignore[attr-defined]\nexcept AttributeError:\n    # https://github.com/Yubico/python-fido2/blob/main/doc/Migration_1-2.adoc\n    pass\n\nSTATE_SESSION_KEY = \"mfa.webauthn.state\"\nEXTENSIONS = {\"credProps\": True}\n\n\ndef build_user_payload(user) -> PublicKeyCredentialUserEntity:\n    kwargs = get_adapter().get_public_key_credential_user_entity(user)\n    return PublicKeyCredentialUserEntity(**kwargs)\n\n\ndef get_state() -> dict | None:\n    return context.request.session.get(STATE_SESSION_KEY)\n\n\ndef set_state(state: dict) -> None:\n    context.request.session[STATE_SESSION_KEY] = state\n\n\ndef clear_state() -> None:\n    context.request.session.pop(STATE_SESSION_KEY, None)\n\n\ndef get_server() -> Fido2Server:\n    rp_kwargs = get_adapter().get_public_key_credential_rp_entity()\n    rp = PublicKeyCredentialRpEntity(**rp_kwargs)\n    verify_origin = None\n    if app_settings.WEBAUTHN_ALLOW_INSECURE_ORIGIN:\n        verify_origin = lambda o: True  # noqa\n    server = Fido2Server(rp, verify_origin=verify_origin)\n    return server\n\n\ndef parse_registration_response(response: Any) -> RegistrationResponse:\n    try:\n        return RegistrationResponse.from_dict(response)\n    except TypeError:\n        raise get_adapter().validation_error(\"incorrect_code\")\n\n\ndef begin_registration(user, passwordless: bool) -> dict:\n    server = get_server()\n    credentials = get_credentials(user)\n    registration_data, state = server.register_begin(\n        user=build_user_payload(user),\n        credentials=credentials,\n        resident_key_requirement=(\n            ResidentKeyRequirement.REQUIRED\n            if passwordless\n            else ResidentKeyRequirement.DISCOURAGED\n        ),\n        user_verification=(\n            UserVerificationRequirement.REQUIRED\n            if passwordless\n            else UserVerificationRequirement.DISCOURAGED\n        ),\n        extensions=EXTENSIONS,\n    )\n    set_state(state)\n    return dict(registration_data)\n\n\ndef complete_registration(credential: dict) -> AuthenticatorData:\n    server = get_server()\n    state = get_state()\n    if not state:\n        raise get_adapter().validation_error(\"incorrect_code\")\n    try:\n        binding = server.register_complete(state, credential)\n    except ValueError:\n        # raise ValueError(\"Wrong challenge in response.\")\n        raise get_adapter().validation_error(\"incorrect_code\")\n    clear_state()\n    return binding\n\n\ndef get_credentials(user) -> list[AttestedCredentialData]:\n    credentials: list[AttestedCredentialData] = []\n    authenticators = Authenticator.objects.filter(\n        user=user, type=Authenticator.Type.WEBAUTHN\n    )\n    for authenticator in authenticators:\n        credential_data = authenticator.wrap().authenticator_data.credential_data\n        if credential_data:\n            credentials.append(authenticator.wrap().authenticator_data.credential_data)\n    return credentials\n\n\ndef get_authenticator_by_credential_id(\n    user, credential_id: bytes\n) -> Authenticator | None:\n    authenticators = Authenticator.objects.filter(\n        user=user, type=Authenticator.Type.WEBAUTHN\n    )\n    for authenticator in authenticators:\n        if (\n            credential_id\n            == authenticator.wrap().authenticator_data.credential_data.credential_id\n        ):\n            return authenticator\n    return None\n\n\ndef parse_authentication_response(response: Any) -> AuthenticationResponse:\n    try:\n        return AuthenticationResponse.from_dict(response)\n    except (TypeError, ValueError):\n        raise get_adapter().validation_error(\"incorrect_code\")\n\n\ndef begin_authentication(user=None) -> dict:\n    server = get_server()\n    request_options, state = server.authenticate_begin(\n        credentials=get_credentials(user) if user else [],\n        user_verification=UserVerificationRequirement.PREFERRED,\n    )\n    set_state(state)\n    return dict(request_options)\n\n\ndef extract_user_from_response(response: dict):\n    try:\n        user_handle = response.get(\"response\", {}).get(\"userHandle\")\n        user_pk = url_str_to_user_pk(websafe_decode(user_handle).decode(\"utf8\"))\n    except (ValueError, TypeError, KeyError):\n        raise get_adapter().validation_error(\"incorrect_code\")\n    user = get_user_model().objects.filter(pk=user_pk).first()\n    if not user:\n        raise get_adapter().validation_error(\"incorrect_code\")\n    return user\n\n\ndef complete_authentication(user, response: dict) -> Authenticator:\n    credentials = get_credentials(user)\n    server = get_server()\n    state = get_state()\n    if not state:\n        raise get_adapter().validation_error(\"incorrect_code\")\n    try:\n        binding = server.authenticate_complete(state, credentials, response)\n    except ValueError as e:\n        # ValueError: Unknown credential ID.\n        raise get_adapter().validation_error(\"incorrect_code\") from e\n    clear_state()\n    authenticator = get_authenticator_by_credential_id(user, binding.credential_id)\n    if not authenticator:\n        raise get_adapter().validation_error(\"incorrect_code\")\n    return authenticator\n\n\nclass WebAuthn:\n    def __init__(self, instance):\n        self.instance = instance\n\n    @classmethod\n    def add(cls, user, name: str, credential: dict) -> \"WebAuthn\":\n        instance = Authenticator(\n            user=user,\n            type=Authenticator.Type.WEBAUTHN,\n            data={\n                \"name\": name,\n                \"credential\": credential,\n            },\n        )\n        instance.save()\n        return cls(instance)\n\n    @property\n    def name(self) -> str:\n        return self.instance.data[\"name\"]\n\n    @name.setter\n    def name(self, name: str) -> None:\n        self.instance.data[\"name\"] = name\n\n    @property\n    def authenticator_data(self) -> AuthenticatorData:\n        return parse_registration_response(\n            self.instance.data[\"credential\"]\n        ).response.attestation_object.auth_data\n\n    @property\n    def is_passwordless(self) -> bool | None:\n        return (\n            self.instance.data.get(\"credential\", {})\n            .get(\"clientExtensionResults\", {})\n            .get(\"credProps\", {})\n            .get(\"rk\")\n        )\n"
  },
  {
    "path": "allauth/mfa/webauthn/internal/flows.py",
    "content": "from collections.abc import Iterable\n\nfrom django.contrib import messages\nfrom django.http import HttpRequest\n\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.authentication import get_authentication_records\nfrom allauth.account.internal import flows\nfrom allauth.account.internal.flows.reauthentication import (\n    raise_if_reauthentication_required,\n)\nfrom allauth.account.models import Login\nfrom allauth.mfa import signals\nfrom allauth.mfa.base.internal.flows import delete_and_cleanup, post_authentication\nfrom allauth.mfa.models import Authenticator\nfrom allauth.mfa.recovery_codes.internal.flows import auto_generate_recovery_codes\nfrom allauth.mfa.webauthn.internal import auth\n\n\ndef begin_registration(\n    request: HttpRequest, user, passwordless: bool, signup: bool = False\n) -> dict:\n    if not signup:\n        raise_if_reauthentication_required(request)\n    creation_options = auth.begin_registration(user, passwordless)\n    return creation_options\n\n\ndef signup_authenticator(request, user, name: str, credential: dict) -> Authenticator:\n    authenticator, rc_authenticator = _signup_or_add_authenticator(\n        request, user, name, credential, signup=True\n    )\n    return authenticator\n\n\ndef add_authenticator(\n    request, name: str, credential: dict\n) -> tuple[Authenticator, Authenticator | None]:\n    raise_if_reauthentication_required(request)\n    return _signup_or_add_authenticator(\n        request,\n        user=request.user,\n        name=name,\n        credential=credential,\n        signup=False,\n    )\n\n\ndef _signup_or_add_authenticator(\n    request,\n    user,\n    name: str,\n    credential: dict,\n    signup: bool = False,\n) -> tuple[Authenticator, Authenticator | None]:\n    authenticator = auth.WebAuthn.add(\n        user,\n        name,\n        credential,\n    ).instance\n    signals.authenticator_added.send(\n        sender=Authenticator,\n        request=request,\n        user=user,\n        authenticator=authenticator,\n    )\n    adapter = get_account_adapter(request)\n    adapter.add_message(request, messages.SUCCESS, \"mfa/messages/webauthn_added.txt\")\n    if not signup:\n        adapter.send_notification_mail(\"mfa/email/webauthn_added\", user)\n    rc_authenticator = None\n    if not signup:\n        rc_authenticator = auto_generate_recovery_codes(request)\n    return authenticator, rc_authenticator\n\n\ndef remove_authenticators(request, authenticators: Iterable[Authenticator]) -> None:\n    raise_if_reauthentication_required(request)\n    for authenticator in authenticators:\n        remove_authenticator(request, authenticator)\n\n\ndef remove_authenticator(request, authenticator: Authenticator) -> None:\n    raise_if_reauthentication_required(request)\n    delete_and_cleanup(request, authenticator)\n    adapter = get_account_adapter(request)\n    adapter.add_message(request, messages.SUCCESS, \"mfa/messages/webauthn_removed.txt\")\n    adapter.send_notification_mail(\"mfa/email/webauthn_removed\", request.user)\n\n\ndef perform_passwordless_login(request, authenticator: Authenticator, login: Login):\n    post_authentication(request, authenticator, passwordless=True)\n    return flows.login.perform_login(request, login)\n\n\ndef did_use_passwordless_login(request: HttpRequest) -> bool:\n    records = get_authentication_records(request)\n    return any(\n        (record.get(\"method\"), record.get(\"type\"), record.get(\"passwordless\"))\n        == (\"mfa\", \"webauthn\", True)\n        for record in records\n    )\n\n\ndef reauthenticate(request: HttpRequest, authenticator: Authenticator) -> None:\n    post_authentication(request, authenticator, reauthenticated=True)\n\n\ndef rename_authenticator(request, authenticator: Authenticator, name: str) -> None:\n    raise_if_reauthentication_required(request)\n    wrapper = authenticator.wrap()\n    wrapper.name = name\n    authenticator.save()\n"
  },
  {
    "path": "allauth/mfa/webauthn/stages.py",
    "content": "from allauth.account.stages import LoginStage\nfrom allauth.core.internal.httpkit import headed_redirect_response\nfrom allauth.mfa.internal.constants import LoginStageKey\n\n\nclass PasskeySignupStage(LoginStage):\n    key = LoginStageKey.MFA_SIGNUP_WEBAUTHN.value\n    urlname = \"mfa_signup_webauthn\"\n\n    def handle(self):\n        response, cont = None, True\n        if self.login.state.get(\"passkey_signup\"):\n            response = headed_redirect_response(\"mfa_signup_webauthn\")\n        return response, cont\n"
  },
  {
    "path": "allauth/mfa/webauthn/urls.py",
    "content": "from django.urls import URLPattern, URLResolver, include, path\n\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.webauthn import views\n\n\nurlpatterns: list[URLPattern | URLResolver] = [\n    path(\"\", views.list_webauthn, name=\"mfa_list_webauthn\"),\n    path(\"add/\", views.add_webauthn, name=\"mfa_add_webauthn\"),\n    path(\n        \"reauthenticate/\",\n        views.reauthenticate_webauthn,\n        name=\"mfa_reauthenticate_webauthn\",\n    ),\n    path(\n        \"keys/<int:pk>/\",\n        include(\n            [\n                path(\n                    \"remove/\",\n                    views.remove_webauthn,\n                    name=\"mfa_remove_webauthn\",\n                ),\n                path(\n                    \"edit/\",\n                    views.edit_webauthn,\n                    name=\"mfa_edit_webauthn\",\n                ),\n            ]\n        ),\n    ),\n]\n\nif app_settings.PASSKEY_LOGIN_ENABLED:\n    urlpatterns.append(path(\"login/\", views.login_webauthn, name=\"mfa_login_webauthn\"))\nif app_settings.PASSKEY_SIGNUP_ENABLED:\n    urlpatterns.append(\n        path(\"signup/\", views.signup_webauthn, name=\"mfa_signup_webauthn\")\n    )\n"
  },
  {
    "path": "allauth/mfa/webauthn/views.py",
    "content": "from django.contrib import messages\nfrom django.contrib.auth.decorators import login_required\nfrom django.http import HttpResponse, HttpResponseRedirect, JsonResponse\nfrom django.urls import reverse, reverse_lazy\nfrom django.utils.decorators import method_decorator\nfrom django.views.generic.edit import DeleteView, FormView, UpdateView\nfrom django.views.generic.list import ListView\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.decorators import reauthentication_required\nfrom allauth.account.internal.decorators import login_stage_required\nfrom allauth.account.mixins import NextRedirectMixin, RedirectAuthenticatedUserMixin\nfrom allauth.account.models import Login\nfrom allauth.account.views import BaseReauthenticateView\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.internal.flows.add import redirect_if_add_not_allowed\nfrom allauth.mfa.models import Authenticator\nfrom allauth.mfa.webauthn.forms import (\n    AddWebAuthnForm,\n    EditWebAuthnForm,\n    LoginWebAuthnForm,\n    ReauthenticateWebAuthnForm,\n    SignupWebAuthnForm,\n)\nfrom allauth.mfa.webauthn.internal import auth, flows\nfrom allauth.mfa.webauthn.stages import PasskeySignupStage\nfrom allauth.utils import get_form_class\n\n\n@method_decorator(redirect_if_add_not_allowed, name=\"dispatch\")\n@method_decorator(reauthentication_required, name=\"dispatch\")\nclass AddWebAuthnView(FormView):\n    form_class = AddWebAuthnForm\n    template_name = f\"mfa/webauthn/add_form.{account_settings.TEMPLATE_EXTENSION}\"\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data()\n        creation_options = auth.begin_registration(self.request.user, False)\n        ret[\"js_data\"] = {\"creation_options\": creation_options}\n        return ret\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"add_webauthn\", self.form_class)\n\n    def get_form_kwargs(self) -> dict:\n        ret = super().get_form_kwargs()\n        ret[\"user\"] = self.request.user\n        return ret\n\n    def get_success_url(self) -> str:\n        if self.did_generate_recovery_codes:\n            return reverse(\"mfa_view_recovery_codes\")\n        return reverse(\"mfa_index\")\n\n    def form_valid(self, form) -> HttpResponse:\n        auth, rc_auth = flows.add_authenticator(\n            self.request,\n            name=form.cleaned_data[\"name\"],\n            credential=form.cleaned_data[\"credential\"],\n        )\n        self.did_generate_recovery_codes = bool(rc_auth)\n        return super().form_valid(form)\n\n\nadd_webauthn = AddWebAuthnView.as_view()\n\n\n@method_decorator(login_required, name=\"dispatch\")\nclass ListWebAuthnView(ListView):\n    template_name = (\n        f\"mfa/webauthn/authenticator_list.{account_settings.TEMPLATE_EXTENSION}\"\n    )\n    context_object_name = \"authenticators\"\n\n    def get_queryset(self):\n        return Authenticator.objects.filter(\n            user=self.request.user, type=Authenticator.Type.WEBAUTHN\n        )\n\n\nlist_webauthn = ListWebAuthnView.as_view()\n\n\n@method_decorator(reauthentication_required, name=\"dispatch\")\nclass RemoveWebAuthnView(NextRedirectMixin, DeleteView):\n    object: Authenticator  # https://github.com/typeddjango/django-stubs/issues/1227\n    template_name = (\n        \"mfa/webauthn/authenticator_confirm_delete.\"\n        + account_settings.TEMPLATE_EXTENSION\n    )\n    success_url = reverse_lazy(\"mfa_list_webauthn\")\n\n    def get_queryset(self):\n        return Authenticator.objects.filter(\n            user=self.request.user, type=Authenticator.Type.WEBAUTHN\n        )\n\n    def form_valid(self, form) -> HttpResponse:\n        authenticator = self.get_object()\n        flows.remove_authenticator(self.request, authenticator)\n        return HttpResponseRedirect(self.get_success_url())\n\n\nremove_webauthn = RemoveWebAuthnView.as_view()\n\n\nclass LoginWebAuthnView(RedirectAuthenticatedUserMixin, FormView):\n    form_class = LoginWebAuthnForm\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        if get_account_adapter().is_ajax(request):\n            request_options = auth.begin_authentication(user=None)\n            data = {\"request_options\": request_options}\n            return JsonResponse(data)\n        return HttpResponseRedirect(reverse(\"account_login\"))\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"login_webauthn\", self.form_class)\n\n    def form_invalid(self, form) -> HttpResponse:\n        for message in form.errors.get(\"credential\", []):\n            get_account_adapter().add_message(\n                self.request, messages.ERROR, message=message\n            )\n        return HttpResponseRedirect(reverse(\"account_login\"))\n\n    def form_valid(self, form) -> HttpResponse:\n        authenticator = form.cleaned_data[\"credential\"]\n        redirect_url = None\n        login = Login(user=authenticator.user, redirect_url=redirect_url)\n        return flows.perform_passwordless_login(self.request, authenticator, login)\n\n\nlogin_webauthn = LoginWebAuthnView.as_view()\n\n\n@method_decorator(login_required, name=\"dispatch\")\nclass ReauthenticateWebAuthnView(BaseReauthenticateView):\n    form_class = ReauthenticateWebAuthnForm\n    template_name = f\"mfa/webauthn/reauthenticate.{account_settings.TEMPLATE_EXTENSION}\"\n\n    def get_form_class(self):\n        return get_form_class(\n            app_settings.FORMS, \"reauthenticate_webauthn\", self.form_class\n        )\n\n    def get_form_kwargs(self) -> dict:\n        ret = super().get_form_kwargs()\n        ret[\"user\"] = self.request.user\n        return ret\n\n    def form_invalid(self, form) -> HttpResponse:\n        for message in form.errors.get(\"credential\", []):\n            get_account_adapter().add_message(\n                self.request, messages.ERROR, message=message\n            )\n        return HttpResponseRedirect(reverse(\"account_login\"))\n\n    def form_valid(self, form) -> HttpResponse:\n        authenticator = form.cleaned_data[\"credential\"]\n        flows.reauthenticate(self.request, authenticator)\n        return super().form_valid(form)\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data()\n        request_options = auth.begin_authentication(self.request.user)\n        ret[\"js_data\"] = {\"request_options\": request_options}\n        return ret\n\n\nreauthenticate_webauthn = ReauthenticateWebAuthnView.as_view()\n\n\n@method_decorator(reauthentication_required, name=\"dispatch\")\nclass EditWebAuthnView(NextRedirectMixin, UpdateView):\n    form_class = EditWebAuthnForm\n    template_name = f\"mfa/webauthn/edit_form.{account_settings.TEMPLATE_EXTENSION}\"\n    success_url = reverse_lazy(\"mfa_list_webauthn\")\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"edit_webauthn\", self.form_class)\n\n    def get_queryset(self):\n        return Authenticator.objects.filter(\n            user=self.request.user, type=Authenticator.Type.WEBAUTHN\n        )\n\n\nedit_webauthn = EditWebAuthnView.as_view()\n\n\n@method_decorator(\n    login_stage_required(\n        stage=PasskeySignupStage.key, redirect_urlname=\"account_signup\"\n    ),\n    name=\"dispatch\",\n)\nclass SignupWebAuthnView(FormView):\n    form_class = SignupWebAuthnForm\n    template_name = f\"mfa/webauthn/signup_form.{account_settings.TEMPLATE_EXTENSION}\"\n\n    @property\n    def _login_stage(self):\n        return self.request._login_stage\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data()\n        stage = self._login_stage\n        creation_options = auth.begin_registration(stage.login.user, True)\n        ret[\"js_data\"] = {\"creation_options\": creation_options}\n        return ret\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"signup_webauthn\", self.form_class)\n\n    def get_form_kwargs(self) -> dict:\n        ret = super().get_form_kwargs()\n        stage = self._login_stage\n        ret[\"user\"] = stage.login.user\n        return ret\n\n    def form_valid(self, form) -> HttpResponse:\n        stage = self._login_stage\n        flows.signup_authenticator(\n            self.request,\n            user=stage.login.user,\n            name=form.cleaned_data[\"name\"],\n            credential=form.cleaned_data[\"credential\"],\n        )\n        return stage.exit()\n\n\nsignup_webauthn = SignupWebAuthnView.as_view()\n"
  },
  {
    "path": "allauth/models.py",
    "content": ""
  },
  {
    "path": "allauth/ratelimit.py",
    "content": "import warnings\n\nfrom allauth.core.ratelimit import clear, consume, consume_or_429\n\n\n__all__ = [\"consume\", \"consume_or_429\", \"clear\"]\nwarnings.warn(\"allauth.ratelimit is deprecated, use allauth.core.ratelimit\")\n"
  },
  {
    "path": "allauth/socialaccount/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/adapter.py",
    "content": "import functools\nimport warnings\n\nfrom django.core.exceptions import ImproperlyConfigured, MultipleObjectsReturned\nfrom django.db.models import Q\nfrom django.urls import reverse\nfrom django.utils.crypto import get_random_string\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.internal.emailkit import valid_email_or_none\nfrom allauth.account.utils import user_email, user_field, user_username\nfrom allauth.core.internal.adapter import BaseAdapter\nfrom allauth.core.internal.modelkit import deserialize_instance, serialize_instance\nfrom allauth.utils import import_attribute\n\nfrom . import app_settings\n\n\nclass DefaultSocialAccountAdapter(BaseAdapter):\n    \"\"\"The adapter class allows you to override various functionality of the\n    ``allauth.socialaccount`` app.  To do so, point ``settings.SOCIALACCOUNT_ADAPTER`` to\n    your own class that derives from ``DefaultSocialAccountAdapter`` and override the\n    behavior by altering the implementation of the methods according to your own\n    needs.\n    \"\"\"\n\n    error_messages = {\n        \"email_taken\": _(\n            \"An account already exists with this email address.\"\n            \" Please sign in to that account first, then connect\"\n            \" your %s account.\"\n        ),\n        \"invalid_token\": _(\"Invalid token.\"),\n        \"no_password\": _(\"Your account has no password set up.\"),\n        \"no_verified_email\": _(\"Your account has no verified email address.\"),\n        \"disconnect_last\": _(\n            \"You cannot disconnect your last remaining third-party account.\"\n        ),\n        \"connected_other\": _(\n            \"The third-party account is already connected to a different account.\"\n        ),\n    }\n\n    def pre_social_login(self, request, sociallogin):\n        \"\"\"\n        Invoked just after a user successfully authenticates via a\n        social provider, but before the login is actually processed\n        (and before the pre_social_login signal is emitted).\n\n        You can use this hook to intervene, e.g. abort the login by\n        raising an ImmediateHttpResponse\n\n        Why both an adapter hook and the signal? Intervening in\n        e.g. the flow from within a signal handler is bad -- multiple\n        handlers may be active and are executed in undetermined order.\n        \"\"\"\n        pass\n\n    def on_authentication_error(\n        self,\n        request,\n        provider,\n        error=None,\n        exception=None,\n        extra_context=None,\n    ):\n        \"\"\"\n        Invoked when there is an error in the authentication cycle. In this\n        case, pre_social_login will not be reached.\n\n        You can use this hook to intervene, e.g. redirect to an\n        educational flow by raising an ImmediateHttpResponse.\n        \"\"\"\n        if hasattr(self, \"authentication_error\"):\n            warnings.warn(\n                \"adapter.authentication_error() is deprecated, use adapter.on_authentication_error()\"\n            )\n\n            self.authentication_error(\n                request,\n                provider.id,\n                error=error,\n                exception=exception,\n                extra_context=extra_context,\n            )\n\n    def new_user(self, request, sociallogin):\n        \"\"\"\n        Instantiates a new User instance.\n        \"\"\"\n        return get_account_adapter().new_user(request)\n\n    def save_user(self, request, sociallogin, form=None):\n        \"\"\"\n        Saves a newly signed up social login. In case of auto-signup,\n        the signup form is not available.\n        \"\"\"\n        u = sociallogin.user\n        u.set_unusable_password()\n        account_adapter = get_account_adapter()\n        if form:\n            account_adapter.save_user(request, u, form)\n        else:\n            account_adapter.populate_username(request, u)\n        sociallogin.save(request)\n        return u\n\n    def populate_user(self, request, sociallogin, data):\n        \"\"\"\n        Hook that can be used to further populate the user instance.\n\n        For convenience, we populate several common fields.\n\n        Note that the user instance being populated represents a\n        suggested User instance that represents the social user that is\n        in the process of being logged in.\n\n        The User instance need not be completely valid and conflict\n        free. For example, verifying whether or not the username\n        already exists, is not a responsibility.\n        \"\"\"\n        username = data.get(\"username\")\n        first_name = data.get(\"first_name\")\n        last_name = data.get(\"last_name\")\n        email = data.get(\"email\")\n        name = data.get(\"name\")\n        user = sociallogin.user\n        user_username(user, username or \"\")\n        user_email(user, valid_email_or_none(email) or \"\")\n        name_parts = (name or \"\").partition(\" \")\n        user_field(user, \"first_name\", first_name or name_parts[0])\n        user_field(user, \"last_name\", last_name or name_parts[2])\n        return user\n\n    def get_connect_redirect_url(self, request, socialaccount):\n        \"\"\"\n        Returns the default URL to redirect to after successfully\n        connecting a social account.\n        \"\"\"\n        url = reverse(\"socialaccount_connections\")\n        return url\n\n    def validate_disconnect(self, account, accounts) -> None:\n        \"\"\"\n        Validate whether or not the socialaccount account can be\n        safely disconnected.\n        \"\"\"\n        pass\n\n    def is_auto_signup_allowed(self, request, sociallogin):\n        # If email is specified, check for duplicate and if so, no auto signup.\n        auto_signup = app_settings.AUTO_SIGNUP\n        return auto_signup\n\n    def is_open_for_signup(self, request, sociallogin):\n        \"\"\"\n        Checks whether or not the site is open for signups.\n\n        Next to simply returning True/False you can also intervene the\n        regular flow by raising an ImmediateHttpResponse\n        \"\"\"\n        return get_account_adapter(request).is_open_for_signup(request)\n\n    def get_signup_form_initial_data(self, sociallogin):\n        user = sociallogin.user\n        email = user_email(user)\n        if not email and len(sociallogin.email_addresses) > 0:\n            email = sociallogin.email_addresses[0].email\n        initial = {\n            \"email\": email or \"\",\n            \"username\": user_username(user) or \"\",\n            \"first_name\": user_field(user, \"first_name\") or \"\",\n            \"last_name\": user_field(user, \"last_name\") or \"\",\n        }\n        return initial\n\n    def deserialize_instance(self, model, data):\n        return deserialize_instance(model, data)\n\n    def serialize_instance(self, instance):\n        return serialize_instance(instance)\n\n    def list_providers(self, request):\n        from allauth.socialaccount.providers import registry\n\n        ret = []\n        provider_classes = registry.get_class_list()\n        apps = self.list_apps(request)\n        apps_map = {}\n        for app in apps:\n            apps_map.setdefault(app.provider, []).append(app)\n        for provider_class in provider_classes:\n            provider_apps = apps_map.get(provider_class.id, [])\n            if not provider_apps:\n                if provider_class.uses_apps:\n                    continue\n                provider_apps = [None]\n            for app in provider_apps:\n                provider = provider_class(request=request, app=app)\n                ret.append(provider)\n        return ret\n\n    def get_provider(self, request, provider, client_id=None):\n        \"\"\"Looks up a `provider`, supporting subproviders by looking up by\n        `provider_id`.\n        \"\"\"\n        from allauth.socialaccount.providers import registry\n\n        provider_class = registry.get_class(provider)\n        if provider_class is None or provider_class.uses_apps:\n            app = self.get_app(request, provider=provider, client_id=client_id)\n            if not provider_class:\n                # In this case, the `provider` argument passed was a\n                # `provider_id`.\n                provider_class = registry.get_class(app.provider)\n            if not provider_class:\n                raise ImproperlyConfigured(f\"unknown provider: {app.provider}\")\n            return provider_class(request, app=app)\n        elif provider_class:\n            assert not provider_class.uses_apps  # nosec\n            return provider_class(request, app=None)\n        else:\n            raise ImproperlyConfigured(f\"unknown provider: {provider}\")\n\n    def list_apps(self, request, provider=None, client_id=None):\n        \"\"\"SocialApp's can be setup in the database, or, via\n        `settings.SOCIALACCOUNT_PROVIDERS`.  This methods returns a uniform list\n        of all known apps matching the specified criteria, and blends both\n        (db/settings) sources of data.\n        \"\"\"\n        # NOTE: Avoid loading models at top due to registry boot...\n        from allauth.socialaccount.models import SocialApp\n\n        # Map provider to the list of apps.\n        provider_to_apps = {}\n\n        # First, populate it with the DB backed apps.\n        if request:\n            db_apps = SocialApp.objects.on_site(request)\n        else:\n            db_apps = SocialApp.objects.all()\n        if provider:\n            db_apps = db_apps.filter(Q(provider=provider) | Q(provider_id=provider))\n        if client_id:\n            db_apps = db_apps.filter(client_id=client_id)\n        for app in db_apps:\n            apps = provider_to_apps.setdefault(app.provider, [])\n            apps.append(app)\n\n        # Then, extend it with the settings backed apps.\n        for p, pcfg in app_settings.PROVIDERS.items():\n            app_configs = pcfg.get(\"APPS\")\n            if app_configs is None:\n                app_config = pcfg.get(\"APP\")\n                if app_config is None:\n                    continue\n                app_configs = [app_config]\n\n            apps = provider_to_apps.setdefault(p, [])\n            for config in app_configs:\n                app = SocialApp(provider=p)\n                for field in [\n                    \"name\",\n                    \"provider_id\",\n                    \"client_id\",\n                    \"secret\",\n                    \"key\",\n                    \"settings\",\n                ]:\n                    if field in config:\n                        setattr(app, field, config[field])\n                if \"certificate_key\" in config:\n                    warnings.warn(\"'certificate_key' should be moved into app.settings\")\n                    app.settings[\"certificate_key\"] = config[\"certificate_key\"]\n                if client_id and app.client_id != client_id:\n                    continue\n                if (\n                    provider\n                    and app.provider_id != provider\n                    and app.provider != provider\n                ):\n                    continue\n                apps.append(app)\n\n        # Flatten the list of apps.\n        apps = []\n        for provider_apps in provider_to_apps.values():\n            apps.extend(provider_apps)\n        return apps\n\n    def get_app(self, request, provider, client_id=None):\n        from allauth.socialaccount.models import SocialApp\n\n        apps = self.list_apps(request, provider=provider, client_id=client_id)\n        if len(apps) > 1:\n            visible_apps = [app for app in apps if not app.settings.get(\"hidden\")]\n            if len(visible_apps) != 1:\n                raise MultipleObjectsReturned\n            apps = visible_apps\n        elif len(apps) == 0:\n            raise SocialApp.DoesNotExist()\n        return apps[0]\n\n    def send_notification_mail(self, *args, **kwargs):\n        return get_account_adapter().send_notification_mail(*args, **kwargs)\n\n    def get_requests_session(self):\n        import requests\n\n        session = requests.Session()\n        session.request = functools.partial(\n            session.request, timeout=app_settings.REQUESTS_TIMEOUT\n        )\n        return session\n\n    def is_email_verified(self, provider, email):\n        \"\"\"\n        Returns ``True`` iff the given email encountered during a social\n        login for the given provider is to be assumed verified.\n\n        This can be configured with a ``\"verified_email\"`` key in the provider\n        app settings, or a ``\"VERIFIED_EMAIL\"`` in the global provider settings\n        (``SOCIALACCOUNT_PROVIDERS``).  Both can be set to ``False`` or\n        ``True``, or, a list of domains to match email addresses against.\n        \"\"\"\n        verified_email = None\n        if provider.app:\n            verified_email = provider.app.settings.get(\"verified_email\")\n        if verified_email is None:\n            settings = provider.get_settings()\n            verified_email = settings.get(\"VERIFIED_EMAIL\", False)\n        if isinstance(verified_email, bool):\n            pass\n        elif isinstance(verified_email, list):\n            email_domain = email.partition(\"@\")[2].lower()\n            verified_domains = [d.lower() for d in verified_email]\n            verified_email = email_domain in verified_domains\n        else:\n            raise ImproperlyConfigured(\"verified_email wrongly configured\")\n        return verified_email\n\n    def can_authenticate_by_email(self, login, email):\n        \"\"\"\n        Returns ``True`` iff  authentication by email is active for this login/email.\n\n        This can be configured with a ``\"email_authentication\"`` key in the provider\n        app settings, or a ``\"VERIFIED_EMAIL\"`` in the global provider settings\n        (``SOCIALACCOUNT_PROVIDERS``).\n        \"\"\"\n        ret = None\n        provider = login.provider\n        if provider.app:\n            ret = provider.app.settings.get(\"email_authentication\")\n        if ret is None:\n            ret = app_settings.EMAIL_AUTHENTICATION or provider.get_settings().get(\n                \"EMAIL_AUTHENTICATION\", False\n            )\n        return ret\n\n    def generate_state_param(self, state: dict) -> str:\n        \"\"\"\n        To preserve certain state before the handshake with the provider\n        takes place, and be able to verify/use that state later on, a `state`\n        parameter is typically passed to the provider. By default, a random\n        string sufficies as the state parameter value is actually just a\n        reference/pointer to the actual state. You can use this adapter method\n        to alter the generation of the `state` parameter.\n        \"\"\"\n        from allauth.socialaccount.internal.statekit import STATE_ID_LENGTH\n\n        return get_random_string(STATE_ID_LENGTH)\n\n\ndef get_adapter(request=None):\n    return import_attribute(app_settings.ADAPTER)(request)\n"
  },
  {
    "path": "allauth/socialaccount/admin.py",
    "content": "from django import forms\nfrom django.contrib import admin\n\nfrom allauth import app_settings\nfrom allauth.account.adapter import get_adapter\nfrom allauth.socialaccount import providers\nfrom allauth.socialaccount.models import SocialAccount, SocialApp, SocialToken\n\n\nclass SocialAppForm(forms.ModelForm):\n    class Meta:\n        model = SocialApp\n        exclude: list[str] = []\n        widgets = {\n            \"client_id\": forms.TextInput(attrs={\"size\": \"100\"}),\n            \"key\": forms.TextInput(attrs={\"size\": \"100\"}),\n            \"secret\": forms.TextInput(attrs={\"size\": \"100\"}),\n        }\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.fields[\"provider\"] = forms.ChoiceField(\n            choices=providers.registry.as_choices()\n        )\n\n\nclass SocialAppAdmin(admin.ModelAdmin):\n    form = SocialAppForm\n    list_display = (\n        \"name\",\n        \"provider\",\n    )\n    filter_horizontal = (\"sites\",) if app_settings.SITES_ENABLED else ()\n\n\nclass SocialAccountAdmin(admin.ModelAdmin):\n    search_fields = [\"uid\"]\n    raw_id_fields = (\"user\",)\n    list_display = (\"user\", \"uid\", \"provider\")\n    list_filter = (\"provider\",)\n\n    def get_search_fields(self, request):\n        search_fields = super().get_search_fields(request)\n        user_search_fields = get_adapter().get_user_search_fields()\n        return search_fields + list(map(lambda a: f\"user__{a}\", user_search_fields))\n\n\nclass SocialTokenAdmin(admin.ModelAdmin):\n    raw_id_fields = (\n        \"app\",\n        \"account\",\n    )\n    list_display = (\"app\", \"account\", \"truncated_token\", \"expires_at\")\n    list_filter = (\"app\", \"app__provider\", \"expires_at\")\n\n    def truncated_token(self, token):\n        max_chars = 40\n        ret = token.token\n        if len(ret) > max_chars:\n            ret = f\"{ret[0:max_chars]}...(truncated)\"\n        return ret\n\n    truncated_token.short_description = \"Token\"  # type: ignore[attr-defined]\n\n\nadmin.site.register(SocialApp, SocialAppAdmin)\nadmin.site.register(SocialToken, SocialTokenAdmin)\nadmin.site.register(SocialAccount, SocialAccountAdmin)\n"
  },
  {
    "path": "allauth/socialaccount/app_settings.py",
    "content": "class AppSettings:\n    def __init__(self, prefix: str) -> None:\n        self.prefix = prefix\n\n    def _setting(self, name: str, dflt):\n        from allauth.utils import get_setting\n\n        return get_setting(self.prefix + name, dflt)\n\n    @property\n    def QUERY_EMAIL(self) -> bool:\n        \"\"\"\n        Request email address from 3rd party account provider?\n        E.g. using OpenID AX\n        \"\"\"\n        return self._setting(\"QUERY_EMAIL\", self.EMAIL_REQUIRED)\n\n    @property\n    def AUTO_SIGNUP(self) -> bool:\n        \"\"\"\n        Attempt to bypass the signup form by using fields (e.g. username,\n        email) retrieved from the social account provider. If a conflict\n        arises due to a duplicate email signup form will still kick in.\n        \"\"\"\n        return self._setting(\"AUTO_SIGNUP\", True)\n\n    @property\n    def PROVIDERS(self) -> dict:\n        \"\"\"\n        Provider specific settings\n        \"\"\"\n        ret = self._setting(\"PROVIDERS\", {})\n        oidc = ret.get(\"openid_connect\")\n        if oidc:\n            ret[\"openid_connect\"] = self._migrate_oidc(oidc)\n        return ret\n\n    def _migrate_oidc(self, oidc: dict) -> dict:\n        servers = oidc.get(\"SERVERS\")\n        if servers is None:\n            return oidc\n        ret = {}\n        apps = []\n        for server in servers:\n            app = dict(**server[\"APP\"])\n            app_settings = {}\n            if \"token_auth_method\" in server:\n                app_settings[\"token_auth_method\"] = server[\"token_auth_method\"]\n            app_settings[\"server_url\"] = server[\"server_url\"]\n            app.update(\n                {\n                    \"name\": server.get(\"name\", \"\"),\n                    \"provider_id\": server[\"id\"],\n                    \"settings\": app_settings,\n                }\n            )\n            assert app[\"provider_id\"]  # nosec\n            apps.append(app)\n        ret[\"APPS\"] = apps\n        return ret\n\n    @property\n    def EMAIL_REQUIRED(self) -> bool:\n        \"\"\"\n        The user is required to hand over an email address when signing up\n        \"\"\"\n        from allauth.account import app_settings as account_settings\n\n        fields = account_settings.SIGNUP_FIELDS\n        email_required = \"email\" in fields and fields[\"email\"].get(\"required\")\n        return self._setting(\"EMAIL_REQUIRED\", email_required)\n\n    @property\n    def EMAIL_VERIFICATION(self):\n        \"\"\"\n        See email verification method.  When `None`, the default\n        `allauth.account` logic kicks in.\n        \"\"\"\n        from allauth import app_settings as allauth_settings\n        from allauth.account import app_settings as account_settings\n\n        dflt = (\n            account_settings.EmailVerificationMethod.NONE\n            if allauth_settings.SOCIALACCOUNT_ONLY\n            else None\n        )\n        return self._setting(\"EMAIL_VERIFICATION\", dflt)\n\n    @property\n    def EMAIL_AUTHENTICATION(self) -> bool:\n        \"\"\"Consider a scenario where a social login occurs, and the social\n        account comes with a verified email address (verified by the account\n        provider), but that email address is already taken by a local user\n        account. Additionally, assume that the local user account does not have\n        any social account connected. Now, if the provider can be fully trusted,\n        you can argue that we should treat this scenario as a login to the\n        existing local user account even if the local account does not already\n        have the social account connected, because -- according to the provider\n        -- the user logging in has ownership of the email address.  This is how\n        this scenario is handled when `EMAIL_AUTHENTICATION` is set to\n        `True`. As this implies that an untrustworthy provider can login to any\n        local account by fabricating social account data, this setting defaults\n        to `False`. Only set it to `True` if you are using providers that can be\n        fully trusted.\n        \"\"\"\n        return self._setting(\"EMAIL_AUTHENTICATION\", False)\n\n    @property\n    def EMAIL_AUTHENTICATION_AUTO_CONNECT(self) -> bool:\n        \"\"\"In case email authentication is applied, this setting controls\n        whether or not the social account is automatically connected to the\n        local account. In case of ``False`` (the default) the local account\n        remains unchanged during the login. In case of ``True``, the social\n        account for which the email matched, is automatically added to the list\n        of social accounts connected to the local account. As a result, even if\n        the user were to change the email address afterwards, social login\n        would still be possible when using ``True``, but not in case of\n        ``False``.\n        \"\"\"\n        return self._setting(\"EMAIL_AUTHENTICATION_AUTO_CONNECT\", False)\n\n    @property\n    def ADAPTER(self) -> str:\n        return self._setting(\n            \"ADAPTER\",\n            \"allauth.socialaccount.adapter.DefaultSocialAccountAdapter\",\n        )\n\n    @property\n    def FORMS(self) -> dict:\n        return self._setting(\"FORMS\", {})\n\n    @property\n    def LOGIN_ON_GET(self) -> bool:\n        return self._setting(\"LOGIN_ON_GET\", False)\n\n    @property\n    def STORE_TOKENS(self) -> bool:\n        return self._setting(\"STORE_TOKENS\", False)\n\n    @property\n    def UID_MAX_LENGTH(self) -> int:\n        return 191\n\n    @property\n    def SOCIALACCOUNT_STR(self):\n        return self._setting(\"SOCIALACCOUNT_STR\", None)\n\n    @property\n    def REQUESTS_TIMEOUT(self) -> int:\n        return self._setting(\"REQUESTS_TIMEOUT\", 5)\n\n    @property\n    def OPENID_CONNECT_URL_PREFIX(self) -> str:\n        return self._setting(\"OPENID_CONNECT_URL_PREFIX\", \"oidc\")\n\n\n_app_settings = AppSettings(\"SOCIALACCOUNT_\")\n\n\ndef __getattr__(name):\n    # See https://peps.python.org/pep-0562/\n    return getattr(_app_settings, name)\n"
  },
  {
    "path": "allauth/socialaccount/apps.py",
    "content": "from django.apps import AppConfig\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth import app_settings\n\n\nclass SocialAccountConfig(AppConfig):\n    name = \"allauth.socialaccount\"\n    verbose_name = _(\"Social Accounts\")\n    default_auto_field = app_settings.DEFAULT_AUTO_FIELD or \"django.db.models.AutoField\"\n\n    def ready(self):\n        from allauth.socialaccount import checks  # noqa\n        from allauth.socialaccount.providers import registry\n\n        registry.load()\n"
  },
  {
    "path": "allauth/socialaccount/checks.py",
    "content": "from django.core.checks import Critical, register\n\n\n@register()\ndef settings_check(app_configs, **kwargs):\n    from allauth import app_settings as allauth_settings\n    from allauth.account import app_settings as account_settings\n    from allauth.socialaccount import app_settings\n\n    ret = []\n    if allauth_settings.SOCIALACCOUNT_ONLY:\n        if (\n            app_settings.EMAIL_VERIFICATION\n            != account_settings.EmailVerificationMethod.NONE\n        ):\n            ret.append(\n                Critical(\n                    msg=\"SOCIALACCOUNT_ONLY requires SOCIALACCOUNT_EMAIL_VERIFICATION = 'none'\"\n                )\n            )\n    return ret\n"
  },
  {
    "path": "allauth/socialaccount/forms.py",
    "content": "from django import forms\n\nfrom allauth.account.forms import BaseSignupForm\nfrom allauth.socialaccount.internal import flows\n\nfrom . import app_settings\nfrom .adapter import get_adapter\nfrom .models import SocialAccount\n\n\nclass SignupForm(BaseSignupForm):\n    def __init__(self, *args, **kwargs) -> None:\n        self.sociallogin = kwargs.pop(\"sociallogin\")\n        initial = get_adapter().get_signup_form_initial_data(self.sociallogin)\n        kwargs.update(\n            {\n                \"initial\": initial,\n                \"email_required\": kwargs.get(\n                    \"email_required\", app_settings.EMAIL_REQUIRED\n                ),\n            }\n        )\n        super().__init__(*args, **kwargs)\n\n    def save(self, request):\n        adapter = get_adapter()\n        user = adapter.save_user(request, self.sociallogin, form=self)\n        self.custom_signup(request, user)\n        return user\n\n    def validate_unique_email(self, value) -> str:\n        try:\n            return super().validate_unique_email(value)\n        except forms.ValidationError:\n            raise get_adapter().validation_error(\n                \"email_taken\", self.sociallogin.provider.name\n            )\n\n\nclass DisconnectForm(forms.Form):\n    account = forms.ModelChoiceField(\n        queryset=SocialAccount.objects.none(),\n        widget=forms.RadioSelect,\n        required=True,\n    )\n\n    def __init__(self, *args, **kwargs):\n        self.request = kwargs.pop(\"request\")\n        self.accounts = SocialAccount.objects.filter(user=self.request.user)\n        super().__init__(*args, **kwargs)\n        self.fields[\"account\"].queryset = self.accounts\n\n    def clean(self):\n        cleaned_data = super().clean()\n        account = cleaned_data.get(\"account\")\n        if account:\n            flows.connect.validate_disconnect(self.request, account)\n        return cleaned_data\n\n    def save(self) -> None:\n        account = self.cleaned_data[\"account\"]\n        flows.connect.disconnect(self.request, account)\n"
  },
  {
    "path": "allauth/socialaccount/helpers.py",
    "content": "from http import HTTPStatus\n\nfrom django.http import HttpResponseRedirect\nfrom django.shortcuts import render\nfrom django.urls import reverse\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.utils import user_display\nfrom allauth.core.exceptions import ImmediateHttpResponse\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.internal import flows\nfrom allauth.socialaccount.providers.base import AuthError\n\n\ndef render_authentication_error(\n    request,\n    provider,\n    error=AuthError.UNKNOWN,\n    exception=None,\n    extra_context=None,\n):\n    try:\n        if extra_context is None:\n            extra_context = {}\n        get_adapter().on_authentication_error(\n            request,\n            provider,\n            error=error,\n            exception=exception,\n            extra_context=extra_context,\n        )\n        if allauth_settings.HEADLESS_ENABLED:\n            from allauth.headless.socialaccount import internal\n\n            internal.on_authentication_error(\n                request,\n                provider=provider,\n                error=error,\n                exception=exception,\n                extra_context=extra_context,\n            )\n\n    except ImmediateHttpResponse as e:\n        return e.response\n    if error == AuthError.CANCELLED:\n        return HttpResponseRedirect(reverse(\"socialaccount_login_cancelled\"))\n    context = {\n        \"auth_error\": {\n            \"provider\": provider,\n            \"code\": error,\n            \"exception\": exception,\n        }\n    }\n    context.update(extra_context)\n    return render(\n        request,\n        f\"socialaccount/authentication_error.{account_settings.TEMPLATE_EXTENSION}\",\n        context,\n        status=HTTPStatus.UNAUTHORIZED,\n    )\n\n\ndef complete_social_login(request, sociallogin):\n    if sociallogin.is_headless:\n        from allauth.headless.socialaccount import internal\n\n        return internal.complete_login(request, sociallogin)\n    return flows.login.complete_login(request, sociallogin)\n\n\ndef socialaccount_user_display(socialaccount):\n    func = app_settings.SOCIALACCOUNT_STR\n    if not func:\n        return user_display(socialaccount.user)\n    return func(socialaccount)\n"
  },
  {
    "path": "allauth/socialaccount/internal/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/internal/flows/__init__.py",
    "content": "from allauth.socialaccount.internal.flows import (\n    connect,\n    email_authentication,\n    login,\n    signup,\n)\n\n\n__all__ = [\"connect\", \"login\", \"signup\", \"email_authentication\"]\n"
  },
  {
    "path": "allauth/socialaccount/internal/flows/connect.py",
    "content": "from django.contrib import messages\nfrom django.core.exceptions import PermissionDenied, ValidationError\nfrom django.http import HttpResponseRedirect\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.internal import flows\nfrom allauth.account.models import EmailAddress\nfrom allauth.core.exceptions import ReauthenticationRequired\nfrom allauth.socialaccount import signals\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.models import SocialAccount, SocialLogin\n\n\ndef validate_disconnect(request, account) -> None:\n    \"\"\"\n    Validate whether or not the socialaccount account can be\n    safely disconnected.\n    \"\"\"\n    accounts = SocialAccount.objects.filter(user_id=account.user_id)\n    is_last = not accounts.exclude(pk=account.pk).exists()\n    adapter = get_adapter()\n    if is_last:\n        if allauth_settings.SOCIALACCOUNT_ONLY:\n            raise adapter.validation_error(\"disconnect_last\")\n        # No usable password would render the local account unusable\n        if not account.user.has_usable_password():\n            raise adapter.validation_error(\"no_password\")\n        # No email address, no password reset\n        if (\n            account_settings.EMAIL_VERIFICATION\n            == account_settings.EmailVerificationMethod.MANDATORY\n        ):\n            if not EmailAddress.objects.filter(\n                user=account.user, verified=True\n            ).exists():\n                raise adapter.validation_error(\"no_verified_email\")\n    adapter.validate_disconnect(account, accounts)\n\n\ndef disconnect(request, account) -> None:\n    if account_settings.REAUTHENTICATION_REQUIRED:\n        flows.reauthentication.raise_if_reauthentication_required(request)\n\n    get_account_adapter().add_message(\n        request,\n        messages.INFO,\n        \"socialaccount/messages/account_disconnected.txt\",\n    )\n    provider = account.get_provider()\n    account.delete()\n    signals.social_account_removed.send(\n        sender=SocialAccount, request=request, socialaccount=account\n    )\n    get_adapter().send_notification_mail(\n        \"socialaccount/email/account_disconnected\",\n        request.user,\n        context={\n            \"account\": account,\n            \"provider\": provider,\n        },\n    )\n\n\ndef resume_connect(request, serialized_state):\n    sociallogin = SocialLogin.deserialize(serialized_state)\n    return connect(request, sociallogin)\n\n\ndef connect(request, sociallogin):\n    try:\n        ok, action, message = do_connect(request, sociallogin)\n    except PermissionDenied:\n        # This should not happen. Simply redirect to the connections\n        # view (which has a login required)\n        connect_redirect_url = get_adapter().get_connect_redirect_url(\n            request, sociallogin.account\n        )\n        return HttpResponseRedirect(connect_redirect_url)\n    except ReauthenticationRequired:\n        return flows.reauthentication.stash_and_reauthenticate(\n            request,\n            sociallogin.serialize(),\n            \"allauth.socialaccount.internal.flows.connect.resume_connect\",\n        )\n    except ValidationError:\n        ok, action, message = (\n            False,\n            None,\n            \"socialaccount/messages/account_connected_other.txt\",\n        )\n    level = messages.INFO if ok else messages.ERROR\n    default_next = get_adapter().get_connect_redirect_url(request, sociallogin.account)\n    next_url = sociallogin.get_redirect_url(request) or default_next\n    get_account_adapter(request).add_message(\n        request,\n        level,\n        message,\n        message_context={\"sociallogin\": sociallogin, \"action\": action},\n    )\n    return HttpResponseRedirect(next_url)\n\n\ndef do_connect(request, sociallogin):\n    if request.user.is_anonymous:\n        raise PermissionDenied()\n    if account_settings.REAUTHENTICATION_REQUIRED:\n        flows.reauthentication.raise_if_reauthentication_required(request)\n    message = \"socialaccount/messages/account_connected.txt\"\n    action = None\n    ok = True\n    if sociallogin.is_existing:\n        if sociallogin.user != request.user:\n            # Social account of other user. For now, this scenario\n            # is not supported. Issue is that one cannot simply\n            # remove the social account from the other user, as\n            # that may render the account unusable.\n            raise get_adapter().validation_error(\"connected_other\")\n        elif not sociallogin.account._state.adding:\n            action = \"updated\"\n            message = \"socialaccount/messages/account_connected_updated.txt\"\n        else:\n            action = \"added\"\n            sociallogin.connect(request, request.user)\n    else:\n        # New account, let's connect\n        action = \"added\"\n        sociallogin.connect(request, request.user)\n    return ok, action, message\n"
  },
  {
    "path": "allauth/socialaccount/internal/flows/email_authentication.py",
    "content": "from allauth import app_settings as allauth_settings\nfrom allauth.account.models import EmailAddress\n\n\ndef wipe_password(request, user, email: str) -> None:\n    \"\"\"\n    Consider a scenario where an attacker signs up for an account using the\n    email address of a victim. Obviously, the email address cannot be\n    verified, yet the attacker -- knowing the password -- can wait until the\n    victim appears.  When the victim signs in using email authentication, it\n    is not obvious that the victim is signing into an account that was not\n    created by the victim. As a result, both the attacker and the victim now\n    have access to the account. To prevent this, we wipe the password of the\n    account in case the email address was not verified, effectively locking\n    out the attacker.\n    \"\"\"\n    try:\n        address = EmailAddress.objects.get_for_user(user, email)\n    except EmailAddress.DoesNotExist:\n        address = None\n    if address and address.verified:\n        # Verified email address, no reason to worry.\n        return\n    if user.has_usable_password():\n        user.set_unusable_password()\n        user.save(update_fields=[\"password\"])\n    # Also wipe any other sessions (upstream integrators may hook up to the\n    # ending of the sessions to trigger e.g. backchannel logout.\n    if allauth_settings.USERSESSIONS_ENABLED:\n        from allauth.usersessions.internal.flows.sessions import end_other_sessions\n\n        end_other_sessions(request, user)\n"
  },
  {
    "path": "allauth/socialaccount/internal/flows/login.py",
    "content": "from django.http import HttpResponseRedirect\nfrom django.shortcuts import render\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.utils import perform_login\nfrom allauth.core.exceptions import ImmediateHttpResponse, SignupClosedException\nfrom allauth.socialaccount import app_settings, signals\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.internal.flows.connect import connect, do_connect\nfrom allauth.socialaccount.internal.flows.signup import (\n    clear_pending_signup,\n    process_signup,\n)\nfrom allauth.socialaccount.models import SocialLogin\nfrom allauth.socialaccount.providers.base import AuthProcess\n\n\ndef _login(request, sociallogin):\n    sociallogin._accept_login(request)\n    record_authentication(request, sociallogin)\n    return perform_login(\n        request,\n        sociallogin.user,\n        email_verification=app_settings.EMAIL_VERIFICATION,\n        redirect_url=sociallogin.get_redirect_url(request),\n        signal_kwargs={\"sociallogin\": sociallogin},\n    )\n\n\ndef pre_social_login(request, sociallogin) -> None:\n    clear_pending_signup(request)\n    assert not sociallogin.is_existing  # nosec\n    sociallogin.lookup()\n    get_adapter().pre_social_login(request, sociallogin)\n    signals.pre_social_login.send(\n        sender=SocialLogin, request=request, sociallogin=sociallogin\n    )\n\n\ndef complete_login(request, sociallogin, raises=False):\n    try:\n        pre_social_login(request, sociallogin)\n        process = sociallogin.state.get(\"process\")\n        if process == AuthProcess.REDIRECT:\n            return _redirect(request, sociallogin)\n        elif process == AuthProcess.CONNECT:\n            if raises:\n                do_connect(request, sociallogin)\n            else:\n                return connect(request, sociallogin)\n        else:\n            return _authenticate(request, sociallogin)\n    except SignupClosedException:\n        if raises:\n            raise\n        return render(\n            request,\n            f\"account/signup_closed.{account_settings.TEMPLATE_EXTENSION}\",\n        )\n    except ImmediateHttpResponse as e:\n        if raises:\n            raise\n        return e.response\n\n\ndef _redirect(request, sociallogin):\n    next_url = sociallogin.get_redirect_url(request) or \"/\"\n    return HttpResponseRedirect(next_url)\n\n\ndef _authenticate(request, sociallogin):\n    if request.user.is_authenticated:\n        get_account_adapter(request).logout(request)\n    if sociallogin.is_existing:\n        # Login existing user\n        ret = _login(request, sociallogin)\n    else:\n        # New social user\n        ret = process_signup(request, sociallogin)\n    return ret\n\n\ndef record_authentication(request, sociallogin) -> None:\n    from allauth.account.internal.flows.login import record_authentication\n\n    record_authentication(\n        request,\n        sociallogin.user,\n        \"socialaccount\",\n        **{\n            \"provider\": sociallogin.account.provider,\n            \"uid\": sociallogin.account.uid,\n        },\n    )\n"
  },
  {
    "path": "allauth/socialaccount/internal/flows/signup.py",
    "content": "from django.forms import ValidationError\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.internal.flows.manage_email import assess_unique_email\nfrom allauth.account.internal.flows.signup import complete_signup, prevent_enumeration\nfrom allauth.account.utils import user_username\nfrom allauth.core.exceptions import SignupClosedException\nfrom allauth.core.internal.httpkit import headed_redirect_response\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.models import SocialLogin\n\n\ndef get_pending_signup(request) -> SocialLogin | None:\n    if data := request.session.get(\"socialaccount_sociallogin\"):\n        try:\n            return SocialLogin.deserialize(data)\n        except ValueError:\n            return None\n    return None\n\n\ndef redirect_to_signup(request, sociallogin):\n    request.session[\"socialaccount_sociallogin\"] = sociallogin.serialize()\n    return headed_redirect_response(\"socialaccount_signup\")\n\n\ndef clear_pending_signup(request) -> None:\n    request.session.pop(\"socialaccount_sociallogin\", None)\n\n\ndef signup_by_form(request, sociallogin, form):\n    clear_pending_signup(request)\n    user, resp = form.try_save(request)\n    if not resp:\n        resp = complete_social_signup(request, sociallogin)\n    return resp\n\n\ndef process_auto_signup(request, sociallogin):\n    auto_signup = get_adapter().is_auto_signup_allowed(request, sociallogin)\n    if not auto_signup:\n        return False, None\n    auto_signup, resp = process_auto_signup_email(request, sociallogin)\n    if not auto_signup:\n        return False, resp\n    auto_signup, resp = process_auto_signup_phone(request, sociallogin)\n    return auto_signup, resp\n\n\ndef process_auto_signup_email(request, sociallogin):\n    email = None\n    if sociallogin.email_addresses:\n        email = sociallogin.email_addresses[0].email\n    # Let's check if auto_signup is really possible...\n    if email:\n        assessment = assess_unique_email(email)\n        if assessment is True:\n            # Auto signup is fine.\n            auto_signup = True\n        elif assessment is False:\n            # Oops, another user already has this address.  We cannot simply\n            # connect this social account to the existing user. Reason is\n            # that the email address may not be verified, meaning, the user\n            # may be a hacker that has added your email address to their\n            # account in the hope that you fall in their trap.  We cannot\n            # check on 'email_address.verified' either, because\n            # 'email_address' is not guaranteed to be verified.\n            auto_signup = False\n            # TODO: We redirect to signup form -- user will see email\n            # address conflict only after posting whereas we detected it\n            # here already.\n        else:\n            assert assessment is None  # nosec\n            # Prevent enumeration is properly turned on, meaning, we cannot\n            # show the signup form to allow the user to input another email\n            # address. Instead, we're going to send the user an email that\n            # the account already exists, and on the outside make it appear\n            # as if an email verification mail was sent.\n            resp = prevent_enumeration(request, email=email)\n            return False, resp\n    elif app_settings.EMAIL_REQUIRED:\n        # Nope, email is required and we don't have it yet...\n        auto_signup = False\n    else:\n        auto_signup = True\n    return auto_signup, None\n\n\ndef process_auto_signup_phone(request, sociallogin):\n    # At this point, email is not required, or, we have a unique email.  Let's\n    # check the phone number.\n    phone_field = account_settings.SIGNUP_FIELDS.get(\"phone\")\n    if not phone_field or not phone_field[\"required\"]:\n        return True, None\n    if not sociallogin.phone:\n        return False, None\n    # If the phone is already taken?\n    existing_user = get_account_adapter().get_user_by_phone(sociallogin.phone)\n    if existing_user:\n        return False, None\n    return True, None\n\n\ndef process_signup(request, sociallogin):\n    if not get_adapter().is_open_for_signup(request, sociallogin):\n        raise SignupClosedException()\n    auto_signup, resp = process_auto_signup(request, sociallogin)\n    if resp:\n        return resp\n    if not auto_signup:\n        resp = redirect_to_signup(request, sociallogin)\n    else:\n        # Ok, auto signup it is, at least the email address is ok.\n        # We still need to check the username though...\n        if account_settings.USER_MODEL_USERNAME_FIELD:\n            username = user_username(sociallogin.user)\n            try:\n                get_account_adapter(request).clean_username(username)\n            except ValidationError:\n                # This username is no good ...\n                user_username(sociallogin.user, \"\")\n        # TODO: This part contains a lot of duplication of logic\n        # (\"closed\" rendering, create user, send email, in active\n        # etc..)\n        get_adapter().save_user(request, sociallogin, form=None)\n        resp = complete_social_signup(request, sociallogin)\n    return resp\n\n\ndef complete_social_signup(request, sociallogin):\n    from allauth.socialaccount.internal.flows.login import record_authentication\n\n    record_authentication(request, sociallogin)\n    return complete_signup(\n        request,\n        user=sociallogin.user,\n        email_verification=app_settings.EMAIL_VERIFICATION,\n        redirect_url=sociallogin.get_redirect_url(request),\n        signal_kwargs={\"sociallogin\": sociallogin},\n    )\n"
  },
  {
    "path": "allauth/socialaccount/internal/jwtkit.py",
    "content": "import json\nimport time\n\nfrom django.core.cache import cache\n\nimport jwt\nfrom cryptography.hazmat.backends import default_backend\nfrom cryptography.x509 import load_pem_x509_certificate\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\n\n\ndef lookup_kid_pem_x509_certificate(keys_data, kid):\n    \"\"\"\n    Looks up the key given keys data of the form:\n\n        {\"<kid>\": \"-----BEGIN CERTIFICATE-----\\nCERTIFICATE\"}\n    \"\"\"\n    key = keys_data.get(kid)\n    if key:\n        public_key = load_pem_x509_certificate(\n            key.encode(\"utf8\"), default_backend()\n        ).public_key()\n        return public_key\n\n\ndef lookup_kid_jwk(keys_data, kid):\n    \"\"\"\n    Looks up the key given keys data of the form:\n\n        {\n          \"keys\": [\n            {\n              \"kty\": \"RSA\",\n              \"kid\": \"W6WcOKB\",\n              \"use\": \"sig\",\n              \"alg\": \"RS256\",\n              \"n\": \"2Zc5d0-zk....\",\n              \"e\": \"AQAB\"\n            }]\n        }\n    \"\"\"\n    for d in keys_data[\"keys\"]:\n        if d[\"kid\"] == kid:\n            public_key = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(d))\n            return public_key\n\n\ndef fetch_key(credential, keys_url, lookup):\n    header = jwt.get_unverified_header(credential)\n    # {'alg': 'RS256', 'kid': '0ad1fec78504f447bae65bcf5afaedb65eec9e81', 'typ': 'JWT'}\n    kid = header[\"kid\"]\n    alg = header[\"alg\"]\n    with get_adapter().get_requests_session() as sess:\n        response = sess.get(keys_url)\n        response.raise_for_status()\n        keys_data = response.json()\n    key = lookup(keys_data, kid)\n    if not key:\n        raise OAuth2Error(f\"Invalid 'kid': '{kid}'\")\n    return alg, key\n\n\ndef verify_jti(data: dict) -> None:\n    \"\"\"\n    Put the JWT token on a blacklist to prevent replay attacks.\n    \"\"\"\n    iss = data.get(\"iss\")\n    exp = data.get(\"exp\")\n    jti = data.get(\"jti\")\n    if iss is None or exp is None or jti is None:\n        return\n    timeout = exp - time.time()\n    key = f\"jwt:iss={iss},jti={jti}\"\n    if not cache.add(key=key, value=True, timeout=timeout):\n        raise OAuth2Error(\"token already used\")\n\n\ndef verify_and_decode(\n    *, credential, keys_url, issuer, audience, lookup_kid, verify_signature: bool = True\n) -> dict:\n    try:\n        if verify_signature:\n            alg, key = fetch_key(credential, keys_url, lookup_kid)\n            algorithms = [alg]\n        else:\n            key = \"\"\n            algorithms = None\n        data = jwt.decode(\n            credential,\n            key=key,\n            options={\n                \"verify_signature\": verify_signature,\n                \"verify_iss\": True,\n                \"verify_aud\": True,\n                \"verify_exp\": True,\n            },\n            issuer=issuer,\n            audience=audience,\n            algorithms=algorithms,\n        )\n        verify_jti(data)\n        return data\n    except jwt.PyJWTError as e:\n        raise OAuth2Error(\"Invalid id_token\") from e\n"
  },
  {
    "path": "allauth/socialaccount/internal/statekit.py",
    "content": "import time\nfrom typing import Any\n\nfrom allauth.socialaccount.adapter import get_adapter\n\n\nSTATE_ID_LENGTH = 16\nMAX_STATES = 10\nSTATES_SESSION_KEY = \"socialaccount_states\"\n\n\ndef get_oldest_state(\n    states: dict[str, tuple[dict[str, Any], float]], rev: bool = False\n) -> tuple[str | None, dict[str, Any] | None]:\n    oldest_ts = None\n    oldest_id = None\n    oldest = None\n    for state_id, state_ts in states.items():\n        ts = state_ts[1]\n        if oldest_ts is None or (\n            (rev and ts > oldest_ts) or ((not rev) and oldest_ts > ts)\n        ):\n            oldest_ts = ts\n            oldest_id = state_id\n            oldest = state_ts[0]\n    return oldest_id, oldest\n\n\ndef gc_states(states: dict[str, tuple[dict[str, Any], float]]) -> None:\n    if len(states) > MAX_STATES:\n        oldest_id, oldest = get_oldest_state(states)\n        if oldest_id:\n            del states[oldest_id]\n\n\ndef get_states(request) -> dict[str, tuple[dict[str, Any], float]]:\n    states = request.session.get(STATES_SESSION_KEY)\n    if not isinstance(states, dict):\n        states = {}\n    return states\n\n\ndef stash_state(request, state: dict[str, Any], state_id: str | None = None) -> str:\n    states = get_states(request)\n    gc_states(states)\n    if state_id is None:\n        state_id = get_adapter().generate_state_param(state)\n    states[state_id] = (state, time.time())\n    request.session[STATES_SESSION_KEY] = states\n    return state_id\n\n\ndef unstash_state(request, state_id: str) -> dict[str, Any] | None:\n    state: dict[str, Any] | None = None\n    states = get_states(request)\n    state_ts = states.get(state_id)\n    if state_ts is not None:\n        state = state_ts[0]\n        del states[state_id]\n        request.session[STATES_SESSION_KEY] = states\n    return state\n\n\ndef unstash_last_state(request) -> dict[str, Any] | None:\n    states = get_states(request)\n    state_id, state = get_oldest_state(states, rev=True)\n    if state_id:\n        unstash_state(request, state_id)\n    return state\n"
  },
  {
    "path": "allauth/socialaccount/migrations/0001_initial.py",
    "content": "from django.conf import settings\nfrom django.db import migrations, models\n\nfrom allauth import app_settings\n\n\nclass Migration(migrations.Migration):\n    dependencies = (\n        [\n            (\"sites\", \"0001_initial\"),\n        ]\n        if app_settings.SITES_ENABLED\n        else []\n    ) + [\n        migrations.swappable_dependency(settings.AUTH_USER_MODEL),\n    ]\n\n    operations = [\n        migrations.CreateModel(\n            name=\"SocialAccount\",\n            fields=[\n                (\n                    \"id\",\n                    models.AutoField(\n                        verbose_name=\"ID\",\n                        serialize=False,\n                        auto_created=True,\n                        primary_key=True,\n                    ),\n                ),\n                (\n                    \"provider\",\n                    models.CharField(\n                        max_length=30,\n                        verbose_name=\"provider\",\n                    ),\n                ),\n                (\n                    \"uid\",\n                    models.CharField(\n                        max_length=getattr(\n                            settings, \"SOCIALACCOUNT_UID_MAX_LENGTH\", 191\n                        ),\n                        verbose_name=\"uid\",\n                    ),\n                ),\n                (\n                    \"last_login\",\n                    models.DateTimeField(auto_now=True, verbose_name=\"last login\"),\n                ),\n                (\n                    \"date_joined\",\n                    models.DateTimeField(auto_now_add=True, verbose_name=\"date joined\"),\n                ),\n                (\n                    \"extra_data\",\n                    models.TextField(default=\"{}\", verbose_name=\"extra data\"),\n                ),\n                (\n                    \"user\",\n                    models.ForeignKey(\n                        to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE\n                    ),\n                ),\n            ],\n            options={\n                \"verbose_name\": \"social account\",\n                \"verbose_name_plural\": \"social accounts\",\n            },\n            bases=(models.Model,),\n        ),\n        migrations.CreateModel(\n            name=\"SocialApp\",\n            fields=[\n                (\n                    \"id\",\n                    models.AutoField(\n                        verbose_name=\"ID\",\n                        serialize=False,\n                        auto_created=True,\n                        primary_key=True,\n                    ),\n                ),\n                (\n                    \"provider\",\n                    models.CharField(\n                        max_length=30,\n                        verbose_name=\"provider\",\n                    ),\n                ),\n                (\"name\", models.CharField(max_length=40, verbose_name=\"name\")),\n                (\n                    \"client_id\",\n                    models.CharField(\n                        help_text=\"App ID, or consumer key\",\n                        max_length=100,\n                        verbose_name=\"client id\",\n                    ),\n                ),\n                (\n                    \"secret\",\n                    models.CharField(\n                        help_text=\"API secret, client secret, or consumer secret\",\n                        max_length=100,\n                        verbose_name=\"secret key\",\n                    ),\n                ),\n                (\n                    \"key\",\n                    models.CharField(\n                        help_text=\"Key\",\n                        max_length=100,\n                        verbose_name=\"key\",\n                        blank=True,\n                    ),\n                ),\n            ]\n            + (\n                [\n                    (\"sites\", models.ManyToManyField(to=\"sites.Site\", blank=True)),\n                ]\n                if app_settings.SITES_ENABLED\n                else []\n            ),\n            options={\n                \"verbose_name\": \"social application\",\n                \"verbose_name_plural\": \"social applications\",\n            },\n            bases=(models.Model,),\n        ),\n        migrations.CreateModel(\n            name=\"SocialToken\",\n            fields=[\n                (\n                    \"id\",\n                    models.AutoField(\n                        verbose_name=\"ID\",\n                        serialize=False,\n                        auto_created=True,\n                        primary_key=True,\n                    ),\n                ),\n                (\n                    \"token\",\n                    models.TextField(\n                        help_text='\"oauth_token\" (OAuth1) or access token (OAuth2)',\n                        verbose_name=\"token\",\n                    ),\n                ),\n                (\n                    \"token_secret\",\n                    models.TextField(\n                        help_text='\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)',\n                        verbose_name=\"token secret\",\n                        blank=True,\n                    ),\n                ),\n                (\n                    \"expires_at\",\n                    models.DateTimeField(\n                        null=True, verbose_name=\"expires at\", blank=True\n                    ),\n                ),\n                (\n                    \"account\",\n                    models.ForeignKey(\n                        to=\"socialaccount.SocialAccount\",\n                        on_delete=models.CASCADE,\n                    ),\n                ),\n                (\n                    \"app\",\n                    models.ForeignKey(\n                        to=\"socialaccount.SocialApp\", on_delete=models.CASCADE\n                    ),\n                ),\n            ],\n            options={\n                \"verbose_name\": \"social application token\",\n                \"verbose_name_plural\": \"social application tokens\",\n            },\n            bases=(models.Model,),\n        ),\n        migrations.AlterUniqueTogether(\n            name=\"socialtoken\",\n            unique_together={(\"app\", \"account\")},\n        ),\n        migrations.AlterUniqueTogether(\n            name=\"socialaccount\",\n            unique_together={(\"provider\", \"uid\")},\n        ),\n    ]\n"
  },
  {
    "path": "allauth/socialaccount/migrations/0002_token_max_lengths.py",
    "content": "from django.conf import settings\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        (\"socialaccount\", \"0001_initial\"),\n    ]\n\n    operations = [\n        migrations.AlterField(\n            model_name=\"socialaccount\",\n            name=\"uid\",\n            field=models.CharField(\n                max_length=getattr(settings, \"SOCIALACCOUNT_UID_MAX_LENGTH\", 191),\n                verbose_name=\"uid\",\n            ),\n        ),\n        migrations.AlterField(\n            model_name=\"socialapp\",\n            name=\"client_id\",\n            field=models.CharField(\n                help_text=\"App ID, or consumer key\",\n                max_length=191,\n                verbose_name=\"client id\",\n            ),\n        ),\n        migrations.AlterField(\n            model_name=\"socialapp\",\n            name=\"key\",\n            field=models.CharField(\n                help_text=\"Key\", max_length=191, verbose_name=\"key\", blank=True\n            ),\n        ),\n        migrations.AlterField(\n            model_name=\"socialapp\",\n            name=\"secret\",\n            field=models.CharField(\n                help_text=\"API secret, client secret, or consumer secret\",\n                max_length=191,\n                verbose_name=\"secret key\",\n                blank=True,\n            ),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/socialaccount/migrations/0003_extra_data_default_dict.py",
    "content": "from django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        (\"socialaccount\", \"0002_token_max_lengths\"),\n    ]\n\n    operations = [\n        migrations.AlterField(\n            model_name=\"socialaccount\",\n            name=\"extra_data\",\n            field=models.TextField(default=\"{}\", verbose_name=\"extra data\"),\n            preserve_default=True,\n        ),\n    ]\n"
  },
  {
    "path": "allauth/socialaccount/migrations/0004_app_provider_id_settings.py",
    "content": "# Generated by Django 3.2.19 on 2023-06-30 13:16\n\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        (\"socialaccount\", \"0003_extra_data_default_dict\"),\n    ]\n\n    operations = [\n        migrations.AddField(\n            model_name=\"socialapp\",\n            name=\"provider_id\",\n            field=models.CharField(\n                blank=True, max_length=200, verbose_name=\"provider ID\"\n            ),\n        ),\n        migrations.AddField(\n            model_name=\"socialapp\",\n            name=\"settings\",\n            field=models.JSONField(blank=True, default=dict),\n        ),\n        migrations.AlterField(\n            model_name=\"socialaccount\",\n            name=\"provider\",\n            field=models.CharField(max_length=200, verbose_name=\"provider\"),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/socialaccount/migrations/0005_socialtoken_nullable_app.py",
    "content": "# Generated by Django 3.2.20 on 2023-09-03 19:46\n\nimport django.db.models.deletion\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        (\"socialaccount\", \"0004_app_provider_id_settings\"),\n    ]\n\n    operations = [\n        migrations.AlterField(\n            model_name=\"socialtoken\",\n            name=\"app\",\n            field=models.ForeignKey(\n                blank=True,\n                null=True,\n                on_delete=django.db.models.deletion.SET_NULL,\n                to=\"socialaccount.socialapp\",\n            ),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/socialaccount/migrations/0006_alter_socialaccount_extra_data.py",
    "content": "# Generated by Django 3.2.20 on 2023-10-11 09:23\n\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        (\"socialaccount\", \"0005_socialtoken_nullable_app\"),\n    ]\n\n    operations = [\n        migrations.AlterField(\n            model_name=\"socialaccount\",\n            name=\"extra_data\",\n            field=models.JSONField(default=dict, verbose_name=\"extra data\"),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/socialaccount/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/models.py",
    "content": "from typing import Any\n\nfrom django.conf import settings\nfrom django.contrib.auth import authenticate, get_user_model\nfrom django.contrib.sites.shortcuts import get_current_site\nfrom django.core.exceptions import ImproperlyConfigured, PermissionDenied\nfrom django.db import models\nfrom django.utils.translation import gettext_lazy as _\n\nimport allauth.app_settings\nfrom allauth import app_settings as allauth_settings\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.models import EmailAddress\nfrom allauth.account.utils import (\n    filter_users_by_email,\n    get_next_redirect_url,\n    setup_user_email,\n)\nfrom allauth.core import context\nfrom allauth.socialaccount import app_settings, providers, signals\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.internal import statekit\nfrom allauth.utils import get_request_param\n\n\nif not allauth_settings.SOCIALACCOUNT_ENABLED:\n    raise ImproperlyConfigured(\n        \"allauth.socialaccount not installed, yet its models are imported.\"\n    )\n\n\nclass SocialAppManager(models.Manager):\n    def on_site(self, request):\n        if allauth.app_settings.SITES_ENABLED:\n            site = get_current_site(request)\n            return self.filter(sites__id=site.id)\n        return self.all()\n\n\nclass SocialApp(models.Model):\n    objects = SocialAppManager()\n\n    # The provider type, e.g. \"google\", \"telegram\", \"saml\".\n    provider = models.CharField(\n        verbose_name=_(\"provider\"),\n        max_length=30,\n    )\n    # For providers that support subproviders, such as OpenID Connect and SAML,\n    # this ID identifies that instance. SocialAccount's originating from app\n    # will have their `provider` field set to the `provider_id` if available,\n    # else `provider`.\n    provider_id = models.CharField(\n        verbose_name=_(\"provider ID\"),\n        max_length=200,\n        blank=True,\n    )\n    name = models.CharField(verbose_name=_(\"name\"), max_length=40)\n    client_id = models.CharField(\n        verbose_name=_(\"client id\"),\n        max_length=191,\n        help_text=_(\"App ID, or consumer key\"),\n    )\n    secret = models.CharField(\n        verbose_name=_(\"secret key\"),\n        max_length=191,\n        blank=True,\n        help_text=_(\"API secret, client secret, or consumer secret\"),\n    )\n    key = models.CharField(\n        verbose_name=_(\"key\"), max_length=191, blank=True, help_text=_(\"Key\")\n    )\n    settings = models.JSONField(default=dict, blank=True)\n\n    if allauth.app_settings.SITES_ENABLED:\n        # Most apps can be used across multiple domains, therefore we use\n        # a ManyToManyField. Note that Facebook requires an app per domain\n        # (unless the domains share a common base name).\n        # blank=True allows for disabling apps without removing them\n        sites = models.ManyToManyField(\"sites.Site\", blank=True)  # type: ignore[var-annotated]\n\n    class Meta:\n        verbose_name = _(\"social application\")\n        verbose_name_plural = _(\"social applications\")\n\n    def __str__(self) -> str:\n        return self.name\n\n    def get_provider(self, request):\n        provider_class = providers.registry.get_class(self.provider)\n        return provider_class(request=request, app=self)\n\n\nclass SocialAccount(models.Model):\n    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)\n    # Given a `SocialApp` from which this account originates, this field equals\n    # the app's `app.provider_id` if available, `app.provider` otherwise.\n    provider = models.CharField(\n        verbose_name=_(\"provider\"),\n        max_length=200,\n    )\n    # Just in case you're wondering if an OpenID identity URL is going\n    # to fit in a 'uid':\n    #\n    # Ideally, URLField(max_length=1024, unique=True) would be used\n    # for identity.  However, MySQL has a max_length limitation of 191\n    # for URLField (in case of utf8mb4). How about\n    # models.TextField(unique=True) then?  Well, that won't work\n    # either for MySQL due to another bug[1]. So the only way out\n    # would be to drop the unique constraint, or switch to shorter\n    # identity URLs. Opted for the latter, as [2] suggests that\n    # identity URLs are supposed to be short anyway, at least for the\n    # old spec.\n    #\n    # [1] https://code.djangoproject.com/ticket/2495.\n    # [2] https://openid.net/specs/openid-authentication-1_1.html#limits\n\n    uid = models.CharField(\n        verbose_name=_(\"uid\"), max_length=app_settings.UID_MAX_LENGTH\n    )\n    last_login = models.DateTimeField(verbose_name=_(\"last login\"), auto_now=True)\n    date_joined = models.DateTimeField(verbose_name=_(\"date joined\"), auto_now_add=True)\n    extra_data = models.JSONField(verbose_name=_(\"extra data\"), default=dict)\n\n    class Meta:\n        unique_together = (\"provider\", \"uid\")\n        verbose_name = _(\"social account\")\n        verbose_name_plural = _(\"social accounts\")\n\n    def authenticate(self):\n        return authenticate(account=self)\n\n    def __str__(self) -> str:\n        from .helpers import socialaccount_user_display\n\n        return socialaccount_user_display(self)\n\n    def get_profile_url(self):\n        return self.get_provider_account().get_profile_url()\n\n    def get_avatar_url(self):\n        return self.get_provider_account().get_avatar_url()\n\n    def get_provider(self, request=None):\n        provider = getattr(self, \"_provider\", None)\n        if provider:\n            return provider\n        adapter = get_adapter()\n        provider = self._provider = adapter.get_provider(\n            request or context.request, provider=self.provider\n        )\n        return provider\n\n    def get_provider_account(self):\n        return self.get_provider().wrap_account(self)\n\n\nclass SocialToken(models.Model):\n    app = models.ForeignKey(SocialApp, on_delete=models.SET_NULL, blank=True, null=True)\n    account = models.ForeignKey(SocialAccount, on_delete=models.CASCADE)\n    token = models.TextField(\n        verbose_name=_(\"token\"),\n        help_text=_('\"oauth_token\" (OAuth1) or access token (OAuth2)'),\n    )\n    token_secret = models.TextField(\n        blank=True,\n        verbose_name=_(\"token secret\"),\n        help_text=_('\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)'),\n    )\n    expires_at = models.DateTimeField(\n        blank=True, null=True, verbose_name=_(\"expires at\")\n    )\n\n    class Meta:\n        unique_together = (\"app\", \"account\")\n        verbose_name = _(\"social application token\")\n        verbose_name_plural = _(\"social application tokens\")\n\n    def __str__(self) -> str:\n        return f\"{self._meta.verbose_name} ({self.pk})\"\n\n\nclass SocialLogin:\n    \"\"\"\n    Represents a social user that is in the process of being logged\n    in. This consists of the following information:\n\n    `account` (`SocialAccount` instance): The social account being\n    logged in. Providers are not responsible for checking whether or\n    not an account already exists or not. Therefore, a provider\n    typically creates a new (unsaved) `SocialAccount` instance. The\n    `User` instance pointed to by the account (`account.user`) may be\n    prefilled by the provider for use as a starting point later on\n    during the signup process.\n\n    `token` (`SocialToken` instance): An optional access token token\n    that results from performing a successful authentication\n    handshake.\n\n    `state` (`dict`): The state to be preserved during the\n    authentication handshake. Note that this state may end up in the\n    url -- do not put any secrets in here. It currently only contains\n    the url to redirect to after login.\n\n    `email_addresses` (list of `EmailAddress`): Optional list of\n    email addresses retrieved from the provider.\n    \"\"\"\n\n    account: SocialAccount\n    token: SocialToken | None\n    email_addresses: list[EmailAddress]\n    state: dict\n    _did_authenticate_by_email: str | None\n    phone: str | None\n    phone_verified: bool\n\n    def __init__(\n        self,\n        user=None,\n        account: SocialAccount | None = None,\n        token: SocialToken | None = None,\n        email_addresses: list[EmailAddress] | None = None,\n        provider=None,\n        phone: str | None = None,\n        phone_verified: bool = False,\n    ) -> None:\n        self.provider = provider\n        if token:\n            assert token.account is None or token.account == account  # nosec\n        self.token = token\n        self.user = user\n        if account:\n            self.account = account\n        self.email_addresses = email_addresses if email_addresses else []\n        self.state = {}\n        self.phone = phone\n        self.phone_verified = phone_verified\n\n    def connect(self, request, user) -> None:\n        self.user = user\n        self.save(request, connect=True)\n        signals.social_account_added.send(\n            sender=SocialLogin, request=request, sociallogin=self\n        )\n\n        get_adapter().send_notification_mail(\n            \"socialaccount/email/account_connected\",\n            self.user,\n            context={\n                \"account\": self.account,\n                \"provider\": self.account.get_provider(),\n            },\n        )\n\n    @property\n    def is_headless(self) -> bool:\n        return bool(self.state.get(\"headless\"))\n\n    def serialize(self) -> dict[str, Any]:\n        serialize_instance = get_adapter().serialize_instance\n        ret = dict(\n            provider=self.provider.serialize(),\n            account=serialize_instance(self.account),\n            user=serialize_instance(self.user),\n            state=self.state,\n            email_addresses=[serialize_instance(ea) for ea in self.email_addresses],\n            phone=self.phone,\n            phone_verified=self.phone_verified,\n        )\n        if self.token:\n            ret[\"token\"] = serialize_instance(self.token)\n        return ret\n\n    @classmethod\n    def deserialize(cls, data: dict[str, Any]) -> \"SocialLogin\":\n        from allauth.socialaccount.providers.base.provider import Provider\n\n        if not isinstance(data, dict):\n            raise ValueError()\n\n        deserialize_instance = get_adapter().deserialize_instance\n        provider = Provider.deserialize(data.get(\"provider\"))\n        account = deserialize_instance(SocialAccount, data.get(\"account\"))\n        user = deserialize_instance(get_user_model(), data.get(\"user\"))\n        if token_data := data.get(\"token\"):\n            token = deserialize_instance(SocialToken, token_data)\n        else:\n            token = None\n        email_addresses = []\n        if eas := data.get(\"email_addresses\"):\n            for ea in eas:\n                email_address = deserialize_instance(EmailAddress, ea)\n                email_addresses.append(email_address)\n        ret = cls()\n        ret.provider = provider\n        ret.token = token\n        ret.account = account\n        ret.user = user\n        ret.email_addresses = email_addresses\n        ret.state = data.get(\"state\") or {}\n        ret.phone = data.get(\"phone\")\n        ret.phone_verified = data.get(\"phone_verified\", False)\n        return ret\n\n    def save(self, request, connect: bool = False) -> None:\n        \"\"\"\n        Saves a new account. Note that while the account is new,\n        the user may be an existing one (when connecting accounts)\n        \"\"\"\n        user = self.user\n        user.save()\n        self.account.user = user\n        self.account.save()\n        if app_settings.STORE_TOKENS and self.token:\n            self.token.account = self.account\n            self.token.save()\n        if connect:\n            # TODO: Add any new email addresses automatically?\n            pass\n        else:\n            setup_user_email(request, user, self.email_addresses)\n        if self.phone:\n            account_adapter = get_account_adapter()\n            if account_adapter._has_phone_impl:\n                account_adapter.set_phone(user, self.phone, self.phone_verified)\n\n    @property\n    def is_existing(self) -> bool:\n        \"\"\"When `False`, this social login represents a temporary account, not\n        yet backed by a database record.\n        \"\"\"\n        if self.user.pk is None:\n            return False\n        return get_user_model().objects.filter(pk=self.user.pk).exists()\n\n    def lookup(self) -> None:\n        \"\"\"Look up the existing local user account to which this social login\n        points, if any.\n        \"\"\"\n        self._did_authenticate_by_email = None\n        if not self._lookup_by_socialaccount():\n            self._lookup_by_email()\n\n    def _lookup_by_socialaccount(self) -> bool:\n        assert not self.is_existing  # nosec\n        try:\n            a = SocialAccount.objects.get(\n                provider=self.account.provider, uid=self.account.uid\n            )\n            # Update account\n            a.extra_data = self.account.extra_data\n            self.account = a\n            self.user = self.account.user\n            a.save()\n            signals.social_account_updated.send(\n                sender=SocialLogin, request=context.request, sociallogin=self\n            )\n            self._store_token()\n            return True\n        except SocialAccount.DoesNotExist:\n            return False\n\n    def _store_token(self) -> None:\n        # Update token\n        if not app_settings.STORE_TOKENS or not self.token:\n            return\n        assert not self.token.pk  # nosec\n        app = self.token.app\n        if app and not app.pk:\n            # If the app is not stored in the db, leave the FK empty.\n            app = None\n        try:\n            t = SocialToken.objects.get(account=self.account, app=app)\n            t.token = self.token.token\n            if self.token.token_secret:\n                # only update the refresh token if we got one\n                # many oauth2 providers do not resend the refresh token\n                t.token_secret = self.token.token_secret\n            t.expires_at = self.token.expires_at\n            t.save()\n            self.token = t\n        except SocialToken.DoesNotExist:\n            self.token.account = self.account\n            self.token.app = app\n            self.token.save()\n\n    def _lookup_by_email(self) -> None:\n        emails = [e.email for e in self.email_addresses if e.verified]\n        for email in emails:\n            if not get_adapter().can_authenticate_by_email(self, email):\n                continue\n            users = filter_users_by_email(email, prefer_verified=True)\n            if users:\n                self.user = users[0]\n                self._did_authenticate_by_email = email\n                return\n\n    def _accept_login(self, request) -> None:\n        from allauth.socialaccount.internal.flows.email_authentication import (\n            wipe_password,\n        )\n\n        if self._did_authenticate_by_email:\n            wipe_password(request, self.user, self._did_authenticate_by_email)\n            if app_settings.EMAIL_AUTHENTICATION_AUTO_CONNECT:\n                self.connect(context.request, self.user)\n\n    def get_redirect_url(self, request) -> str | None:\n        url = self.state.get(\"next\")\n        return url\n\n    @classmethod\n    def state_from_request(cls, request) -> dict[str, Any]:\n        \"\"\"\n        TODO: Deprecated! To be integrated with provider.redirect()\n        \"\"\"\n        state = {}\n        next_url = get_next_redirect_url(request)\n        if next_url:\n            state[\"next\"] = next_url\n        state[\"process\"] = get_request_param(request, \"process\", \"login\")\n        state[\"scope\"] = get_request_param(request, \"scope\", \"\")\n        state[\"auth_params\"] = get_request_param(request, \"auth_params\", \"\")\n        return state\n\n    @classmethod\n    def stash_state(cls, request, state: dict[str, Any] | None = None) -> str:\n        if state is None:\n            # Only for providers that don't support redirect() yet.\n            state = cls.state_from_request(request)\n        return statekit.stash_state(request, state)\n\n    @classmethod\n    def unstash_state(cls, request) -> dict[str, Any] | None:\n        state = statekit.unstash_last_state(request)\n        if state is None:\n            raise PermissionDenied()\n        return state\n"
  },
  {
    "path": "allauth/socialaccount/providers/__init__.py",
    "content": "import importlib\nfrom collections import OrderedDict\n\nfrom django.apps import apps\nfrom django.conf import settings\n\nfrom allauth.utils import import_attribute\n\n\nclass ProviderRegistry:\n    def __init__(self):\n        self.provider_map = OrderedDict()\n        self.loaded = False\n\n    def get_class_list(self):\n        self.load()\n        return list(self.provider_map.values())\n\n    def register(self, cls):\n        self.provider_map[cls.id] = cls\n\n    def get_class(self, id):\n        return self.provider_map.get(id)\n\n    def as_choices(self):\n        self.load()\n        for provider_cls in self.provider_map.values():\n            yield (provider_cls.id, provider_cls.name)\n\n    def load(self):\n        # TODO: Providers register with the provider registry when\n        # loaded. Here, we build the URLs for all registered providers. So, we\n        # really need to be sure all providers did register, which is why we're\n        # forcefully importing the `provider` modules here. The overall\n        # mechanism is way to magical and depends on the import order et al, so\n        # all of this really needs to be revisited.\n        if not self.loaded:\n            for app_config in apps.get_app_configs():\n                try:\n                    module_name = f\"{app_config.name}.provider\"\n                    provider_module = importlib.import_module(module_name)\n                except ImportError as e:\n                    if e.name != module_name:\n                        raise\n                else:\n                    provider_settings = getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {})\n                    for cls in getattr(provider_module, \"provider_classes\", []):\n                        provider_class = provider_settings.get(cls.id, {}).get(\n                            \"provider_class\"\n                        )\n                        if provider_class:\n                            cls = import_attribute(provider_class)\n                        self.register(cls)\n            self.loaded = True\n\n\nregistry = ProviderRegistry()\n"
  },
  {
    "path": "allauth/socialaccount/providers/agave/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/agave/provider.py",
    "content": "from allauth.socialaccount.providers.agave.views import AgaveAdapter\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass AgaveAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"web_url\", \"dflt\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"avatar_url\", \"dflt\")\n\n\nclass AgaveProvider(OAuth2Provider):\n    id = \"agave\"\n    name = \"Agave\"\n    account_class = AgaveAccount\n    oauth2_adapter_class = AgaveAdapter\n\n    def extract_uid(self, data):\n        return str(data.get(\"create_time\"))\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"username\", \"\"),\n            name=(f\"{data.get('first_name', '')} {data.get('last_name', '')}\".strip()),\n        )\n\n    def get_default_scope(self):\n        scope = [\"PRODUCTION\"]\n        return scope\n\n\nprovider_classes = [AgaveProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/agave/urls.py",
    "content": "from allauth.socialaccount.providers.agave.provider import AgaveProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(AgaveProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/agave/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass AgaveAdapter(OAuth2Adapter):\n    provider_id = \"agave\"\n\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n    provider_base_url = settings.get(\"API_URL\", \"https://public.agaveapi.co\")\n\n    access_token_url = f\"{provider_base_url}/token\"\n    authorize_url = f\"{provider_base_url}/authorize\"\n    profile_url = f\"{provider_base_url}/profiles/v2/me\"\n\n    def complete_login(self, request, app, token, response):\n        with get_adapter().get_requests_session() as sess:\n            extra_data = sess.get(\n                self.profile_url,\n                params={\"access_token\": token.token},\n                headers={\"Authorization\": f\"Bearer {token.token}\"},\n            )\n            user_profile = extra_data.json().get(\"result\", {})\n\n        return self.get_provider().sociallogin_from_response(request, user_profile)\n\n\noauth2_login = OAuth2LoginView.adapter_view(AgaveAdapter)\noauth2_callback = OAuth2CallbackView.adapter_view(AgaveAdapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/amazon/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/amazon/provider.py",
    "content": "from allauth.socialaccount.providers.amazon.views import AmazonOAuth2Adapter\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass AmazonAccount(ProviderAccount):\n    pass\n\n\nclass AmazonProvider(OAuth2Provider):\n    id = \"amazon\"\n    name = \"Amazon\"\n    account_class = AmazonAccount\n    oauth2_adapter_class = AmazonOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"profile\"]\n\n    def extract_uid(self, data):\n        return str(data[\"user_id\"])\n\n    def extract_common_fields(self, data):\n        # Hackish way of splitting the fullname.\n        # Assumes no middlenames.\n        name = data.get(\"name\", \"\")\n        first_name, last_name = name, \"\"\n        if name and \" \" in name:\n            first_name, last_name = name.split(\" \", 1)\n        return dict(\n            email=data.get(\"email\", \"\"), last_name=last_name, first_name=first_name\n        )\n\n\nprovider_classes = [AmazonProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/amazon/urls.py",
    "content": "from allauth.socialaccount.providers.amazon.provider import AmazonProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(AmazonProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/amazon/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass AmazonOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"amazon\"\n    access_token_url = \"https://api.amazon.com/auth/o2/token\"  # nosec\n    authorize_url = \"https://www.amazon.com/ap/oa\"\n    profile_url = \"https://api.amazon.com/user/profile\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, params={\"access_token\": token.token})\n            response.raise_for_status()\n            extra_data = response.json()\n        if \"Profile\" in extra_data:\n            extra_data = {\n                \"user_id\": extra_data[\"Profile\"][\"CustomerId\"],\n                \"name\": extra_data[\"Profile\"][\"Name\"],\n                \"email\": extra_data[\"Profile\"][\"PrimaryEmail\"],\n            }\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(AmazonOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(AmazonOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/amazon_cognito/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/amazon_cognito/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.amazon_cognito.utils import (\n    convert_to_python_bool_if_value_is_json_string_bool,\n)\nfrom allauth.socialaccount.providers.amazon_cognito.views import (\n    AmazonCognitoOAuth2Adapter,\n)\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass AmazonCognitoAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"picture\")\n\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"profile\")\n\n\nclass AmazonCognitoProvider(OAuth2Provider):\n    id = \"amazon_cognito\"\n    name = \"Amazon Cognito\"\n    account_class = AmazonCognitoAccount\n    oauth2_adapter_class = AmazonCognitoOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"sub\"])\n\n    def extract_common_fields(self, data):\n        return {\n            \"email\": data.get(\"email\"),\n            \"first_name\": data.get(\"given_name\"),\n            \"last_name\": data.get(\"family_name\"),\n        }\n\n    def get_default_scope(self):\n        return [\"openid\", \"profile\", \"email\"]\n\n    def extract_email_addresses(self, data):\n        email = data.get(\"email\")\n        verified = convert_to_python_bool_if_value_is_json_string_bool(\n            data.get(\"email_verified\", False)\n        )\n\n        return (\n            [EmailAddress(email=email, verified=verified, primary=True)]\n            if email\n            else []\n        )\n\n    def extract_extra_data(self, data):\n        ret = dict(data)\n        phone_number_verified = data.get(\"phone_number_verified\")\n        if phone_number_verified is not None:\n            ret[\"phone_number_verified\"] = (\n                convert_to_python_bool_if_value_is_json_string_bool(\n                    \"phone_number_verified\"\n                )\n            )\n        return ret\n\n    @classmethod\n    def get_slug(cls):\n        # IMPORTANT: Amazon Cognito does not support `_` characters\n        #            as part of their redirect URI.\n        return super().get_slug().replace(\"_\", \"-\")\n\n\nprovider_classes = [AmazonCognitoProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/amazon_cognito/urls.py",
    "content": "from allauth.socialaccount.providers.amazon_cognito.provider import (\n    AmazonCognitoProvider,\n)\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(AmazonCognitoProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/amazon_cognito/utils.py",
    "content": "def convert_to_python_bool_if_value_is_json_string_bool(s):\n    if s == \"true\":\n        return True\n    elif s == \"false\":\n        return False\n\n    return s\n"
  },
  {
    "path": "allauth/socialaccount/providers/amazon_cognito/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.models import SocialToken\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass AmazonCognitoOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"amazon_cognito\"\n\n    DOMAIN_KEY_MISSING_ERROR = (\n        '\"DOMAIN\" key is missing in Amazon Cognito configuration.'\n    )\n\n    @property\n    def settings(self):\n        return app_settings.PROVIDERS.get(self.provider_id, {})\n\n    @property\n    def domain(self):\n        domain = self.settings.get(\"DOMAIN\")\n\n        if domain is None:\n            raise ValueError(self.DOMAIN_KEY_MISSING_ERROR)\n\n        return domain\n\n    @property\n    def access_token_url(self):\n        return f\"{self.domain}/oauth2/token\"\n\n    @property\n    def authorize_url(self):\n        return f\"{self.domain}/oauth2/authorize\"\n\n    @property\n    def profile_url(self):\n        return f\"{self.domain}/oauth2/userInfo\"\n\n    def complete_login(self, request, app, token: SocialToken, **kwargs):\n        headers = {\n            \"Authorization\": f\"Bearer {token.token}\",\n        }\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, headers=headers)\n            response.raise_for_status()\n            extra_data = response.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(AmazonCognitoOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(AmazonCognitoOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/angellist/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/angellist/provider.py",
    "content": "from allauth.socialaccount.providers.angellist.views import AngelListOAuth2Adapter\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass AngelListAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"angellist_url\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"image\")\n\n\nclass AngelListProvider(OAuth2Provider):\n    id = \"angellist\"\n    name = \"AngelList\"\n    account_class = AngelListAccount\n    oauth2_adapter_class = AngelListOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"angellist_url\").split(\"/\")[-1],\n            name=data.get(\"name\"),\n        )\n\n\nprovider_classes = [AngelListProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/angellist/urls.py",
    "content": "from allauth.socialaccount.providers.angellist.provider import AngelListProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(AngelListProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/angellist/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass AngelListOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"angellist\"\n    access_token_url = \"https://angel.co/api/oauth/token/\"  # nosec\n    authorize_url = \"https://angel.co/api/oauth/authorize/\"\n    profile_url = \"https://api.angel.co/1/me/\"\n    supports_state = False\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, params={\"access_token\": token.token})\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(AngelListOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(AngelListOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/apple/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/apple/apple_session.py",
    "content": "from allauth.socialaccount.sessions import LoginSession\n\n\nAPPLE_SESSION_COOKIE_NAME = \"apple-login-session\"\n\n\ndef get_apple_session(request):\n    return LoginSession(request, \"apple_login_session\", APPLE_SESSION_COOKIE_NAME)\n"
  },
  {
    "path": "allauth/socialaccount/providers/apple/client.py",
    "content": "import time\nfrom http import HTTPStatus\nfrom urllib.parse import parse_qsl, quote, urlencode\n\nfrom django.core.exceptions import ImproperlyConfigured\n\nimport jwt\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Client, OAuth2Error\n\n\ndef jwt_encode(*args, **kwargs):\n    resp = jwt.encode(*args, **kwargs)\n    if isinstance(resp, bytes):\n        # For PyJWT <2\n        resp = resp.decode(\"utf-8\")\n    return resp\n\n\nclass Scope:\n    EMAIL = \"email\"\n    NAME = \"name\"\n\n\nclass AppleOAuth2Client(OAuth2Client):\n    \"\"\"\n    Custom client because `Sign In With Apple`:\n        * requires `response_mode` field in redirect_url\n        * requires special `client_secret` as JWT\n    \"\"\"\n\n    def generate_client_secret(self) -> str:\n        \"\"\"Create a JWT signed with an apple provided private key\"\"\"\n        now = int(time.time())\n        app = get_adapter(self.request).get_app(self.request, \"apple\")\n        if not app.key:\n            raise ImproperlyConfigured(\"Apple 'key' missing\")\n        certificate_key = app.settings.get(\"certificate_key\")\n        if not certificate_key:\n            raise ImproperlyConfigured(\"Apple 'certificate_key' missing\")\n        claims = {\n            \"iss\": app.key,\n            \"aud\": \"https://appleid.apple.com\",\n            \"sub\": self.get_client_id(),\n            \"iat\": now,\n            \"exp\": now + 60 * 60,\n        }\n        headers = {\"kid\": self.consumer_secret, \"alg\": \"ES256\"}\n        client_secret = jwt_encode(\n            payload=claims, key=certificate_key, algorithm=\"ES256\", headers=headers\n        )\n        return client_secret\n\n    def get_client_id(self) -> str:\n        \"\"\"We support multiple client_ids, but use the first one for api calls\"\"\"\n        return self.consumer_key.split(\",\")[0]\n\n    def get_access_token(self, code, pkce_code_verifier=None):\n        url = self.access_token_url\n        client_secret = self.generate_client_secret()\n        data = {\n            \"client_id\": self.get_client_id(),\n            \"code\": code,\n            \"grant_type\": \"authorization_code\",\n            \"redirect_uri\": self.callback_url,\n            \"client_secret\": client_secret,\n        }\n        if pkce_code_verifier:\n            data[\"code_verifier\"] = pkce_code_verifier\n        self._strip_empty_keys(data)\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.request(\n                self.access_token_method, url, data=data, headers=self.headers\n            )\n        access_token = None\n        if resp.status_code in [HTTPStatus.OK, HTTPStatus.CREATED]:\n            try:\n                access_token = resp.json()\n            except ValueError:\n                access_token = dict(parse_qsl(resp.text))\n        if not access_token or \"access_token\" not in access_token:\n            raise OAuth2Error(f\"Error retrieving access token: {resp.content}\")\n        return access_token\n\n    def get_redirect_url(self, authorization_url, scope, extra_params) -> str:\n        scope = self.scope_delimiter.join(set(scope))\n        params = {\n            \"client_id\": self.get_client_id(),\n            \"redirect_uri\": self.callback_url,\n            \"response_mode\": \"form_post\",\n            \"scope\": scope,\n            \"response_type\": \"code id_token\",\n        }\n        if self.state:\n            params[\"state\"] = self.state\n        params.update(extra_params)\n        return f\"{authorization_url}?{urlencode(params, quote_via=quote)}\"\n"
  },
  {
    "path": "allauth/socialaccount/providers/apple/provider.py",
    "content": "import requests\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.app_settings import QUERY_EMAIL\nfrom allauth.socialaccount.providers.apple.views import AppleOAuth2Adapter\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass AppleAccount(ProviderAccount):\n    def to_str(self):\n        email = self.account.extra_data.get(\"email\")\n        if email and not email.lower().endswith(\"@privaterelay.appleid.com\"):\n            return email\n\n        name = self.account.extra_data.get(\"name\") or {}\n        if name.get(\"firstName\") or name.get(\"lastName\"):\n            full_name = f\"{name['firstName'] or ''} {name['lastName'] or ''}\"\n            full_name = full_name.strip()\n            if full_name:\n                return full_name\n\n        return super().to_str()\n\n\nclass AppleProvider(OAuth2Provider):\n    id = \"apple\"\n    name = \"Apple\"\n    account_class = AppleAccount\n    oauth2_adapter_class = AppleOAuth2Adapter\n    supports_token_authentication = True\n\n    def extract_uid(self, data):\n        return str(data[\"sub\"])\n\n    def extract_common_fields(self, data):\n        fields = {\"email\": data.get(\"email\")}\n\n        # If the name was provided\n        name = data.get(\"name\")\n        if name:\n            fields[\"first_name\"] = name.get(\"firstName\", \"\")\n            fields[\"last_name\"] = name.get(\"lastName\", \"\")\n\n        return fields\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"email\")\n        verified = data.get(\"email_verified\")\n        if isinstance(verified, str):\n            verified = verified.lower() == \"true\"\n        if email:\n            ret.append(\n                EmailAddress(\n                    email=email,\n                    verified=verified,\n                    primary=True,\n                )\n            )\n        return ret\n\n    def get_default_scope(self):\n        scopes = [\"name\"]\n        if QUERY_EMAIL:\n            scopes.append(\"email\")\n        return scopes\n\n    def verify_token(self, request, token):\n        from allauth.socialaccount.providers.apple.views import AppleOAuth2Adapter\n\n        id_token = token.get(\"id_token\")\n        if not id_token:\n            raise get_adapter().validation_error(\"invalid_token\")\n        try:\n            identity_data = AppleOAuth2Adapter.get_verified_identity_data(\n                self, id_token\n            )\n        except (OAuth2Error, requests.RequestException) as e:\n            raise get_adapter().validation_error(\"invalid_token\") from e\n        login = self.sociallogin_from_response(request, identity_data)\n        return login\n\n    def get_auds(self):\n        return [aud.strip() for aud in self.app.client_id.split(\",\")]\n\n\nprovider_classes = [AppleProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/apple/urls.py",
    "content": "from django.urls import path\n\nfrom allauth.socialaccount.providers.apple.provider import AppleProvider\nfrom allauth.socialaccount.providers.apple.views import oauth2_finish_login\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(AppleProvider)\nurlpatterns += [\n    path(\n        f\"{AppleProvider.get_slug()}/login/callback/finish/\",\n        oauth2_finish_login,\n        name=\"apple_finish_callback\",\n    ),\n]\n"
  },
  {
    "path": "allauth/socialaccount/providers/apple/views.py",
    "content": "import json\nfrom datetime import timedelta\n\nfrom django.http import HttpResponseNotAllowed, HttpResponseRedirect\nfrom django.urls import reverse\nfrom django.utils import timezone\nfrom django.utils.http import urlencode\nfrom django.views.decorators.csrf import csrf_exempt\n\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.socialaccount.internal import jwtkit\nfrom allauth.socialaccount.models import SocialToken\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\nfrom allauth.utils import build_absolute_uri, get_request_param\n\nfrom .apple_session import get_apple_session\nfrom .client import AppleOAuth2Client\n\n\nclass AppleOAuth2Adapter(OAuth2Adapter):\n    client_class = AppleOAuth2Client\n    provider_id = \"apple\"\n    access_token_url = \"https://appleid.apple.com/auth/token\"  # nosec\n    authorize_url = \"https://appleid.apple.com/auth/authorize\"\n    public_key_url = \"https://appleid.apple.com/auth/keys\"\n\n    @classmethod\n    def get_verified_identity_data(cls, provider, id_token):\n        data = jwtkit.verify_and_decode(\n            credential=id_token,\n            keys_url=cls.public_key_url,\n            issuer=\"https://appleid.apple.com\",\n            audience=provider.get_auds(),\n            lookup_kid=jwtkit.lookup_kid_jwk,\n        )\n        return data\n\n    def parse_token(self, data):\n        token = SocialToken(\n            token=data[\"access_token\"],\n        )\n        token.token_secret = data.get(\"refresh_token\", \"\")\n\n        expires_in = data.get(self.expires_in_key)\n        if expires_in:\n            token.expires_at = timezone.now() + timedelta(seconds=int(expires_in))\n\n        # `user_data` is a big flat dictionary with the parsed JWT claims\n        # access_tokens, and user info from the apple post.\n        identity_data = AppleOAuth2Adapter.get_verified_identity_data(\n            self.get_provider(), data[\"id_token\"]\n        )\n        token.user_data = {**data, **identity_data}\n\n        return token\n\n    def complete_login(self, request, app, token, **kwargs):\n        extra_data = token.user_data\n        login = self.get_provider().sociallogin_from_response(\n            request=request, response=extra_data\n        )\n        login.state[\"id_token\"] = token.user_data\n\n        # We can safely remove the apple login session now\n        # Note: The cookie will remain, but it's set to delete on browser close\n        get_apple_session(request).delete()\n        return login\n\n    def get_user_scope_data(self, request):\n        user_scope_data = request.apple_login_session.get(\"user\", \"\")\n        try:\n            return json.loads(user_scope_data)\n        except json.JSONDecodeError:\n            # We do not care much about user scope data as it maybe blank\n            # so return blank dictionary instead\n            return {}\n\n    def get_access_token_data(self, request, app, client, pkce_code_verifier=None):\n        \"\"\"We need to gather the info from the apple specific login\"\"\"\n        apple_session = get_apple_session(request)\n\n        # Exchange `code`\n        code = get_request_param(request, \"code\")\n        access_token_data = client.get_access_token(\n            code, pkce_code_verifier=pkce_code_verifier\n        )\n\n        id_token = access_token_data.get(\"id_token\", None)\n        # In case of missing id_token in access_token_data\n        if id_token is None:\n            id_token = apple_session.store.get(\"id_token\")\n\n        return {\n            **access_token_data,\n            **self.get_user_scope_data(request),\n            \"id_token\": id_token,\n        }\n\n\n@csrf_exempt\n@login_not_required\ndef apple_post_callback(request, finish_endpoint_name=\"apple_finish_callback\"):\n    \"\"\"\n    Apple uses a `form_post` response type, which due to\n    CORS/Samesite-cookie rules means this request cannot access\n    the request since the session cookie is unavailable.\n\n    We work around this by storing the apple response in a\n    separate, temporary session and redirecting to a more normal\n    oauth flow.\n\n    args:\n        finish_endpoint_name (str): The name of a defined URL, which can be\n            overridden in your url configuration if you have more than one\n            callback endpoint.\n    \"\"\"\n    if request.method != \"POST\":\n        return HttpResponseNotAllowed([\"POST\"])\n    apple_session = get_apple_session(request)\n\n    # Add regular OAuth2 params to the URL - reduces the overrides required\n    keys_to_put_in_url = [\"code\", \"state\", \"error\"]\n    url_params = {}\n    for key in keys_to_put_in_url:\n        value = get_request_param(request, key, \"\")\n        if value:\n            url_params[key] = value\n\n    # Add other params to the apple_login_session\n    keys_to_save_to_session = [\"user\", \"id_token\"]\n    for key in keys_to_save_to_session:\n        apple_session.store[key] = get_request_param(request, key, \"\")\n\n    url = build_absolute_uri(request, reverse(finish_endpoint_name))\n    response = HttpResponseRedirect(f\"{url}?{urlencode(url_params)}\")\n    apple_session.save(response)\n    return response\n\n\noauth2_login = OAuth2LoginView.adapter_view(AppleOAuth2Adapter)\noauth2_callback = apple_post_callback\noauth2_finish_login = OAuth2CallbackView.adapter_view(AppleOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/asana/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/asana/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/asana/provider.py",
    "content": "from allauth.socialaccount.providers.asana.views import AsanaOAuth2Adapter\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass AsanaAccount(ProviderAccount):\n    pass\n\n\nclass AsanaProvider(OAuth2Provider):\n    id = \"asana\"\n    name = \"Asana\"\n    account_class = AsanaAccount\n    oauth2_adapter_class = AsanaOAuth2Adapter\n\n    def extract_uid(self, data):\n        if \"gid\" not in data:\n            # `id` is legacy: https://developers.asana.com/reference/getuser\n            return str(data[\"id\"])\n        return str(data[\"gid\"])\n\n    def extract_common_fields(self, data):\n        return dict(email=data.get(\"email\"), name=data.get(\"name\"))\n\n\nprovider_classes = [AsanaProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/asana/urls.py",
    "content": "from allauth.socialaccount.providers.asana.provider import AsanaProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(AsanaProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/asana/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass AsanaOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"asana\"\n    access_token_url = \"https://app.asana.com/-/oauth_token\"  # nosec\n    authorize_url = \"https://app.asana.com/-/oauth_authorize\"\n    profile_url = \"https://app.asana.com/api/1.0/users/me\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, params={\"access_token\": token.token})\n            extra_data = resp.json()[\"data\"]\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(AsanaOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(AsanaOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/atlassian/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/atlassian/provider.py",
    "content": "from allauth.socialaccount.providers.atlassian.views import AtlassianOAuth2Adapter\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass AtlassianAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"picture\")\n\n\nclass AtlassianProvider(OAuth2Provider):\n    id = \"atlassian\"\n    name = \"Atlassian\"\n    account_class = AtlassianAccount\n    oauth2_adapter_class = AtlassianOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"account_id\"]\n\n    def extract_common_fields(self, data):\n        return {\n            \"email\": data.get(\"email\"),\n            \"name\": data.get(\"name\"),\n            \"username\": data.get(\"nickname\"),\n            \"email_verified\": data.get(\"email_verified\"),\n        }\n\n    def get_default_scope(self):\n        return [\"read:me\"]\n\n    def get_auth_params(self):\n        params = super().get_auth_params()\n        params.update({\"audience\": \"api.atlassian.com\", \"prompt\": \"consent\"})\n        return params\n\n\nprovider_classes = [AtlassianProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/atlassian/urls.py",
    "content": "from allauth.socialaccount.providers.atlassian.provider import AtlassianProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(AtlassianProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/atlassian/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.models import SocialToken\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass AtlassianOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"atlassian\"\n    access_token_url = \"https://api.atlassian.com/oauth/token\"  # nosec\n    authorize_url = \"https://auth.atlassian.com/authorize\"\n    profile_url = \"https://api.atlassian.com/me\"\n\n    def complete_login(self, request, app, token: SocialToken, **kwargs):\n        headers = {\n            \"Authorization\": f\"Bearer {token.token}\",\n            \"Accept\": \"application/json\",\n        }\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, headers=headers)\n            response.raise_for_status()\n            data = response.json()\n        return self.get_provider().sociallogin_from_response(request, data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(AtlassianOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(AtlassianOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/auth0/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/auth0/provider.py",
    "content": "from allauth.socialaccount.providers.auth0.views import Auth0OAuth2Adapter\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass Auth0Account(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"picture\")\n\n\nclass Auth0Provider(OAuth2Provider):\n    id = \"auth0\"\n    name = \"Auth0\"\n    account_class = Auth0Account\n    oauth2_adapter_class = Auth0OAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"openid\", \"profile\", \"email\"]\n\n    def extract_uid(self, data):\n        return str(data[\"sub\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"username\"),\n            name=data.get(\"name\"),\n        )\n\n\nprovider_classes = [Auth0Provider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/auth0/urls.py",
    "content": "from allauth.socialaccount.providers.auth0.provider import Auth0Provider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(Auth0Provider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/auth0/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass Auth0OAuth2Adapter(OAuth2Adapter):\n    provider_id = \"auth0\"\n\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n    provider_base_url = settings.get(\"AUTH0_URL\")\n\n    access_token_url = f\"{provider_base_url}/oauth/token\"\n    authorize_url = f\"{provider_base_url}/authorize\"\n    profile_url = f\"{provider_base_url}/userinfo\"\n\n    def complete_login(self, request, app, token, response):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, params={\"access_token\": token.token})\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(Auth0OAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(Auth0OAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/authentiq/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/authentiq/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.providers.authentiq.views import AuthentiqOAuth2Adapter\nfrom allauth.socialaccount.providers.base import AuthAction, ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass Scope:\n    NAME = \"aq:name\"\n    EMAIL = \"email\"\n    PHONE = \"phone\"\n    ADDRESS = \"address\"\n    LOCATION = \"aq:location\"\n    PUSH = \"aq:push\"\n\n\nIDENTITY_CLAIMS = frozenset(\n    [\n        \"sub\",\n        \"name\",\n        \"given_name\",\n        \"family_name\",\n        \"middle_name\",\n        \"nickname\",\n        \"preferred_username\",\n        \"profile\",\n        \"picture\",\n        \"website\",\n        \"email\",\n        \"email_verified\",\n        \"gender\",\n        \"birthdate\",\n        \"zoneinfo\",\n        \"locale\",\n        \"phone_number\",\n        \"phone_number_verified\",\n        \"address\",\n        \"updated_at\",\n        \"aq:location\",\n    ]\n)\n\n\nclass AuthentiqAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"profile\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"picture\")\n\n\nclass AuthentiqProvider(OAuth2Provider):\n    id = \"authentiq\"\n    name = \"Authentiq\"\n    account_class = AuthentiqAccount\n    oauth2_adapter_class = AuthentiqOAuth2Adapter\n\n    def get_scope_from_request(self, request):\n        scope = set(super().get_scope_from_request(request))\n        scope.add(\"openid\")\n\n        if Scope.EMAIL in scope:\n            modifiers = \"\"\n            if app_settings.EMAIL_REQUIRED:\n                modifiers += \"r\"\n            if app_settings.EMAIL_VERIFICATION:\n                modifiers += \"s\"\n            if modifiers:\n                scope.add(f\"{Scope.EMAIL}~{modifiers}\")\n                scope.remove(Scope.EMAIL)\n        return list(scope)\n\n    def get_default_scope(self):\n        scope = [Scope.NAME, Scope.PUSH]\n        if app_settings.QUERY_EMAIL:\n            scope.append(Scope.EMAIL)\n        return scope\n\n    def get_auth_params_from_request(self, request, action):\n        ret = super().get_auth_params_from_request(request, action)\n        if action == AuthAction.REAUTHENTICATE:\n            ret[\"prompt\"] = \"select_account\"\n        return ret\n\n    def extract_uid(self, data):\n        return str(data[\"sub\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            username=data.get(\"preferred_username\", data.get(\"given_name\")),\n            email=data.get(\"email\"),\n            name=data.get(\"name\"),\n            first_name=data.get(\"given_name\"),\n            last_name=data.get(\"family_name\"),\n        )\n\n    def extract_extra_data(self, data):\n        return {k: v for k, v in data.items() if k in IDENTITY_CLAIMS}\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"email\")\n        if email and data.get(\"email_verified\"):\n            ret.append(EmailAddress(email=email, verified=True, primary=True))\n        return ret\n\n\nprovider_classes = [AuthentiqProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/authentiq/urls.py",
    "content": "from allauth.socialaccount.providers.authentiq.provider import AuthentiqProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(AuthentiqProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/authentiq/views.py",
    "content": "from urllib.parse import urljoin\n\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass AuthentiqOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"authentiq\"\n\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n\n    provider_url = settings.get(\"PROVIDER_URL\", \"https://connect.authentiq.io/\")\n    if not provider_url.endswith(\"/\"):\n        provider_url += \"/\"\n\n    access_token_url = urljoin(provider_url, \"token\")\n    authorize_url = urljoin(provider_url, \"authorize\")\n    profile_url = urljoin(provider_url, \"userinfo\")\n\n    def complete_login(self, request, app, token, **kwargs):\n        auth = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=auth)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(AuthentiqOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(AuthentiqOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/baidu/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/baidu/provider.py",
    "content": "from allauth.socialaccount.providers.baidu.views import BaiduOAuth2Adapter\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass BaiduAccount(ProviderAccount):\n    def get_profile_url(self):\n        return f\"https://www.baidu.com/p/{self.account.extra_data.get('uname')}\"\n\n    def get_avatar_url(self):\n        portrait = self.account.extra_data.get(\"portrait\")\n        return f\"https://tb.himg.baidu.com/sys/portraitn/item/{portrait}\"\n\n    def to_str(self):\n        dflt = super().to_str()\n        return self.account.extra_data.get(\"uname\", dflt)\n\n\nclass BaiduProvider(OAuth2Provider):\n    id = \"baidu\"\n    name = \"Baidu\"\n    account_class = BaiduAccount\n    oauth2_adapter_class = BaiduOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"uid\"]\n\n    def extract_common_fields(self, data):\n        return dict(username=data.get(\"uid\"), name=data.get(\"uname\"))\n\n\nprovider_classes = [BaiduProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/baidu/urls.py",
    "content": "from allauth.socialaccount.providers.baidu.provider import BaiduProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(BaiduProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/baidu/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass BaiduOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"baidu\"\n    access_token_url = \"https://openapi.baidu.com/oauth/2.0/token\"  # nosec\n    authorize_url = \"https://openapi.baidu.com/oauth/2.0/authorize\"\n    profile_url = (\n        \"https://openapi.baidu.com/rest/2.0/passport/users/getLoggedInUser\"  # noqa\n    )\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, params={\"access_token\": token.token})\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(BaiduOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(BaiduOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/base/__init__.py",
    "content": "from allauth.socialaccount.providers.base.provider import Provider  # noqa\nfrom allauth.socialaccount.providers.base.provider import ProviderAccount  # noqa\nfrom allauth.socialaccount.providers.base.provider import ProviderException  # noqa\n\nfrom .constants import AuthAction, AuthError, AuthProcess  # noqa\n"
  },
  {
    "path": "allauth/socialaccount/providers/base/constants.py",
    "content": "class AuthProcess:\n    LOGIN = \"login\"\n    CONNECT = \"connect\"\n    REDIRECT = \"redirect\"\n\n\nclass AuthAction:\n    AUTHENTICATE = \"authenticate\"\n    REAUTHENTICATE = \"reauthenticate\"\n    REREQUEST = \"rerequest\"\n\n\nclass AuthError:\n    UNKNOWN = \"unknown\"\n    CANCELLED = \"cancelled\"  # Cancelled on request of user\n    DENIED = \"denied\"  # Denied by server\n"
  },
  {
    "path": "allauth/socialaccount/providers/base/provider.py",
    "content": "from typing import Any\n\nfrom django.core.exceptions import (\n    ImproperlyConfigured,\n    PermissionDenied,\n    ValidationError,\n)\nfrom django.http import HttpResponse\n\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.internal.emailkit import valid_email_or_none\nfrom allauth.account.utils import get_next_redirect_url, get_request_param\nfrom allauth.core import context\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.internal import statekit\nfrom allauth.socialaccount.providers.base.constants import AuthProcess\n\n\nclass ProviderException(Exception):\n    pass\n\n\nclass Provider:\n    name: str  # Provided by subclasses\n    id: str  # Provided by subclasses\n    slug: str | None = None  # Provided by subclasses\n\n    uses_apps = True\n    supports_redirect = False\n    # Indicates whether or not this provider supports logging in by posting an\n    # access/id-token.\n    supports_token_authentication = False\n\n    def __init__(self, request, app=None) -> None:\n        self.request = request\n        if self.uses_apps and app is None:\n            raise ValueError(\"missing: app\")\n        self.app = app\n\n    def __str__(self) -> str:\n        return self.name\n\n    @classmethod\n    def get_slug(cls) -> str:\n        return cls.slug or cls.id\n\n    def get_login_url(self, request, next=None, **kwargs) -> str:\n        \"\"\"\n        Builds the URL to redirect to when initiating a login for this\n        provider.\n        \"\"\"\n        raise NotImplementedError(f\"get_login_url() for {self.name}\")\n\n    def redirect_from_request(self, request) -> HttpResponse:\n        kwargs = self.get_redirect_from_request_kwargs(request)\n        return self.redirect(request, **kwargs)\n\n    def get_redirect_from_request_kwargs(self, request) -> dict:\n        kwargs = {}\n        next_url = get_next_redirect_url(request)\n        if next_url:\n            kwargs[\"next_url\"] = next_url\n        kwargs[\"process\"] = get_request_param(request, \"process\", AuthProcess.LOGIN)\n        return kwargs\n\n    def redirect(\n        self, request, process, next_url=None, data=None, **kwargs\n    ) -> HttpResponse:\n        \"\"\"\n        Initiate a redirect to the provider.\n        \"\"\"\n        raise NotImplementedError()\n\n    def verify_token(self, request, token):\n        \"\"\"\n        Verifies the token, returning a `SocialLogin` instance when valid.\n        Raises a `ValidationError` otherwise.\n        \"\"\"\n        raise NotImplementedError()\n\n    def media_js(self, request) -> str:\n        \"\"\"\n        Some providers may require extra scripts (e.g. a Facebook connect)\n        \"\"\"\n        return \"\"\n\n    def wrap_account(self, social_account):\n        return self.account_class(social_account)\n\n    def get_settings(self) -> dict:\n        return app_settings.PROVIDERS.get(self.id, {})\n\n    def sociallogin_from_response(self, request, response):\n        \"\"\"\n        Instantiates and populates a `SocialLogin` model based on the data\n        retrieved in `response`. The method does NOT save the model to the\n        DB.\n\n        Data for `SocialLogin` will be extracted from `response` with the\n        help of the `.extract_uid()`, `.extract_extra_data()`,\n        `.extract_common_fields()`, and `.extract_email_addresses()`\n        methods.\n\n        :param request: a Django `HttpRequest` object.\n        :param response: object retrieved via the callback response of the\n            social auth provider.\n        :return: A populated instance of the `SocialLogin` model (unsaved).\n        \"\"\"\n        # NOTE: Avoid loading models at top due to registry boot...\n        from allauth.socialaccount.adapter import get_adapter\n        from allauth.socialaccount.models import SocialAccount, SocialLogin\n\n        adapter = get_adapter()\n        uid = self.extract_uid(response)\n        if not isinstance(uid, str):\n            raise ValueError(f\"uid must be a string: {repr(uid)}\")\n        if len(uid) > app_settings.UID_MAX_LENGTH:\n            raise ImproperlyConfigured(\n                f\"SOCIALACCOUNT_UID_MAX_LENGTH too small (<{len(uid)})\"\n            )\n        if not uid:\n            raise ValueError(\"uid must be a non-empty string\")\n\n        extra_data = self.extract_extra_data(response)\n        common_fields = self.extract_common_fields(response)\n        socialaccount = SocialAccount(\n            extra_data=extra_data,\n            uid=uid,\n            provider=self.sub_id,\n        )\n        email_addresses = self.extract_email_addresses(response)\n        email = self.cleanup_email_addresses(\n            common_fields.get(\"email\"),\n            email_addresses,\n            email_verified=bool(common_fields.get(\"email_verified\")),\n        )\n        if email:\n            common_fields[\"email\"] = email\n        else:\n            common_fields.pop(\"email\", None)\n        phone = common_fields.get(\"phone\")\n        if phone:\n            try:\n                phone = (\n                    get_account_adapter().phone_form_field(required=True).clean(phone)\n                )\n                common_fields[\"phone\"] = phone\n            except ValidationError:\n                phone = None\n                common_fields.pop(\"phone\")\n        sociallogin = SocialLogin(\n            provider=self,\n            account=socialaccount,\n            email_addresses=email_addresses,\n            phone=phone,\n            phone_verified=common_fields.get(\"phone_verified\", False),\n        )\n        user = sociallogin.user = adapter.new_user(request, sociallogin)\n        user.set_unusable_password()\n        adapter.populate_user(request, sociallogin, common_fields)\n        return sociallogin\n\n    def extract_uid(self, data) -> str:\n        \"\"\"\n        Extracts the unique user ID from `data`\n        \"\"\"\n        raise NotImplementedError(\n            \"The provider must implement the `extract_uid()` method\"\n        )\n\n    def extract_extra_data(self, data) -> dict:\n        \"\"\"\n        Extracts fields from `data` that will be stored in\n        `SocialAccount`'s `extra_data` JSONField, such as email address, first\n        name, last name, and phone number.\n\n        :return: any JSON-serializable Python structure.\n        \"\"\"\n        return data\n\n    def extract_common_fields(self, data) -> dict:\n        \"\"\"\n        Extracts fields from `data` that will be used to populate the\n        `User` model in the `SOCIALACCOUNT_ADAPTER`'s `populate_user()`\n        method.\n\n        For example:\n\n            {'first_name': 'John'}\n\n        :return: dictionary of key-value pairs.\n        \"\"\"\n        return {}\n\n    def cleanup_email_addresses(\n        self, email: str | None, addresses: list, email_verified: bool = False\n    ) -> str | None:\n        # Avoid loading models before adapters have been registered.\n        from allauth.account.models import EmailAddress\n\n        # Validate & clean the email addresses.\n        email = valid_email_or_none(email)\n        # A bit ugly, but the signature of this function is such that we have to\n        # modify addresses in place.\n        for idx in range(len(addresses))[::-1]:\n            address = addresses[idx]\n            address.email = valid_email_or_none(address.email)\n            if not address.email:\n                addresses.pop(idx)\n\n        # Move user.email over to EmailAddress\n        if email and email not in [a.email for a in addresses]:\n            addresses.insert(\n                0,\n                EmailAddress(email=email, verified=bool(email_verified), primary=True),\n            )\n        # Force verified emails\n        adapter = get_adapter()\n        for address in addresses:\n            if adapter.is_email_verified(self, address.email):\n                address.verified = True\n\n        # Sort in order of importance (primary, verified...)\n        addresses.sort(key=lambda a: (a.primary, a.verified, a.email), reverse=True)\n        if not email and addresses:\n            email = addresses[0].email\n        return email\n\n    def extract_email_addresses(self, data) -> list:\n        \"\"\"\n        For example:\n\n        [EmailAddress(email='john@example.com',\n                      verified=True,\n                      primary=True)]\n        \"\"\"\n        return []\n\n    @classmethod\n    def get_package(cls) -> str:\n        pkg = getattr(cls, \"package\", None)\n        if not pkg:\n            pkg = cls.__module__.rpartition(\".\")[0]\n        return pkg\n\n    def stash_redirect_state(\n        self, request, process, next_url=None, data=None, state_id=None, **kwargs\n    ):\n        \"\"\"\n        Stashes state, returning a (random) state ID using which the state\n        can be looked up later. Application specific state is stored separately\n        from (core) allauth state such as `process` and `**kwargs`.\n        \"\"\"\n        state = {\"process\": process, \"data\": data, **kwargs}\n        if next_url:\n            state[\"next\"] = next_url\n        return statekit.stash_state(request, state, state_id=state_id)\n\n    def unstash_redirect_state(self, request, state_id):\n        state = statekit.unstash_state(request, state_id)\n        if state is None:\n            raise PermissionDenied()\n        return state\n\n    @property\n    def sub_id(self) -> str:\n        return (\n            (self.app.provider_id or self.app.provider) if self.uses_apps else self.id\n        )\n\n    def serialize(self) -> dict[str, Any]:\n        ret = {\"id\": self.id}\n        if self.uses_apps:\n            ret[\"app.client_id\"] = self.app.client_id\n        return ret\n\n    @classmethod\n    def deserialize(cls, data: Any) -> \"Provider\":\n        if not isinstance(data, dict):\n            raise ValueError()\n        provider = data.get(\"id\")\n        if not isinstance(provider, str):\n            raise ValueError()\n        client_id = data.get(\"app.client_id\")\n        if client_id is not None and not isinstance(client_id, str):\n            raise ValueError()\n        return get_adapter().get_provider(\n            context.request,\n            provider=provider,\n            client_id=client_id,\n        )\n\n\nclass ProviderAccount:\n    def __init__(self, social_account):\n        self.account = social_account\n\n    def get_profile_url(self) -> str | None:\n        return None\n\n    def get_avatar_url(self) -> str | None:\n        return None\n\n    def get_brand(self) -> dict:\n        \"\"\"\n        Returns a dict containing an id and name identifying the\n        brand. Useful when displaying logos next to accounts in\n        templates.\n\n        For most providers, these are identical to the provider. For\n        OpenID however, the brand can derived from the OpenID identity\n        url.\n        \"\"\"\n        provider = self.account.get_provider()\n        return dict(id=provider.id, name=provider.name)\n\n    def __str__(self) -> str:\n        return self.to_str()\n\n    def get_user_data(self) -> dict | None:\n        \"\"\"Typically, the ``extra_data`` directly contains user related keys.\n        For some providers, however, they are nested below a different key. In\n        that case, you can override this method so that the base ``__str__()``\n        will still be able to find the data.\n        \"\"\"\n        ret = self.account.extra_data\n        if not isinstance(ret, dict):\n            ret = None\n        return ret\n\n    def to_str(self) -> str:\n        \"\"\"\n        Returns string representation of this social account. This is the\n        unique identifier of the account, such as its username or its email\n        address. It should be meaningful to human beings, which means a numeric\n        ID number is rarely the appropriate representation here.\n\n        Subclasses are meant to override this method.\n\n        Users will see the string representation of their social accounts in\n        the page rendered by the allauth.socialaccount.views.connections view.\n\n        The following code did not use to work in the past due to py2\n        compatibility:\n\n            class GoogleAccount(ProviderAccount):\n                def __str__(self):\n                    dflt = super(GoogleAccount, self).__str__()\n                    return self.account.extra_data.get('name', dflt)\n\n        So we have this method `to_str` that can be overridden in a conventional\n        fashion, without having to worry about it.\n        \"\"\"\n        user_data = self.get_user_data()\n        if user_data:\n            combi_values = {}\n            tbl = [\n                # Prefer username -- it's the most human recognizable & unique.\n                (\n                    None,\n                    [\n                        \"username\",\n                        \"userName\",\n                        \"user_name\",\n                        \"login\",\n                        \"handle\",\n                    ],\n                ),\n                # Second best is email\n                (None, [\"email\", \"Email\", \"mail\", \"email_address\"]),\n                (\n                    None,\n                    [\n                        \"name\",\n                        \"display_name\",\n                        \"displayName\",\n                        \"displayname\",\n                        \"Display_Name\",\n                        \"nickname\",\n                    ],\n                ),\n                # Use the full name\n                (None, [\"full_name\", \"fullName\"]),\n                # Alternatively, try to assemble a full name ourselves.\n                (\n                    \"first_name\",\n                    [\n                        \"first_name\",\n                        \"firstname\",\n                        \"firstName\",\n                        \"First_Name\",\n                        \"given_name\",\n                        \"givenName\",\n                    ],\n                ),\n                (\n                    \"last_name\",\n                    [\n                        \"last_name\",\n                        \"lastname\",\n                        \"lastName\",\n                        \"Last_Name\",\n                        \"family_name\",\n                        \"familyName\",\n                        \"surname\",\n                    ],\n                ),\n            ]\n            for store_as, variants in tbl:\n                for key in variants:\n                    value = user_data.get(key)\n                    if isinstance(value, str):\n                        value = value.strip()\n                        if value and not store_as:\n                            return value\n                        combi_values[store_as] = value\n            first_name = combi_values.get(\"first_name\") or \"\"\n            last_name = combi_values.get(\"last_name\") or \"\"\n            if first_name or last_name:\n                return f\"{first_name} {last_name}\".strip()\n        return self.get_brand()[\"name\"]\n"
  },
  {
    "path": "allauth/socialaccount/providers/base/utils.py",
    "content": "from django.shortcuts import render\n\nfrom allauth.account import app_settings as account_app_settings\nfrom allauth.socialaccount import app_settings\n\n\ndef respond_to_login_on_get(request, provider):\n    if (not app_settings.LOGIN_ON_GET) and request.method == \"GET\":\n        return render(\n            request,\n            f\"socialaccount/login.{account_app_settings.TEMPLATE_EXTENSION}\",\n            {\n                \"provider\": provider,\n                \"process\": request.GET.get(\"process\"),\n            },\n        )\n"
  },
  {
    "path": "allauth/socialaccount/providers/base/views.py",
    "content": "from django.http import Http404, HttpResponse\nfrom django.views import View\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.base.utils import respond_to_login_on_get\n\n\nclass BaseLoginView(View):\n    provider_id: str  # Set in subclasses\n\n    def dispatch(self, request, *args, **kwargs) -> HttpResponse:\n        if allauth_settings.HEADLESS_ONLY:\n            raise Http404\n        provider = self.get_provider()\n        resp = respond_to_login_on_get(request, provider)\n        if resp:\n            return resp\n        return provider.redirect_from_request(request)\n\n    def get_provider(self):\n        provider = get_adapter().get_provider(self.request, self.provider_id)\n        return provider\n"
  },
  {
    "path": "allauth/socialaccount/providers/basecamp/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/basecamp/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.basecamp.views import BasecampOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass BasecampAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return None\n\n    def get_user_data(self):\n        return self.account.extra_data.get(\"identity\", {})\n\n\nclass BasecampProvider(OAuth2Provider):\n    id = \"basecamp\"\n    name = \"Basecamp\"\n    account_class = BasecampAccount\n    oauth2_adapter_class = BasecampOAuth2Adapter\n\n    def get_auth_params_from_request(self, request, action):\n        data = super().get_auth_params_from_request(request, action)\n        data[\"type\"] = \"web_server\"\n        return data\n\n    def extract_uid(self, data):\n        data = data[\"identity\"]\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        data = data[\"identity\"]\n        return dict(\n            email=data.get(\"email_address\"),\n            username=data.get(\"email_address\"),\n            first_name=data.get(\"first_name\"),\n            last_name=data.get(\"last_name\"),\n            name=f\"{data.get('first_name')} {data.get('last_name')}\",\n        )\n\n\nprovider_classes = [BasecampProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/basecamp/urls.py",
    "content": "from allauth.socialaccount.providers.basecamp.provider import BasecampProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(BasecampProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/basecamp/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass BasecampOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"basecamp\"\n    access_token_url = (\n        \"https://launchpad.37signals.com/authorization/token?type=web_server\"  # nosec\n    )\n    authorize_url = \"https://launchpad.37signals.com/authorization/new\"\n    profile_url = \"https://launchpad.37signals.com/authorization.json\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(BasecampOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(BasecampOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/battlenet/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/battlenet/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/battlenet/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.battlenet.views import BattleNetOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass BattleNetAccount(ProviderAccount):\n    def to_str(self):\n        battletag = self.account.extra_data.get(\"battletag\")\n        return battletag or super().to_str()\n\n\nclass BattleNetProvider(OAuth2Provider):\n    id = \"battlenet\"\n    name = \"Battle.net\"\n    account_class = BattleNetAccount\n    oauth2_adapter_class = BattleNetOAuth2Adapter\n\n    def extract_uid(self, data):\n        uid = str(data[\"id\"])\n        if data.get(\"region\") == \"cn\":\n            # China is on a different account system. UIDs can clash with US.\n            return f\"{uid}-cn\"\n        return uid\n\n    def extract_common_fields(self, data):\n        return {\"username\": data.get(\"battletag\")}\n\n    def get_default_scope(self):\n        # Optional scopes: \"sc2.profile\", \"wow.profile\"\n        return []\n\n\nprovider_classes = [BattleNetProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/battlenet/urls.py",
    "content": "from allauth.socialaccount.providers.battlenet.provider import BattleNetProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(BattleNetProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/battlenet/validators.py",
    "content": "from django.core.validators import RegexValidator\n\n\nBattletagUsernameValidator = RegexValidator(r\"^[\\w.]+#\\d+$\")\n"
  },
  {
    "path": "allauth/socialaccount/providers/battlenet/views.py",
    "content": "\"\"\"\nOAuth2 Adapter for Battle.net\n\nResources:\n\n* Battle.net OAuth2 documentation:\n    https://dev.battle.net/docs/read/oauth\n* Battle.net API documentation:\n    https://dev.battle.net/io-docs\n* Original announcement:\n    https://us.battle.net/en/forum/topic/13979297799\n* The Battle.net API forum:\n    https://us.battle.net/en/forum/15051532/\n\"\"\"\n\nfrom http import HTTPStatus\n\nfrom django.conf import settings\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass Region:\n    APAC = \"apac\"\n    CN = \"cn\"\n    EU = \"eu\"\n    KR = \"kr\"\n    SEA = \"sea\"\n    TW = \"tw\"\n    US = \"us\"\n\n\ndef _check_errors(response):\n    try:\n        data = response.json()\n    except ValueError:  # JSONDecodeError on py3\n        raise OAuth2Error(f\"Invalid JSON from Battle.net API: {response.text!r}\")\n\n    if response.status_code >= HTTPStatus.BAD_REQUEST or \"error\" in data:\n        # For errors, we expect the following format:\n        # {\"error\": \"error_name\", \"error_description\": \"Oops!\"}\n        # For example, if the token is not valid, we will get:\n        # {\n        #   \"error\": \"invalid_token\",\n        #   \"error_description\": \"Invalid access token: abcdef123456\"\n        # }\n        # For the profile API, this may also look like the following:\n        # {\"code\": 403, \"type\": \"Forbidden\", \"detail\": \"Account Inactive\"}\n        error = data.get(\"error\", \"\") or data.get(\"type\", \"\")\n        desc = data.get(\"error_description\", \"\") or data.get(\"detail\", \"\")\n\n        raise OAuth2Error(f\"Battle.net error: {error} ({desc})\")\n\n    # The expected output from the API follows this format:\n    # {\"id\": 12345, \"battletag\": \"Example#12345\"}\n    # The battletag is optional.\n    if \"id\" not in data:\n        # If the id is not present, the output is not usable (no UID)\n        raise OAuth2Error(f\"Invalid data from Battle.net API: {data!r}\")\n\n    return data\n\n\nclass BattleNetOAuth2Adapter(OAuth2Adapter):\n    \"\"\"\n    OAuth2 adapter for Battle.net\n    https://dev.battle.net/docs/read/oauth\n\n    Region is set to us by default, but can be overridden with the\n    `region` GET parameter when performing a login.\n    Can be any of eu, us, kr, sea, tw or cn\n    \"\"\"\n\n    provider_id = \"battlenet\"\n\n    valid_regions = (\n        Region.APAC,\n        Region.CN,\n        Region.EU,\n        Region.KR,\n        Region.SEA,\n        Region.TW,\n        Region.US,\n    )\n\n    @property\n    def battlenet_region(self):\n        # Check by URI query parameter first.\n        region = self.request.GET.get(\"region\", \"\").lower()\n        if region == Region.SEA:\n            # South-East Asia uses the same region as US everywhere\n            return Region.US\n        if region in self.valid_regions:\n            return region\n\n        # Second, check the provider settings.\n        region = (\n            getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {})\n            .get(\"battlenet\", {})\n            .get(\"REGION\", \"us\")\n        )\n\n        if region in self.valid_regions:\n            return region\n\n        return Region.US\n\n    @property\n    def battlenet_base_url(self):\n        region = self.battlenet_region\n        if region == Region.CN:\n            return \"https://oauth.battlenet.com.cn\"\n        return \"https://oauth.battle.net\"\n\n    @property\n    def access_token_url(self):\n        return f\"{self.battlenet_base_url}/token\"\n\n    @property\n    def authorize_url(self):\n        return f\"{self.battlenet_base_url}/authorize\"\n\n    @property\n    def profile_url(self):\n        return f\"{self.battlenet_base_url}/userinfo\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, headers=headers)\n            data = _check_errors(response)\n\n        # Add the region to the data so that we can have it in `extra_data`.\n        data[\"region\"] = self.battlenet_region\n\n        return self.get_provider().sociallogin_from_response(request, data)\n\n    def get_callback_url(self, request, app):\n        r = super().get_callback_url(request, app)\n        region = request.GET.get(\"region\", \"\").lower()\n        # Pass the region down to the callback URL if we specified it\n        if region and region in self.valid_regions:\n            r += f\"?region={region}\"\n        return r\n\n\noauth2_login = OAuth2LoginView.adapter_view(BattleNetOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(BattleNetOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/bitbucket_oauth2/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/bitbucket_oauth2/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.bitbucket_oauth2.views import (\n    BitbucketOAuth2Adapter,\n)\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass BitbucketOAuth2Account(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"links\", {}).get(\"html\", {}).get(\"href\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"links\", {}).get(\"avatar\", {}).get(\"href\")\n\n\nclass BitbucketOAuth2Provider(OAuth2Provider):\n    id = \"bitbucket_oauth2\"\n    name = \"Bitbucket\"\n    account_class = BitbucketOAuth2Account\n    oauth2_adapter_class = BitbucketOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"username\"]\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"username\"),\n            name=data.get(\"display_name\"),\n        )\n\n\nprovider_classes = [BitbucketOAuth2Provider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/bitbucket_oauth2/urls.py",
    "content": "from allauth.socialaccount.providers.bitbucket_oauth2.provider import (\n    BitbucketOAuth2Provider,\n)\nfrom allauth.socialaccount.providers.oauth.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(BitbucketOAuth2Provider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/bitbucket_oauth2/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass BitbucketOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"bitbucket_oauth2\"\n    access_token_url = \"https://bitbucket.org/site/oauth2/access_token\"  # nosec\n    authorize_url = \"https://bitbucket.org/site/oauth2/authorize\"\n    profile_url = \"https://api.bitbucket.org/2.0/user\"\n    emails_url = \"https://api.bitbucket.org/2.0/user/emails\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, params={\"access_token\": token.token})\n            extra_data = resp.json()\n        if app_settings.QUERY_EMAIL:\n            if email := self.get_email(token):\n                extra_data[\"email\"] = email\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n    def get_email(self, token) -> str:\n        \"\"\"Fetches email address from email API endpoint\"\"\"\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.emails_url, params={\"access_token\": token.token})\n            emails = resp.json().get(\"values\", [])\n        email = \"\"\n        try:\n            email = emails[0].get(\"email\")\n            primary_emails = [e for e in emails if e.get(\"is_primary\", False)]\n            email = primary_emails[0].get(\"email\")\n        except (IndexError, TypeError, KeyError):\n            pass\n        return email\n\n\noauth_login = OAuth2LoginView.adapter_view(BitbucketOAuth2Adapter)\noauth_callback = OAuth2CallbackView.adapter_view(BitbucketOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/bitly/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/bitly/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.bitly.views import BitlyOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass BitlyAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"profile_url\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"profile_image\")\n\n\nclass BitlyProvider(OAuth2Provider):\n    id = \"bitly\"\n    name = \"Bitly\"\n    account_class = BitlyAccount\n    oauth2_adapter_class = BitlyOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"login\"])\n\n    def extract_common_fields(self, data):\n        return dict(username=data[\"login\"], name=data.get(\"full_name\"))\n\n\nprovider_classes = [BitlyProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/bitly/urls.py",
    "content": "from allauth.socialaccount.providers.bitly.provider import BitlyProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(BitlyProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/bitly/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass BitlyOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"bitly\"\n    access_token_url = \"https://api-ssl.bitly.com/oauth/access_token\"  # nosec\n    authorize_url = \"https://bitly.com/oauth/authorize\"\n    profile_url = \"https://api-ssl.bitly.com/v3/user/info\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, params={\"access_token\": token.token})\n            extra_data = resp.json()[\"data\"]\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(BitlyOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(BitlyOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/box/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/box/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.box.views import BoxOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass BoxOAuth2Account(ProviderAccount):\n    pass\n\n\nclass BoxOAuth2Provider(OAuth2Provider):\n    id = \"box\"\n    name = \"Box\"\n    account_class = BoxOAuth2Account\n    oauth2_adapter_class = BoxOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"id\"]\n\n    def extract_common_fields(self, data):\n        return dict(name=data.get(\"display_name\"), email=data.get(\"email\"))\n\n\nprovider_classes = [BoxOAuth2Provider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/box/urls.py",
    "content": "from allauth.socialaccount.providers.box.provider import BoxOAuth2Provider\nfrom allauth.socialaccount.providers.oauth.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(BoxOAuth2Provider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/box/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass BoxOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"box\"\n    access_token_url = \"https://api.box.com/oauth2/token\"  # nosec\n    authorize_url = \"https://account.box.com/api/oauth2/authorize\"\n    profile_url = \"https://api.box.com/2.0/users/me\"\n    redirect_uri_protocol = None\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, params={\"access_token\": token.token})\n\n            # This only here because of weird response from the test suite\n            if isinstance(resp, list):\n                resp = resp[0]\n\n            extra_data = resp.json()\n\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth_login = OAuth2LoginView.adapter_view(BoxOAuth2Adapter)\noauth_callback = OAuth2CallbackView.adapter_view(BoxOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/cilogon/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/cilogon/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.app_settings import QUERY_EMAIL\nfrom allauth.socialaccount.providers.base import AuthAction, ProviderAccount\nfrom allauth.socialaccount.providers.cilogon.views import CILogonOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass Scope:\n    OPENID = \"openid\"\n    EMAIL = \"email\"\n    PROFILE = \"profile\"\n    USERINFO = \"org.cilogon.userinfo\"\n\n\nclass CILogonAccount(ProviderAccount):\n    pass\n\n\nclass CILogonProvider(OAuth2Provider):\n    id = \"cilogon\"\n    name = \"CILogon\"\n    account_class = CILogonAccount\n    oauth2_adapter_class = CILogonOAuth2Adapter\n\n    def get_default_scope(self):\n        scope = [Scope.PROFILE, Scope.USERINFO, Scope.OPENID]\n        if QUERY_EMAIL:\n            scope.append(Scope.EMAIL)\n        return scope\n\n    def get_auth_params_from_request(self, request, action):\n        ret = super().get_auth_params_from_request(request, action)\n        if action == AuthAction.REAUTHENTICATE:\n            ret[\"prompt\"] = \"select_account consent\"\n        return ret\n\n    def extract_uid(self, data):\n        return str(data.get(\"sub\"))\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            last_name=data.get(\"family_name\"),\n            first_name=data.get(\"given_name\"),\n            eppn=data.get(\"eppn\"),\n        )\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"email\")\n        if email and data.get(\"verified_email\"):\n            ret.append(EmailAddress(email=email, verified=True, primary=True))\n        return ret\n\n\nprovider_classes = [CILogonProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/cilogon/urls.py",
    "content": "from allauth.socialaccount.providers.cilogon.provider import CILogonProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(CILogonProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/cilogon/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass CILogonOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"cilogon\"\n    access_token_url = \"https://cilogon.org/oauth2/token\"  # nosec\n    authorize_url = \"https://cilogon.org/authorize\"\n    profile_url = \"https://cilogon.org/oauth2/userinfo\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(\n                self.profile_url,\n                params={\"access_token\": token.token, \"alt\": \"json\"},\n            )\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(CILogonOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(CILogonOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/clever/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/clever/provider.py",
    "content": "from allauth.socialaccount import providers\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.clever.views import CleverOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass CleverAccount(ProviderAccount):\n    def get_avatar_url(self):\n        # return self.account.extra_data.get('user').get('image_192', None)\n        return None\n\n    def get_user_data(self):\n        return self.account.extra_data.get(\"data\", {})\n\n\nclass CleverProvider(OAuth2Provider):\n    id = \"clever\"\n    name = \"Clever\"\n    account_class = CleverAccount\n    oauth2_adapter_class = CleverOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"data\"][\"id\"]\n\n    def get_user_type(self, data):\n        return list(data.get(\"data\", {}).get(\"roles\", {}).keys())[0]\n\n    def extract_common_fields(self, data):\n        return dict(\n            first_name=data.get(\"data\", {}).get(\"name\", {}).get(\"first\", None),\n            last_name=data.get(\"data\", {}).get(\"name\", {}).get(\"last\", None),\n            username=data.get(\"data\", {})\n            .get(\"roles\", {})\n            .get(self.get_user_type(data), {})\n            .get(\"credentials\", {})\n            .get(\"district_username\", None),\n            email=data.get(\"data\", {}).get(\"email\", None),\n        )\n\n    def get_default_scope(self):\n        return [\n            \"read:district_admins\",\n            \"read:districts\",\n            \"read:resources\",\n            \"read:school_admins\",\n            \"read:schools\",\n            \"read:sections\",\n            \"read:student_contacts\",\n            \"read:students\",\n            \"read:teachers\",\n            \"read:user_id\",\n        ]\n\n\nproviders.registry.register(CleverProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/clever/urls.py",
    "content": "from allauth.socialaccount.providers.clever.provider import CleverProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(CleverProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/clever/views.py",
    "content": "from http import HTTPStatus\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass CleverOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"clever\"\n\n    access_token_url = \"https://clever.com/oauth/tokens\"  # nosec\n    authorize_url = \"https://clever.com/oauth/authorize\"\n    identity_url = \"https://api.clever.com/v3.0/me\"\n    user_details_url = \"https://api.clever.com/v3.0/users\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        extra_data = self.get_data(token.token)\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n    def get_data(self, token):\n        headers = {\"Authorization\": f\"Bearer {token}\"}\n        with get_adapter().get_requests_session() as sess:\n            # Verify the user first\n            resp = sess.get(self.identity_url, headers=headers)\n            if resp.status_code != HTTPStatus.OK:\n                raise OAuth2Error()\n            resp = resp.json()\n            user_id = resp[\"data\"][\"id\"]\n            details_url = f\"{self.user_details_url}/{user_id}\"\n            resp = sess.get(details_url, headers=headers)\n            resp.raise_for_status()\n            return resp.json()\n\n\noauth2_login = OAuth2LoginView.adapter_view(CleverOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(CleverOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/coinbase/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/coinbase/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.coinbase.views import CoinbaseOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass CoinbaseAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return None\n\n\nclass CoinbaseProvider(OAuth2Provider):\n    id = \"coinbase\"\n    name = \"Coinbase\"\n    account_class = CoinbaseAccount\n    oauth2_adapter_class = CoinbaseOAuth2Adapter\n\n    def get_default_scope(self):\n        # See: https://coinbase.com/docs/api/permissions\n        return [\"wallet:user:email\"]\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        # See: https://coinbase.com/api/doc/1.0/users/index.html\n        return dict(email=data[\"email\"])\n\n\nprovider_classes = [CoinbaseProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/coinbase/urls.py",
    "content": "from allauth.socialaccount.providers.coinbase.provider import CoinbaseProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(CoinbaseProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/coinbase/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass CoinbaseOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"coinbase\"\n\n    @property\n    def authorize_url(self):\n        return \"https://www.coinbase.com/oauth/authorize\"\n\n    @property\n    def access_token_url(self):\n        return \"https://www.coinbase.com/oauth/token\"\n\n    @property\n    def profile_url(self):\n        return \"https://api.coinbase.com/v2/user\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, params={\"access_token\": token})\n            extra_data = response.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(CoinbaseOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(CoinbaseOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/dataporten/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/dataporten/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/dataporten/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.dataporten.views import DataportenOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass DataportenAccount(ProviderAccount):\n    def get_avatar_url(self):\n        \"\"\"\n        Returns a valid URL to an 128x128 .png photo of the user\n        \"\"\"\n        # Documentation for user profile photos can be found here:\n        # https://docs.dataporten.no/docs/oauth-authentication/\n        photo = self.account.extra_data[\"profilephoto\"]\n        return f\"https://api.dataporten.no/userinfo/v1/user/media/{photo}\"\n\n\nclass DataportenProvider(OAuth2Provider):\n    id = \"dataporten\"\n    name = \"Dataporten\"\n    account_class = DataportenAccount\n    oauth2_adapter_class = DataportenOAuth2Adapter\n\n    def extract_uid(self, data):\n        \"\"\"\n        Returns the primary user identifier, an UUID string\n        See: https://docs.dataporten.no/docs/userid/\n        \"\"\"\n        return data[\"userid\"]\n\n    def extract_extra_data(self, data):\n        \"\"\"\n        Extracts fields from `data` that will be stored in\n        `SocialAccount`'s `extra_data` JSONField.\n\n        All the necessary data extraction has already been done in the\n        complete_login()-view, so we can just return the data.\n        PS: This is default behaviour, so we did not really need to define\n            this function, but it is included for documentation purposes.\n\n        Typical return dict:\n        {\n            \"userid\": \"76a7a061-3c55-430d-8ee0-6f82ec42501f\",\n            \"userid_sec\": [\"feide:andreas@uninett.no\"],\n            \"name\": \"Andreas \\u00c5kre Solberg\",\n            \"email\": \"andreas.solberg@uninett.no\",\n            \"profilephoto\": \"p:a3019954-902f-45a3-b4ee-bca7b48ab507\",\n        }\n        \"\"\"\n        return data\n\n    def extract_common_fields(self, data):\n        \"\"\"\n        This function extracts information from the /userinfo endpoint which\n        will be consumed by allauth.socialaccount.adapter.populate_user().\n        Look there to find which key-value pairs that should be saved in the\n        returned dict.\n\n        Typical return dict:\n        {\n            \"userid\": \"76a7a061-3c55-430d-8ee0-6f82ec42501f\",\n            \"userid_sec\": [\"feide:andreas@uninett.no\"],\n            \"name\": \"Andreas \\u00c5kre Solberg\",\n            \"email\": \"andreas.solberg@uninett.no\",\n            \"profilephoto\": \"p:a3019954-902f-45a3-b4ee-bca7b48ab507\",\n            \"username\": \"andreas\",\n        }\n        \"\"\"\n        # Make shallow copy to prevent possible mutability issues\n        data = dict(data)\n\n        # If a Feide username is available, use it. If not, use the \"username\"\n        # of the email-address\n        for userid in data.get(\"userid_sec\"):\n            usertype, username = userid.split(\":\")\n            if usertype == \"feide\":\n                data[\"username\"] = username.split(\"@\")[0]\n                break\n        else:\n            # Only entered if break is not executed above\n            data[\"username\"] = data.get(\"email\").split(\"@\")[0]\n\n        return data\n\n\nprovider_classes = [DataportenProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/dataporten/urls.py",
    "content": "from allauth.socialaccount.providers.dataporten.provider import DataportenProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(DataportenProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/dataporten/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.base import ProviderException\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass DataportenOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"dataporten\"\n    access_token_url = \"https://auth.dataporten.no/oauth/token\"  # nosec\n    authorize_url = \"https://auth.dataporten.no/oauth/authorization\"\n    profile_url = \"https://auth.dataporten.no/userinfo\"\n    groups_url = \"https://groups-api.dataporten.no/groups/\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        \"\"\"\n        Arguments:\n            request - The get request to the callback URL\n                        /accounts/dataporten/login/callback.\n            app - The corresponding SocialApp model instance\n            token - A token object with access token given in token.token\n        Returns:\n            Should return a dict with user information intended for parsing\n            by the methods of the DataportenProvider view, i.e.\n            extract_uid(), extract_extra_data(), and extract_common_fields()\n        \"\"\"\n        # The authentication header\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n\n        # Userinfo endpoint, for documentation see:\n        # https://docs.dataporten.no/docs/oauth-authentication/\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            response_json = resp.json()\n            extra_data = response_json[\"user\"]\n\n        # Finally test that the audience property matches the client id\n        # for validification reasons, as instructed by the Dataporten docs\n        # if the userinfo-response is used for authentication\n        if response_json[\"audience\"] != app.client_id:\n            raise ProviderException(\n                \"Dataporten returned a user with an audience field \\\n                 which does not correspond to the client id of the \\\n                 application.\"\n            )\n\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(DataportenOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(DataportenOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/daum/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/daum/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/daum/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.daum.views import DaumOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass DaumAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"bigImagePath\")\n\n\nclass DaumProvider(OAuth2Provider):\n    id = \"Daum\"\n    name = \"Daum\"\n    account_class = DaumAccount\n    oauth2_adapter_class = DaumOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data.get(\"id\"))\n\n\nprovider_classes = [DaumProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/daum/urls.py",
    "content": "from allauth.socialaccount.providers.daum.provider import DaumProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(DaumProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/daum/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass DaumOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"Daum\"\n    access_token_url = \"https://apis.daum.net/oauth2/token\"  # nosec\n    authorize_url = \"https://apis.daum.net/oauth2/authorize\"\n    profile_url = \"https://apis.daum.net/user/v1/show.json\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, params={\"access_token\": token.token})\n            extra_data = resp.json().get(\"result\")\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(DaumOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(DaumOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/digitalocean/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/digitalocean/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.digitalocean.views import DigitalOceanOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass DigitalOceanAccount(ProviderAccount):\n    def get_user_data(self):\n        return self.account.extra_data.get(\"account\", {})\n\n\nclass DigitalOceanProvider(OAuth2Provider):\n    id = \"digitalocean\"\n    name = \"DigitalOcean\"\n    account_class = DigitalOceanAccount\n    oauth2_adapter_class = DigitalOceanOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"account\"][\"uuid\"])\n\n    def extract_common_fields(self, data):\n        return dict(email=data[\"account\"][\"email\"])\n\n\nprovider_classes = [DigitalOceanProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/digitalocean/urls.py",
    "content": "from allauth.socialaccount.providers.digitalocean.provider import DigitalOceanProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(DigitalOceanProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/digitalocean/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass DigitalOceanOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"digitalocean\"\n    access_token_url = \"https://cloud.digitalocean.com/v1/oauth/token\"  # nosec\n    authorize_url = \"https://cloud.digitalocean.com/v1/oauth/authorize\"\n    profile_url = \"https://api.digitalocean.com/v2/account\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(DigitalOceanOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(DigitalOceanOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/dingtalk/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/dingtalk/client.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Client, OAuth2Error\n\n\nclass DingTalkOAuth2Client(OAuth2Client):\n    def get_access_token(self, code, pkce_code_verifier=None):\n        data = {\n            \"clientId\": self.consumer_key,\n            \"clientSecret\": self.consumer_secret,\n            \"code\": code,\n            \"grantType\": \"authorization_code\",\n        }\n        params = None\n        if pkce_code_verifier:\n            data[\"code_verifier\"] = pkce_code_verifier\n        self._strip_empty_keys(data)\n        url = self.access_token_url\n        if self.access_token_method == \"GET\":  # nosec\n            params = data\n            data = None\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.request(self.access_token_method, url, params=params, json=data)\n            resp.raise_for_status()\n            access_token = resp.json()\n        if not access_token or \"accessToken\" not in access_token:\n            raise OAuth2Error(f\"Error retrieving access token: {resp.content}\")\n\n        access_token[\"access_token\"] = access_token.pop(\"accessToken\")\n        access_token[\"refresh_token\"] = access_token.pop(\"refreshToken\")\n        access_token[\"expires_in\"] = access_token.pop(\"expireIn\")\n        return access_token\n"
  },
  {
    "path": "allauth/socialaccount/providers/dingtalk/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.dingtalk.views import DingTalkOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass DingTalkAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"avatarUrl\")\n\n    def to_str(self):\n        return self.account.extra_data.get(\"nick\", super().to_str())\n\n\nclass DingTalkProvider(OAuth2Provider):\n    id = \"dingtalk\"\n    name = \"DingTalk\"\n    account_class = DingTalkAccount\n    oauth2_adapter_class = DingTalkOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"openId\"]\n\n    def get_default_scope(self):\n        return [\"openid\", \"corpid\"]\n\n    def extract_common_fields(self, data):\n        return dict(username=data.get(\"nick\"), name=data.get(\"nick\"))\n\n\nprovider_classes = [DingTalkProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/dingtalk/urls.py",
    "content": "from allauth.socialaccount.providers.dingtalk.provider import DingTalkProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(DingTalkProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/dingtalk/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\nfrom .client import DingTalkOAuth2Client\n\n\nclass DingTalkOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"dingtalk\"\n    access_token_url = \"https://api.dingtalk.com/v1.0/oauth2/userAccessToken\"  # nosec\n    authorize_url = \"https://login.dingtalk.com/oauth2/auth\"\n    profile_url = \"https://api.dingtalk.com/v1.0/contact/users/me\"\n    client_class = DingTalkOAuth2Client\n\n    def __init__(self, request):\n        # dingtalk set \"authCode\" instead of \"code\" in callback url\n        if \"authCode\" in request.GET:\n            request.GET._mutable = True\n            request.GET[\"code\"] = request.GET[\"authCode\"]\n            request.GET._mutable = False\n\n        super().__init__(request)\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"x-acs-dingtalk-access-token\": token.token}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(DingTalkOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(DingTalkOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/discogs/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/discogs/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.discogs.views import DiscogsOAuthAdapter\nfrom allauth.socialaccount.providers.oauth.provider import OAuthProvider\n\n\nclass DiscogsAccount(ProviderAccount):\n    def get_username(self):\n        return self.account.extra_data.get(\"username\")\n\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"resource_url\")\n\n\nclass DiscogsProvider(OAuthProvider):\n    id = \"discogs\"\n    name = \"discogs\"\n    account_class = DiscogsAccount\n    oauth_adapter_class = DiscogsOAuthAdapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n\nprovider_classes = [DiscogsProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/discogs/urls.py",
    "content": "from allauth.socialaccount.providers.discogs.provider import DiscogsProvider\nfrom allauth.socialaccount.providers.oauth.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(DiscogsProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/discogs/views.py",
    "content": "from allauth.socialaccount.providers.oauth.client import OAuth\nfrom allauth.socialaccount.providers.oauth.views import (\n    OAuthAdapter,\n    OAuthCallbackView,\n    OAuthLoginView,\n)\n\n\nclass DiscogsAPI(OAuth):\n    url = \"https://api.discogs.com/oauth/identity\"\n\n    def get_user_info(self):\n        data = self.query(self.url).json()\n        return data\n\n\nclass DiscogsOAuthAdapter(OAuthAdapter):\n    provider_id = \"discogs\"\n    request_token_url = \"https://api.discogs.com/oauth/request_token\"  # nosec\n    access_token_url = \"https://api.discogs.com/oauth/access_token\"  # nosec\n    authorize_url = \"https://discogs.com/oauth/authorize\"\n\n    def complete_login(self, request, app, token, response):\n        client = DiscogsAPI(request, app.client_id, app.secret, self.request_token_url)\n        extra_data = client.get_user_info()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth_login = OAuthLoginView.adapter_view(DiscogsOAuthAdapter)\noauth_callback = OAuthCallbackView.adapter_view(DiscogsOAuthAdapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/discord/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/discord/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import AuthAction, ProviderAccount\nfrom allauth.socialaccount.providers.discord.views import DiscordOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass DiscordAccount(ProviderAccount):\n    def validate_descriminator(self, discriminator):\n        if not isinstance(discriminator, str):\n            return False\n\n        # As of 2023-06-22, Discord returns string literal '0' for users\n        # with no discriminator\n\n        return len(discriminator) == 4 if discriminator.isdigit() else False\n\n    def is_new_username_system(self):\n        if not isinstance(self.account.extra_data, dict):\n            return None\n\n        discriminator = self.account.extra_data.get(\"discriminator\")\n\n        if self.validate_descriminator(discriminator):\n            return False\n\n        if self.account.extra_data.get(\"global_name\") is not None:\n            return True\n\n        return None\n\n    def to_str(self):\n        fallback = super().to_str()\n\n        # If the extra_data is malformed, exit early\n        if not isinstance(self.account.extra_data, dict):\n            return fallback\n\n        is_new_system = self.is_new_username_system()\n\n        if is_new_system is None:\n            # We couldn't determine if the username is new or old\n            #  so we'll just return the username on it's own.\n            display_name = self.account.extra_data.get(\"username\")\n        elif is_new_system:\n            # global_name can be None or even undefined\n            #  so we'll use the username as a fallback\n            global_name = self.account.extra_data.get(\"global_name\")\n            username = self.account.extra_data.get(\"username\")\n            display_name = global_name or username\n        else:\n            # Looks like it's the old username system\n            #  so we'll just use the username and discriminator\n            display_name = \"{username}#{discriminator}\".format(\n                username=self.account.extra_data.get(\"username\"),\n                discriminator=self.account.extra_data.get(\"discriminator\"),\n            )\n\n        # It's very unlikely but still possible that the display_name is None\n        # so we'll return or'd against the fallback just incase. We don't want\n        # to return None as users of the library expect this to be str.\n        return display_name or fallback\n\n    def get_avatar_url(self):\n        if (\n            \"id\" in self.account.extra_data.keys()\n            and \"avatar\" in self.account.extra_data.keys()\n        ):\n            return \"https://cdn.discordapp.com/avatars/{id}/{avatar}.png\".format(\n                **self.account.extra_data\n            )\n\n\nclass DiscordProvider(OAuth2Provider):\n    id = \"discord\"\n    name = \"Discord\"\n    account_class = DiscordAccount\n    oauth2_adapter_class = DiscordOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"username\"),\n            name=data.get(\"username\"),\n        )\n\n    def get_auth_params_from_request(self, request, action):\n        ret = super().get_auth_params_from_request(request, action)\n        if action == AuthAction.REAUTHENTICATE:\n            ret[\"prompt\"] = \"consent\"\n        return ret\n\n    def get_default_scope(self):\n        return [\"email\", \"identify\"]\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"email\")\n        if email and data.get(\"verified\"):\n            ret.append(EmailAddress(email=email, verified=True, primary=True))\n        return ret\n\n\nprovider_classes = [DiscordProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/discord/urls.py",
    "content": "from allauth.socialaccount.providers.discord.provider import DiscordProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(DiscordProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/discord/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass DiscordOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"discord\"\n    access_token_url = \"https://discord.com/api/oauth2/token\"  # nosec\n    authorize_url = \"https://discord.com/api/oauth2/authorize\"\n    profile_url = \"https://discord.com/api/users/@me\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\n            \"Authorization\": f\"Bearer {token.token}\",\n            \"Content-Type\": \"application/json\",\n        }\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(DiscordOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(DiscordOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/disqus/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/disqus/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.app_settings import QUERY_EMAIL\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.disqus.views import DisqusOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass DisqusAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"profileUrl\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"avatar\", {}).get(\"permalink\")\n\n\nclass DisqusProvider(OAuth2Provider):\n    id = \"disqus\"\n    name = \"Disqus\"\n    account_class = DisqusAccount\n    oauth2_adapter_class = DisqusOAuth2Adapter\n\n    def get_default_scope(self):\n        scope = [\"read\"]\n        if QUERY_EMAIL:\n            scope += [\"email\"]\n        return scope\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return {\n            \"username\": data.get(\"username\"),\n            \"email\": data.get(\"email\"),\n            \"name\": data.get(\"name\"),\n        }\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"email\")\n        if email:\n            ret.append(EmailAddress(email=email, verified=True, primary=True))\n        return ret\n\n\nprovider_classes = [DisqusProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/disqus/urls.py",
    "content": "from allauth.socialaccount.providers.disqus.provider import DisqusProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(DisqusProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/disqus/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass DisqusOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"disqus\"\n    access_token_url = \"https://disqus.com/api/oauth/2.0/access_token/\"  # nosec\n    authorize_url = \"https://disqus.com/api/oauth/2.0/authorize/\"\n    profile_url = \"https://disqus.com/api/3.0/users/details.json\"\n    scope_delimiter = \",\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            params = {\n                \"access_token\": token.token,\n                \"api_key\": app.client_id,\n                \"api_secret\": app.secret,\n            }\n            resp = sess.get(self.profile_url, params=params)\n            resp.raise_for_status()\n            extra_data = resp.json().get(\"response\")\n\n        login = self.get_provider().sociallogin_from_response(request, extra_data)\n        return login\n\n\noauth2_login = OAuth2LoginView.adapter_view(DisqusOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(DisqusOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/douban/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/douban/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.douban.views import DoubanOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass DoubanAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"alt\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"large_avatar\")\n\n\nclass DoubanProvider(OAuth2Provider):\n    id = \"douban\"\n    name = \"Douban\"\n    account_class = DoubanAccount\n    oauth2_adapter_class = DoubanOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"id\"]\n\n    def extract_common_fields(self, data):\n        \"\"\"\n        Extract data from profile json to populate user instance.\n\n        In Douban profile API:\n\n        - id: a digital string, will never change\n        - uid: defaults to id, but can be changed once, used in profile\n          url, like slug\n        - name: display name, can be changed every 30 days\n\n        So we should use `id` as username here, other than `uid`.\n        Also use `name` as `first_name` for displaying purpose.\n        \"\"\"\n        return {\n            \"username\": data[\"id\"],\n            \"first_name\": data.get(\"name\", \"\"),\n        }\n\n\nprovider_classes = [DoubanProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/douban/urls.py",
    "content": "from allauth.socialaccount.providers.douban.provider import DoubanProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(DoubanProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/douban/views.py",
    "content": "from django.utils.translation import gettext_lazy as _\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\nfrom ..base import ProviderException\n\n\nclass DoubanOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"douban\"\n    access_token_url = \"https://www.douban.com/service/auth2/token\"  # nosec\n    authorize_url = \"https://www.douban.com/service/auth2/auth\"\n    profile_url = \"https://api.douban.com/v2/user/~me\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json()\n        \"\"\"\n        Douban may return data like this:\n\n            {\n                'code': 128,\n                'request': 'GET /v2/user/~me',\n                'msg': 'user_is_locked:53358092'\n            }\n\n        \"\"\"\n        if \"id\" not in extra_data:\n            msg = extra_data.get(\"msg\", _(\"Invalid profile data\"))\n            raise ProviderException(msg)\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(DoubanOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(DoubanOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/doximity/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/doximity/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.doximity.views import DoximityOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass DoximityAccount(ProviderAccount):\n    def get_profile_url(self):\n        return None\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"profile_photo\")\n\n\nclass DoximityProvider(OAuth2Provider):\n    id = \"doximity\"\n    name = \"Doximity\"\n    account_class = DoximityAccount\n    oauth2_adapter_class = DoximityOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])  # the Doximity id is long\n\n    def extract_common_fields(self, data):\n        return dict(\n            username=data.get(\"email\"),\n            first_name=data.get(\"firstname\"),\n            last_name=data.get(\"lastname\"),\n            email=data.get(\"email\"),\n            name=data.get(\"full_name\"),\n        )\n\n    def get_default_scope(self):\n        return [\"basic\", \"email\"]\n\n\nprovider_classes = [DoximityProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/doximity/urls.py",
    "content": "from allauth.socialaccount.providers.doximity.provider import DoximityProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(DoximityProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/doximity/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass DoximityOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"doximity\"\n    access_token_url = \"https://auth.doximity.com/oauth/token\"  # nosec\n    authorize_url = \"https://auth.doximity.com/oauth/authorize\"\n    profile_url = \"https://www.doximity.com/api/v1/users/current\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(DoximityOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(DoximityOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/draugiem/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/draugiem/provider.py",
    "content": "from django.urls import reverse\nfrom django.utils.http import urlencode\n\nfrom allauth.socialaccount.providers.base import Provider, ProviderAccount\n\n\nclass DraugiemAccount(ProviderAccount):\n    def get_avatar_url(self):\n        ret = None\n        pic_small_url = self.account.extra_data.get(\"img\")\n        pic_icon_url = self.account.extra_data.get(\"imgi\")\n        pic_medium_url = self.account.extra_data.get(\"imgm\")\n        pic_large_url = self.account.extra_data.get(\"imgl\")\n        if pic_large_url:\n            return pic_large_url\n        elif pic_medium_url:\n            return pic_medium_url\n        elif pic_icon_url:\n            return pic_icon_url\n        elif pic_small_url:\n            return pic_small_url\n        else:\n            return ret\n\n\nclass DraugiemProvider(Provider):\n    id = \"draugiem\"\n    name = \"Draugiem\"\n    account_class = DraugiemAccount\n\n    def get_login_url(self, request, **kwargs):\n        url = reverse(f\"{self.id}_login\")\n        if kwargs:\n            url = f\"{url}?{urlencode(kwargs)}\"\n        return url\n\n    def extract_uid(self, data):\n        return str(data[\"uid\"])\n\n    def extract_common_fields(self, data):\n        uid = self.extract_uid(data)\n        user_data = data[\"users\"][uid]\n        return dict(\n            first_name=user_data.get(\"name\"),\n            last_name=user_data.get(\"surname\"),\n        )\n\n    def extract_extra_data(self, data):\n        uid = self.extract_uid(data)\n        return data[\"users\"][uid]\n\n\nprovider_classes = [DraugiemProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/draugiem/urls.py",
    "content": "from django.urls import path\n\nfrom . import views\n\n\nurlpatterns = [\n    path(\"draugiem/login/\", views.login, name=\"draugiem_login\"),\n    path(\"draugiem/callback/\", views.callback, name=\"draugiem_callback\"),\n]\n"
  },
  {
    "path": "allauth/socialaccount/providers/draugiem/views.py",
    "content": "import requests\nfrom hashlib import md5\n\nfrom django.http import HttpResponseRedirect\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\nfrom django.views.decorators.csrf import csrf_exempt\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.helpers import (\n    complete_social_login,\n    render_authentication_error,\n)\nfrom allauth.socialaccount.models import SocialLogin, SocialToken\nfrom allauth.socialaccount.providers.draugiem.provider import DraugiemProvider\n\nfrom ..base import AuthError\n\n\nclass DraugiemApiError(Exception):\n    pass\n\n\nACCESS_TOKEN_URL = \"https://api.draugiem.lv/json\"  # nosec\nAUTHORIZE_URL = \"https://api.draugiem.lv/authorize\"\n\n\ndef login(request):\n    app = get_adapter().get_app(request, DraugiemProvider.id)\n    redirect_url = request.build_absolute_uri(reverse(callback))\n    # Draugiem mandates a weak hashing algorithm.\n    redirect_url_hash = md5(f\"{app.secret}{redirect_url}\".encode()).hexdigest()  # nosec\n    params = {\n        \"app\": app.client_id,\n        \"hash\": redirect_url_hash,\n        \"redirect\": redirect_url,\n    }\n    SocialLogin.stash_state(request)\n    return HttpResponseRedirect(f\"{AUTHORIZE_URL}?{urlencode(params)}\")\n\n\n@csrf_exempt\ndef callback(request):\n    adapter = get_adapter()\n    provider = adapter.get_provider(request, DraugiemProvider.id)\n\n    if \"dr_auth_status\" not in request.GET:\n        return render_authentication_error(request, provider, error=AuthError.UNKNOWN)\n\n    if request.GET[\"dr_auth_status\"] != \"ok\":\n        return render_authentication_error(request, provider, error=AuthError.DENIED)\n\n    if \"dr_auth_code\" not in request.GET:\n        return render_authentication_error(request, provider, error=AuthError.UNKNOWN)\n\n    ret = None\n    auth_exception = None\n    try:\n        app = provider.app\n        login = draugiem_complete_login(request, app, request.GET[\"dr_auth_code\"])\n        login.state = SocialLogin.unstash_state(request)\n\n        ret = complete_social_login(request, login)\n    except (requests.RequestException, DraugiemApiError) as e:\n        auth_exception = e\n\n    if not ret:\n        ret = render_authentication_error(request, provider, exception=auth_exception)\n\n    return ret\n\n\ndef draugiem_complete_login(request, app, code):\n    provider = get_adapter().get_provider(request, DraugiemProvider.id)\n    with get_adapter().get_requests_session() as sess:\n        params = {\"action\": \"authorize\", \"app\": app.secret, \"code\": code}\n        response = sess.get(ACCESS_TOKEN_URL, params=params)\n        response.raise_for_status()\n        response_json = response.json()\n\n    if \"error\" in response_json:\n        raise DraugiemApiError(response_json[\"error\"])\n\n    token = SocialToken(app=app, token=response_json[\"apikey\"])\n\n    login = provider.sociallogin_from_response(request, response_json)\n    login.token = token\n    return login\n"
  },
  {
    "path": "allauth/socialaccount/providers/drip/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/drip/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.drip.views import DripOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass DripAccount(ProviderAccount):\n    pass\n\n\nclass DripProvider(OAuth2Provider):\n    id = \"drip\"\n    name = \"Drip\"\n    account_class = DripAccount\n    oauth2_adapter_class = DripOAuth2Adapter\n\n    def extract_uid(self, data):\n        # no uid available, we generate one by hashing the email\n        uid = hash(data.get(\"email\"))\n        return str(uid)\n\n    def extract_common_fields(self, data):\n        return dict(email=data.get(\"email\"), name=data.get(\"name\"))\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"email\")\n        if email:\n            ret.append(EmailAddress(email=email, verified=True, primary=True))\n        return ret\n\n\nprovider_classes = [DripProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/drip/urls.py",
    "content": "from allauth.socialaccount.providers.drip.provider import DripProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(DripProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/drip/views.py",
    "content": "\"\"\"Views for Drip API.\"\"\"\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass DripOAuth2Adapter(OAuth2Adapter):\n    \"\"\"OAuth2Adapter for Drip API v3.\"\"\"\n\n    provider_id = \"drip\"\n\n    authorize_url = \"https://www.getdrip.com/oauth/authorize\"\n    access_token_url = \"https://www.getdrip.com/oauth/token\"  # nosec\n    profile_url = \"https://api.getdrip.com/v2/user\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        \"\"\"Complete login, ensuring correct OAuth header.\"\"\"\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, headers=headers)\n            response.raise_for_status()\n            extra_data = response.json()[\"users\"][0]\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(DripOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(DripOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/dropbox/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/dropbox/provider.py",
    "content": "from allauth.socialaccount import providers\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.dropbox.views import DropboxOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass DropboxOAuth2Account(ProviderAccount):\n    pass\n\n\nclass DropboxOAuth2Provider(OAuth2Provider):\n    id = \"dropbox\"\n    name = \"Dropbox\"\n    account_class = DropboxOAuth2Account\n    oauth2_adapter_class = DropboxOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"account_id\"]\n\n    def extract_common_fields(self, data):\n        return dict(name=data[\"name\"][\"display_name\"], email=data[\"email\"])\n\n\nproviders.registry.register(DropboxOAuth2Provider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/dropbox/urls.py",
    "content": "from allauth.socialaccount.providers.dropbox.provider import DropboxOAuth2Provider\nfrom allauth.socialaccount.providers.oauth.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(DropboxOAuth2Provider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/dropbox/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass DropboxOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"dropbox\"\n    access_token_url = \"https://api.dropbox.com/oauth2/token\"  # nosec\n    authorize_url = \"https://www.dropbox.com/oauth2/authorize\"\n    profile_url = \"https://api.dropbox.com/2/users/get_current_account\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            response = sess.post(self.profile_url, headers=headers)\n            response.raise_for_status()\n            extra_data = response.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth_login = OAuth2LoginView.adapter_view(DropboxOAuth2Adapter)\noauth_callback = OAuth2CallbackView.adapter_view(DropboxOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/dummy/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/dummy/forms.py",
    "content": "from django import forms\n\nfrom allauth.account.fields import EmailField\n\n\nclass AuthenticateForm(forms.Form):\n    id = forms.IntegerField(label=\"Account ID\")\n    email = EmailField(required=False)\n    email_verified = forms.BooleanField(required=False)\n    username = forms.CharField(required=False)\n    first_name = forms.CharField(required=False)\n    last_name = forms.CharField(required=False)\n    phone = forms.CharField(required=False)\n    phone_verified = forms.BooleanField(required=False)\n"
  },
  {
    "path": "allauth/socialaccount/providers/dummy/provider.py",
    "content": "import json\n\nfrom django.http import HttpResponseRedirect\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.base import Provider, ProviderAccount\nfrom allauth.socialaccount.providers.dummy.forms import AuthenticateForm\n\n\nclass DummyAccount(ProviderAccount):\n    pass\n\n\nclass DummyProvider(Provider):\n    id = \"dummy\"\n    name = \"Dummy\"\n    account_class = DummyAccount\n    uses_apps = False\n    supports_redirect = True\n    supports_token_authentication = True\n\n    def get_login_url(self, request, **kwargs):\n        url = reverse(\"dummy_login\")\n        if kwargs:\n            url = f\"{url}?{urlencode(kwargs)}\"\n        return url\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        ret = {}\n        if first_name := data.get(\"first_name\"):\n            ret[\"first_name\"] = first_name\n        if last_name := data.get(\"last_name\"):\n            ret[\"last_name\"] = last_name\n        if username := data.get(\"username\"):\n            ret[\"username\"] = username\n        if phone := data.get(\"phone\"):\n            ret[\"phone\"] = phone\n        if phone_verified := data.get(\"phone_verified\"):\n            ret[\"phone_verified\"] = phone_verified\n        return ret\n\n    def redirect(self, request, process, next_url=None, data=None, **kwargs):\n        state_id = self.stash_redirect_state(\n            request,\n            process,\n            next_url=next_url,\n            data=data,\n            **kwargs,\n        )\n        return HttpResponseRedirect(\n            f\"{reverse('dummy_authenticate')}?{urlencode({'state': state_id})}\"\n        )\n\n    def extract_email_addresses(self, data):\n        addresses = []\n        email = data.get(\"email\")\n        if email:\n            email_verified = data.get(\"email_verified\")\n            addresses.append(\n                EmailAddress(\n                    email=email,\n                    verified=email_verified,\n                    primary=True,\n                )\n            )\n        return addresses\n\n    def verify_token(self, request, token):\n        # Our ID token is just a JSON payload that can be handed over\n        # to the `AuthenticateForm`.\n        id_token = token.get(\"id_token\")\n        if id_token:\n            try:\n                data = json.loads(id_token)\n            except json.JSONDecodeError:\n                pass\n            else:\n                form = AuthenticateForm(data=data)\n                if form.is_valid():\n                    return self.sociallogin_from_response(request, form.cleaned_data)\n        raise get_adapter().validation_error(\"invalid_token\")\n\n\nprovider_classes = [DummyProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/dummy/templates/dummy/authenticate_form.html",
    "content": "{% extends \"socialaccount/base_entrance.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block content %}\n    {% element h1 %}\n        Dummy Provider Login\n    {% endelement %}\n    {% element form form=form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=form %}\n            {% endelement %}\n        {% endslot %}\n        {% slot actions %}\n            {% element button type=\"submit\" %}\n                {% trans \"Login\" %}\n            {% endelement %}\n            {% element button form=\"cancel-form\" type=\"submit\" %}\n                {% trans \"Cancel\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n    <form id=\"cancel-form\" method=\"post\" action=\"{{ action_url }}\">\n        {% csrf_token %}\n        <input type=\"hidden\" name=\"action\" value=\"cancel\" />\n    </form>\n{% endblock %}\n"
  },
  {
    "path": "allauth/socialaccount/providers/dummy/urls.py",
    "content": "from django.urls import path\n\nfrom . import views\n\n\nurlpatterns = [\n    path(\"dummy/login/\", views.login, name=\"dummy_login\"),\n    path(\"dummy/authenticate/\", views.authenticate, name=\"dummy_authenticate\"),\n]\n"
  },
  {
    "path": "allauth/socialaccount/providers/dummy/views.py",
    "content": "from django.core.exceptions import PermissionDenied\nfrom django.http import HttpResponse, HttpResponseBase\nfrom django.urls import reverse\nfrom django.utils.decorators import method_decorator\nfrom django.utils.http import urlencode\nfrom django.views.generic.edit import FormView\n\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.helpers import (\n    complete_social_login,\n    render_authentication_error,\n)\nfrom allauth.socialaccount.models import SocialLogin\nfrom allauth.socialaccount.providers.base.constants import AuthError\nfrom allauth.socialaccount.providers.base.views import BaseLoginView\nfrom allauth.socialaccount.providers.dummy.forms import AuthenticateForm\nfrom allauth.socialaccount.providers.dummy.provider import DummyProvider\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass LoginView(BaseLoginView):\n    provider_id = DummyProvider.id\n\n\nlogin = LoginView.as_view()\n\n\nclass AuthenticateView(FormView):\n    form_class = AuthenticateForm\n    template_name = \"dummy/authenticate_form.html\"\n\n    @method_decorator(login_not_required)\n    def dispatch(self, request, *args, **kwargs) -> HttpResponseBase:\n        self.state_id = request.GET.get(\"state\")\n        if not self.state_id:\n            raise PermissionDenied()\n        self.provider = get_adapter().get_provider(self.request, DummyProvider.id)\n        if request.method == \"POST\" and request.POST.get(\"action\") == \"cancel\":\n            return render_authentication_error(\n                request,\n                self.provider,\n                error=AuthError.CANCELLED,\n                extra_context={\"state_id\": self.state_id},\n            )\n\n        return super().dispatch(request, *args, **kwargs)\n\n    def form_valid(self, form) -> HttpResponse:\n        login = self.provider.sociallogin_from_response(self.request, form.cleaned_data)\n        login.state = SocialLogin.unstash_state(self.request)\n        return complete_social_login(self.request, login)\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        ret[\"action_url\"] = (\n            f\"{reverse('dummy_authenticate')}?{urlencode({'state': self.state_id})}\"\n        )\n        return ret\n\n\nauthenticate = AuthenticateView.as_view()\n"
  },
  {
    "path": "allauth/socialaccount/providers/dwolla/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/dwolla/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/dwolla/provider.py",
    "content": "\"\"\"Provider for Dwolla\"\"\"\n\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.dwolla.views import DwollaOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass DwollaAccount(ProviderAccount):\n    pass\n\n\nclass DwollaProvider(OAuth2Provider):\n    \"\"\"Provider for Dwolla\"\"\"\n\n    id = \"dwolla\"\n    name = \"Dwolla\"\n    account_class = DwollaAccount\n    oauth2_adapter_class = DwollaOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data.get(\"id\", None))\n\n    def extract_common_fields(self, data):\n        return dict(\n            name=data.get(\"name\"),\n        )\n\n\nprovider_classes = [DwollaProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/dwolla/urls.py",
    "content": "from allauth.socialaccount.providers.dwolla.provider import DwollaProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(DwollaProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/dwolla/views.py",
    "content": "from django.conf import settings\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nENVIRONMENTS = {\n    \"production\": {\n        \"auth_url\": \"https://www.dwolla.com/oauth/v2/authenticate\",\n        \"token_url\": \"https://www.dwolla.com/oauth/v2/token\",  # nosec\n    },\n    \"sandbox\": {\n        \"auth_url\": \"https://uat.dwolla.com/oauth/v2/authenticate\",\n        \"token_url\": \"https://uat.dwolla.com/oauth/v2/token\",  # nosec\n    },\n}\n\nENV = (\n    getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {})\n    .get(\"dwolla\", {})\n    .get(\"ENVIRONMENT\", \"production\")\n)\n\nAUTH_URL = ENVIRONMENTS[ENV][\"auth_url\"]\nTOKEN_URL = ENVIRONMENTS[ENV][\"token_url\"]\n\n\nclass DwollaOAuth2Adapter(OAuth2Adapter):\n    \"\"\"Dwolla Views Adapter\"\"\"\n\n    scope_delimiter = \"|\"\n\n    provider_id = \"dwolla\"\n    access_token_url = TOKEN_URL\n    authorize_url = AUTH_URL\n\n    def complete_login(self, request, app, token, response, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(\n                response[\"_links\"][\"account\"][\"href\"],\n                headers={\n                    \"authorization\": f\"Bearer {token.token}\",\n                    \"accept\": \"application/vnd.dwolla.v1.hal+json\",\n                },\n            )\n            extra_data = resp.json()\n\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(DwollaOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(DwollaOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/edmodo/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/edmodo/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.edmodo.views import EdmodoOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass EdmodoAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"profile_url\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"avatar_url\")\n\n\nclass EdmodoProvider(OAuth2Provider):\n    id = \"edmodo\"\n    name = \"Edmodo\"\n    account_class = EdmodoAccount\n    oauth2_adapter_class = EdmodoOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"basic\"]\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            first_name=data.get(\"first_name\"),\n            last_name=data.get(\"last_name\"),\n            email=data.get(\"email\", \"\"),\n        )\n\n    def extract_extra_data(self, data):\n        ret = dict(data)\n        # NOTE: For backwards compatibility\n        ret[\"user_type\"] = data.get(\"type\")\n        ret[\"profile_url\"] = data.get(\"url\")\n        ret[\"avatar_url\"] = data.get(\"avatars\", {}).get(\"large\")\n        # (end NOTE)\n        return ret\n\n\nprovider_classes = [EdmodoProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/edmodo/urls.py",
    "content": "from allauth.socialaccount.providers.edmodo.provider import EdmodoProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(EdmodoProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/edmodo/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass EdmodoOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"edmodo\"\n    access_token_url = \"https://api.edmodo.com/oauth/token\"  # nosec\n    authorize_url = \"https://api.edmodo.com/oauth/authorize\"\n    profile_url = \"https://api.edmodo.com/users/me\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, params={\"access_token\": token.token})\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(EdmodoOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(EdmodoOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/edx/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/edx/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.edx.views import EdxOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass EdxAccount(ProviderAccount):\n    def get_profile_url(self):\n        if self.account.extra_data[\"profile_image\"][\"has_image\"]:\n            return self.account.extra_data[\"image_url_full\"]\n\n\nclass EdxProvider(OAuth2Provider):\n    id = \"edx\"\n    name = \"Edx\"\n    account_class = EdxAccount\n    oauth2_adapter_class = EdxOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"profile\"]\n\n    def extract_uid(self, data):\n        \"\"\"Extract uid ('id') and ensure it's a str.\"\"\"\n        return str(data[\"username\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"username\"),\n            name=data.get(\"name\"),\n            user_id=data.get(\"user_id\"),\n        )\n\n\nprovider_classes = [EdxProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/edx/urls.py",
    "content": "from allauth.socialaccount.providers.edx.provider import EdxProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(EdxProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/edx/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass EdxOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"edx\"\n    provider_default_url = \"https://edx.org\"\n\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n    provider_base_url = settings.get(\"EDX_URL\", provider_default_url)\n\n    access_token_url = f\"{provider_base_url}/oauth2/access_token\"\n    authorize_url = f\"{provider_base_url}/oauth2/authorize/\"\n    profile_url = f\"{provider_base_url}/api/user/v1/me\"\n    account_url = \"{0}/api/user/v1/accounts/{1}\"\n    supports_state = False\n    redirect_uri_protocol = \"https\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, headers=headers)\n            extra_data = response.json()\n\n            if extra_data.get(\"email\", None) is None:\n                account_url = self.account_url.format(\n                    self.provider_base_url, extra_data[\"username\"]\n                )\n                response = sess.get(account_url, headers=headers)\n                extra_data = response.json()\n\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(EdxOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(EdxOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/eventbrite/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/eventbrite/provider.py",
    "content": "\"\"\"Customise Provider classes for Eventbrite API v3.\"\"\"\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.eventbrite.views import EventbriteOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass EventbriteAccount(ProviderAccount):\n    \"\"\"ProviderAccount subclass for Eventbrite.\"\"\"\n\n    def get_avatar_url(self):\n        \"\"\"Return avatar url.\"\"\"\n        return self.account.extra_data[\"image_id\"]\n\n    def to_str(self):\n        emails = self.account.extra_data.get(\"emails\")\n        if emails:\n            return emails[0][\"email\"]\n        return super().to_str()\n\n\nclass EventbriteProvider(OAuth2Provider):\n    \"\"\"OAuth2Provider subclass for Eventbrite.\"\"\"\n\n    id = \"eventbrite\"\n    name = \"Eventbrite\"\n    account_class = EventbriteAccount\n    oauth2_adapter_class = EventbriteOAuth2Adapter\n\n    def extract_uid(self, data):\n        \"\"\"Extract uid ('id') and ensure it's a str.\"\"\"\n        return str(data[\"id\"])\n\n    def get_default_scope(self):\n        \"\"\"Ensure scope is null to fit their API.\"\"\"\n        return [\"\"]\n\n    def extract_common_fields(self, data):\n        \"\"\"Extract fields from a basic user query.\"\"\"\n        email = None\n        for curr_email in data.get(\"emails\", []):\n            email = email or curr_email.get(\"email\")\n            if curr_email.get(\"verified\", False) and curr_email.get(\"primary\", False):\n                email = curr_email.get(\"email\")\n\n        return dict(\n            email=email,\n            id=data.get(\"id\"),\n            name=data.get(\"name\"),\n            first_name=data.get(\"first_name\"),\n            last_name=data.get(\"last_name\"),\n            image_url=data.get(\"image_url\"),\n        )\n\n    def extract_email_addresses(self, data):\n        addresses = []\n        for email in data.get(\"emails\", []):\n            addresses.append(\n                EmailAddress(\n                    email=email.get(\"email\"),\n                    verified=email.get(\"verified\"),\n                )\n            )\n\n        return addresses\n\n\nprovider_classes = [EventbriteProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/eventbrite/urls.py",
    "content": "\"\"\"Register urls for EventbriteProvider\"\"\"\n\nfrom allauth.socialaccount.providers.eventbrite.provider import EventbriteProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(EventbriteProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/eventbrite/views.py",
    "content": "\"\"\"Views for Eventbrite API v3.\"\"\"\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass EventbriteOAuth2Adapter(OAuth2Adapter):\n    \"\"\"OAuth2Adapter for Eventbrite API v3.\"\"\"\n\n    provider_id = \"eventbrite\"\n\n    authorize_url = \"https://www.eventbrite.com/oauth/authorize\"\n    access_token_url = \"https://www.eventbrite.com/oauth/token\"  # nosec\n    profile_url = \"https://www.eventbriteapi.com/v3/users/me/\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        \"\"\"Complete login.\"\"\"\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, params={\"token\": token.token})\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(EventbriteOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(EventbriteOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/eveonline/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/eveonline/provider.py",
    "content": "from allauth.socialaccount.app_settings import STORE_TOKENS\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.eveonline.views import EveOnlineOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass EveOnlineAccount(ProviderAccount):\n    def get_profile_url(self):\n        return \"https://gate.eveonline.com/Profile/{char_name}\".format(\n            char_name=self.account.extra_data.get(\"CharacterName\")\n        )\n\n    def get_avatar_url(self):\n        return (\"https://image.eveonline.com/Character/{char_id}_128.jpg\").format(\n            char_id=self.account.extra_data.get(\"CharacterID\", 1)\n        )\n\n    def to_str(self):\n        dflt = super().to_str()\n        return next(\n            value\n            for value in (\n                self.account.extra_data.get(\"CharacterName\", None),\n                self.account.extra_data.get(\"CharacterID\", None),\n                dflt,\n            )\n            if value is not None\n        )\n\n\nclass EveOnlineProvider(OAuth2Provider):\n    id = \"eveonline\"\n    name = \"EVE Online\"\n    account_class = EveOnlineAccount\n    oauth2_adapter_class = EveOnlineOAuth2Adapter\n\n    def get_default_scope(self):\n        scopes = []\n        if STORE_TOKENS:\n            scopes.append(\"publicData\")\n        return scopes\n\n    def extract_uid(self, data):\n        return str(data[\"CharacterOwnerHash\"])\n\n    def extract_common_fields(self, data):\n        return dict(name=data.get(\"CharacterName\"))\n\n\nprovider_classes = [EveOnlineProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/eveonline/urls.py",
    "content": "from allauth.socialaccount.providers.eveonline.provider import EveOnlineProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(EveOnlineProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/eveonline/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass EveOnlineOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"eveonline\"\n    access_token_url = \"https://login.eveonline.com/oauth/token\"  # nosec\n    authorize_url = \"https://login.eveonline.com/oauth/authorize\"\n    profile_url = \"https://login.eveonline.com/oauth/verify\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(EveOnlineOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(EveOnlineOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/evernote/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/evernote/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.evernote.views import EvernoteOAuthAdapter\nfrom allauth.socialaccount.providers.oauth.provider import OAuthProvider\n\n\nclass EvernoteAccount(ProviderAccount):\n    def get_profile_url(self):\n        return None\n\n    def get_avatar_url(self):\n        return None\n\n\nclass EvernoteProvider(OAuthProvider):\n    id = \"evernote\"\n    name = \"Evernote\"\n    account_class = EvernoteAccount\n    oauth_adapter_class = EvernoteOAuthAdapter\n\n    def extract_uid(self, data):\n        return str(data[\"edam_userId\"])\n\n    def extract_common_fields(self, data):\n        return data\n\n\nprovider_classes = [EvernoteProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/evernote/urls.py",
    "content": "from allauth.socialaccount.providers.evernote.provider import EvernoteProvider\nfrom allauth.socialaccount.providers.oauth.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(EvernoteProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/evernote/views.py",
    "content": "from datetime import datetime\n\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.providers.oauth.views import (\n    OAuthAdapter,\n    OAuthCallbackView,\n    OAuthLoginView,\n)\n\n\nclass EvernoteOAuthAdapter(OAuthAdapter):\n    provider_id = \"evernote\"\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n    _hostname = settings.get(\"EVERNOTE_HOSTNAME\", \"sandbox.evernote.com\")\n    request_token_url = f\"https://{_hostname}/oauth\"\n    access_token_url = f\"https://{_hostname}/oauth\"\n    authorize_url = f\"https://{_hostname}/OAuth.action\"\n    del _hostname\n\n    def complete_login(self, request, app, token, response):\n        token.expires_at = datetime.fromtimestamp(\n            int(response[\"edam_expires\"]) / 1000.0\n        )\n        extra_data = response\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth_login = OAuthLoginView.adapter_view(EvernoteOAuthAdapter)\noauth_callback = OAuthCallbackView.adapter_view(EvernoteOAuthAdapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/exist/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/exist/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.exist.views import ExistOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass ExistAccount(ProviderAccount):\n    def get_profile_url(self):\n        return \"https://exist.io/api/2/accounts/profile/\"\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"avatar\")\n\n\nclass ExistProvider(OAuth2Provider):\n    id = \"exist\"\n    name = \"Exist.io\"\n    account_class = ExistAccount\n    oauth2_adapter_class = ExistOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data.get(\"username\")\n\n    def extract_common_fields(self, data):\n        extra_common = super().extract_common_fields(data)\n        extra_common.update(\n            username=data.get(\"username\"),\n            first_name=data.get(\"first_name\"),\n            last_name=data.get(\"last_name\"),\n            avatar=data.get(\"avatar\"),\n            timezone=data.get(\"timezone\"),\n            local_time=data.get(\"local_time\"),\n        )\n        return extra_common\n\n    def get_default_scope(self):\n        return [\"mood_read\", \"health_read\", \"productivity_read\"]\n\n\nprovider_classes = [ExistProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/exist/urls.py",
    "content": "from allauth.socialaccount.providers.exist.provider import ExistProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(ExistProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/exist/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass ExistOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"exist\"\n    access_token_url = \"https://exist.io/oauth2/access_token\"  # nosec\n    authorize_url = \"https://exist.io/oauth2/authorize\"\n    profile_url = \"https://exist.io/api/2/accounts/profile/\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(ExistOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(ExistOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/facebook/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/facebook/constants.py",
    "content": "from django.conf import settings\n\n\nPROVIDER_ID = \"facebook\"\nGRAPH_API_VERSION = (\n    getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {})\n    .get(\"facebook\", {})\n    .get(\"VERSION\", \"v19.0\")\n)\nGRAPH_API_URL = (\n    getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {})\n    .get(\"facebook\", {})\n    .get(\"GRAPH_API_URL\", f\"https://graph.facebook.com/{GRAPH_API_VERSION}\")\n)\n\nNONCE_SESSION_KEY = \"allauth_facebook_nonce\"\nNONCE_LENGTH = 32\n"
  },
  {
    "path": "allauth/socialaccount/providers/facebook/data/FacebookLocales.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<locales>\n<locale>\n<englishName>Afrikaans</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>af_ZA</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Arabic</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>ar_AR</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Azerbaijani</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>az_AZ</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Belarusian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>be_BY</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Bulgarian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>bg_BG</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Bengali</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>bn_IN</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Bosnian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>bs_BA</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Catalan</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>ca_ES</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Czech</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>cs_CZ</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Welsh</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>cy_GB</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Danish</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>da_DK</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>German</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>de_DE</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Greek</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>el_GR</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>English (UK)</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>en_GB</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>English (Pirate)</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>en_PI</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>English (Upside Down)</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>en_UD</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>English (US)</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>en_US</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Esperanto</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>eo_EO</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Spanish (Spain)</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>es_ES</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Spanish</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>es_LA</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Estonian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>et_EE</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Basque</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>eu_ES</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Persian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>fa_IR</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Leet Speak</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>fb_LT</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Finnish</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>fi_FI</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Faroese</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>fo_FO</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>French (Canada)</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>fr_CA</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>French (France)</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>fr_FR</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Frisian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>fy_NL</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Irish</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>ga_IE</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Galician</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>gl_ES</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Hebrew</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>he_IL</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Hindi</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>hi_IN</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Croatian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>hr_HR</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Hungarian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>hu_HU</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Armenian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>hy_AM</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Indonesian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>id_ID</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Icelandic</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>is_IS</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Italian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>it_IT</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Japanese</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>ja_JP</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Georgian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>ka_GE</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Khmer</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>km_KH</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Korean</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>ko_KR</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Kurdish</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>ku_TR</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Latin</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>la_VA</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Lithuanian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>lt_LT</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Latvian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>lv_LV</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Macedonian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>mk_MK</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Malayalam</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>ml_IN</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Malay</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>ms_MY</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Norwegian (bokmal)</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>nb_NO</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Nepali</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>ne_NP</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Dutch</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>nl_NL</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Norwegian (nynorsk)</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>nn_NO</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Punjabi</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>pa_IN</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Polish</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>pl_PL</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Pashto</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>ps_AF</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Portuguese (Brazil)</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>pt_BR</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Portuguese (Portugal)</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>pt_PT</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Romanian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>ro_RO</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Russian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>ru_RU</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Slovak</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>sk_SK</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Slovenian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>sl_SI</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Albanian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>sq_AL</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Serbian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>sr_RS</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Swedish</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>sv_SE</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Swahili</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>sw_KE</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Tamil</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>ta_IN</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Telugu</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>te_IN</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Thai</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>th_TH</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Filipino</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>tl_PH</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Turkish</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>tr_TR</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Ukrainian</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>uk_UA</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Vietnamese</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>vi_VN</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Simplified Chinese (China)</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>zh_CN</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Traditional Chinese (Hong Kong)</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>zh_HK</representation>\n</standard>\n</code>\n</codes>\n</locale>\n<locale>\n<englishName>Traditional Chinese (Taiwan)</englishName>\n<codes>\n<code>\n<standard>\n<name>FB</name>\n<representation>zh_TW</representation>\n</standard>\n</code>\n</codes>\n</locale>\n</locales>"
  },
  {
    "path": "allauth/socialaccount/providers/facebook/flows.py",
    "content": "import hashlib\nimport hmac\nfrom datetime import timedelta\n\nfrom django.core.cache import cache\nfrom django.http import HttpRequest\nfrom django.utils import timezone\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.internal import jwtkit\nfrom allauth.socialaccount.models import SocialLogin, SocialToken\nfrom allauth.socialaccount.providers.base import Provider\nfrom allauth.socialaccount.providers.facebook.constants import GRAPH_API_URL\n\n\n# maps fields from the Limited Login JWT to Graph API response fields\nJWT_FIELD_TO_GRAPH_API_FIELD_MAP = {\n    \"sub\": \"id\",\n    \"email\": \"email\",\n    \"given_name\": \"first_name\",\n    \"family_name\": \"last_name\",\n    \"name\": \"name\",\n    \"user_link\": \"link\",\n}\n\n\ndef compute_appsecret_proof(app, token) -> str:\n    # Generate an appsecret_proof parameter to secure the Graph API call\n    # see https://developers.facebook.com/docs/graph-api/securing-requests\n    msg = token.token.encode(\"utf-8\")\n    key = app.secret.encode(\"utf-8\")\n    appsecret_proof = hmac.new(key, msg, digestmod=hashlib.sha256).hexdigest()\n    return appsecret_proof\n\n\ndef complete_login(request, provider, token):\n    with get_adapter().get_requests_session() as sess:\n        params = {\n            \"fields\": \",\".join(provider.get_fields()),\n            \"access_token\": token.token,\n            \"appsecret_proof\": compute_appsecret_proof(provider.app, token),\n        }\n        resp = sess.get(f\"{GRAPH_API_URL}/me\", params=params)\n        resp.raise_for_status()\n        extra_data = resp.json()\n    return provider.sociallogin_from_response(request, extra_data)\n\n\ndef get_app_token(provider):\n    app = provider.app\n    cache_key = f\"allauth.facebook.app_token[{app.client_id}]\"\n    app_token = cache.get(cache_key)\n    if not app_token:\n        with get_adapter().get_requests_session() as sess:\n            params = {\n                \"client_id\": app.client_id,\n                \"client_secret\": app.secret,\n                \"grant_type\": \"client_credentials\",\n            }\n            resp = sess.get(f\"{GRAPH_API_URL}/oauth/access_token\", params=params)\n            resp.raise_for_status()\n            data = resp.json()\n        app_token = data[\"access_token\"]\n        timeout = provider.get_settings().get(\"APP_TOKEN_CACHE_TIMEOUT\", 300)\n        cache.set(cache_key, app_token, timeout=timeout)\n    return app_token\n\n\ndef inspect_token(provider, input_token) -> None:\n    app_token = get_app_token(provider)\n    with get_adapter().get_requests_session() as sess:\n        resp = sess.get(\n            f\"{GRAPH_API_URL}/debug_token\",\n            params={\"input_token\": input_token, \"access_token\": app_token},\n        )\n        resp.raise_for_status()\n        data = resp.json()[\"data\"]\n    if not data[\"is_valid\"]:\n        raise get_adapter().validation_error(\"invalid_token\")\n    if data[\"app_id\"] != provider.app.client_id or not data[\"is_valid\"]:\n        raise get_adapter().validation_error(\"invalid_token\")\n\n\ndef verify_token(\n    request,\n    provider: Provider,\n    access_token: str,\n    auth_type: str = \"\",\n    auth_nonce: str = \"\",\n) -> SocialLogin:\n    app = provider.app\n    inspect_token(provider, access_token)\n    expires_at = None\n    with get_adapter().get_requests_session() as sess:\n        if auth_type == \"reauthenticate\":\n            resp = sess.get(\n                f\"{GRAPH_API_URL}/oauth/access_token_info\",\n                params={\n                    \"client_id\": app.client_id,\n                    \"access_token\": access_token,\n                },\n            )\n            resp.raise_for_status()\n            info = resp.json()\n            ok = auth_nonce and auth_nonce == info.get(\"auth_nonce\")\n            if not ok:\n                raise get_adapter().validation_error(\"invalid_token\")\n\n        if provider.get_settings().get(\"EXCHANGE_TOKEN\"):\n            resp = sess.get(\n                f\"{GRAPH_API_URL}/oauth/access_token\",\n                params={\n                    \"grant_type\": \"fb_exchange_token\",\n                    \"client_id\": app.client_id,\n                    \"client_secret\": app.secret,\n                    \"fb_exchange_token\": access_token,\n                },\n            )\n            resp.raise_for_status()\n            info = resp.json()\n            access_token = info[\"access_token\"]\n            expires_in = info.get(\"expires_in\")\n            if expires_in:\n                expires_at = timezone.now() + timedelta(seconds=int(expires_in))\n\n    token = SocialToken(app=app, token=access_token, expires_at=expires_at)\n    login = complete_login(request, provider, token)\n    login.token = token\n    return login\n\n\ndef verify_limited_login_token(\n    request: HttpRequest, provider, id_token: str\n) -> SocialLogin:\n    \"\"\"\n    Verifies a Facebook Limited Login token.\n    See https://developers.facebook.com/docs/facebook-login/limited-login/token/validating.\n\n    We validate the JWT, then convert its data/claims into\n    a fake Facebook Graph API response, which is then passed to\n    `provider.sociallogin_from_response` to be handled as normal.\n    \"\"\"\n\n    # note: this already does replay protection internally\n    jwt_data = jwtkit.verify_and_decode(\n        credential=id_token,\n        keys_url=provider.limited_login_jwks_url,\n        issuer=provider.limited_login_expected_jwt_issuer,\n        audience=provider.app.client_id,\n        lookup_kid=jwtkit.lookup_kid_jwk,\n    )\n\n    fake_response = {\n        graph_field: jwt_data[jwt_field]\n        for jwt_field, graph_field in JWT_FIELD_TO_GRAPH_API_FIELD_MAP.items()\n        if jwt_field in jwt_data\n    }\n\n    return provider.sociallogin_from_response(request, fake_response)\n"
  },
  {
    "path": "allauth/socialaccount/providers/facebook/forms.py",
    "content": "from django import forms\n\n\nclass FacebookConnectForm(forms.Form):\n    access_token = forms.CharField(required=True)\n"
  },
  {
    "path": "allauth/socialaccount/providers/facebook/locale.py",
    "content": "# Default locale mapping for the Facebook JS SDK\n# The list of supported locales is at\n# https://www.facebook.com/translations/FacebookLocales.xml\nimport os\n\nfrom django.utils.translation import get_language, to_locale\n\n\ndef _build_locale_table(filename_or_file):\n    \"\"\"\n    Parses the FacebookLocales.xml file and builds a dict relating every\n    available language ('en, 'es, 'zh', ...) with a list of available regions\n    for that language ('en' -> 'US', 'EN') and an (arbitrary) default region.\n    \"\"\"\n    # Require the XML parser module only if we want the default mapping\n    from xml.dom.minidom import parse  # nosec\n\n    # Trusted source\n    dom = parse(filename_or_file)  # nosec\n\n    reps = dom.getElementsByTagName(\"representation\")\n    locs = map(lambda r: r.childNodes[0].data, reps)\n\n    locale_map = {}\n    for loc in locs:\n        lang, _, reg = loc.partition(\"_\")\n        lang_map = locale_map.setdefault(lang, {\"regs\": [], \"default\": reg})\n        lang_map[\"regs\"].append(reg)\n\n    # Default region overrides (arbitrary)\n    locale_map[\"en\"][\"default\"] = \"US\"\n    # Special case: Use es_ES for Spain and es_LA for everything else\n    locale_map[\"es\"][\"default\"] = \"LA\"\n    locale_map[\"zh\"][\"default\"] = \"CN\"\n    locale_map[\"fr\"][\"default\"] = \"FR\"\n    locale_map[\"pt\"][\"default\"] = \"PT\"\n\n    return locale_map\n\n\ndef get_default_locale_callable():\n    \"\"\"\n    Wrapper function so that the default mapping is only built when needed\n    \"\"\"\n    exec_dir = os.path.dirname(os.path.realpath(__file__))\n    xml_path = os.path.join(exec_dir, \"data\", \"FacebookLocales.xml\")\n\n    fb_locales = _build_locale_table(xml_path)\n\n    def default_locale(request):\n        \"\"\"\n        Guess an appropriate FB locale based on the active Django locale.\n        If the active locale is available, it is returned. Otherwise,\n        it tries to return another locale with the same language. If there\n        isn't one available, 'en_US' is returned.\n        \"\"\"\n        chosen = \"en_US\"\n        language = get_language()\n        if language:\n            locale = to_locale(language)\n            lang, _, reg = locale.partition(\"_\")\n\n            lang_map = fb_locales.get(lang)\n            if lang_map is not None:\n                if reg in lang_map[\"regs\"]:\n                    chosen = f\"{lang}_{reg}\"\n                else:\n                    chosen = f\"{lang}_{lang_map['default']}\"\n        return chosen\n\n    return default_locale\n"
  },
  {
    "path": "allauth/socialaccount/providers/facebook/provider.py",
    "content": "import requests\nimport string\nfrom urllib.parse import quote\n\nfrom django.contrib.auth import REDIRECT_FIELD_NAME\nfrom django.middleware.csrf import get_token\nfrom django.template.loader import render_to_string\nfrom django.urls import reverse\nfrom django.utils.crypto import get_random_string\nfrom django.utils.html import escapejs\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.app_settings import QUERY_EMAIL\nfrom allauth.socialaccount.providers.base import (\n    AuthAction,\n    AuthProcess,\n    ProviderAccount,\n)\nfrom allauth.socialaccount.providers.facebook.constants import (\n    GRAPH_API_VERSION,\n    NONCE_LENGTH,\n    NONCE_SESSION_KEY,\n    PROVIDER_ID,\n)\nfrom allauth.socialaccount.providers.facebook.views import FacebookOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.utils import import_callable\n\nfrom .locale import get_default_locale_callable\n\n\nclass FacebookAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"link\")\n\n\nclass FacebookProvider(OAuth2Provider):\n    id = PROVIDER_ID\n    name = \"Facebook\"\n    account_class = FacebookAccount\n    oauth2_adapter_class = FacebookOAuth2Adapter\n    supports_token_authentication = True\n\n    # TODO: populate these from https://www.facebook.com/.well-known/openid-configuration/\n    #  just like in a normal OIDC provider (as that's what \"Limited Login\" really is)\n    limited_login_expected_jwt_issuer = \"https://www.facebook.com\"\n    limited_login_jwks_url = (\n        \"https://limited.facebook.com/.well-known/oauth/openid/jwks/\"\n    )\n\n    def __init__(self, *args, **kwargs):\n        self._locale_callable_cache = None\n        super().__init__(*args, **kwargs)\n\n    def get_method(self):\n        return self.get_settings().get(\"METHOD\", \"oauth2\")\n\n    def get_login_url(self, request, **kwargs):\n        method = kwargs.pop(\"method\", self.get_method())\n        if method == \"js_sdk\":\n            next = f\"'{escapejs(kwargs.get(REDIRECT_FIELD_NAME) or '')}'\"\n            process = f\"'{escapejs(kwargs.get('process') or AuthProcess.LOGIN)}'\"\n            action = f\"'{escapejs(kwargs.get('action') or AuthAction.AUTHENTICATE)}'\"\n            scope = f\"'{escapejs(kwargs.get('scope', ''))}'\"\n            js = f\"allauth.facebook.login({next}, {action}, {process}, {scope})\"\n            ret = f\"javascript:{quote(js)}\"\n        elif method == \"oauth2\":\n            ret = super().get_login_url(request, **kwargs)\n        else:\n            raise RuntimeError(f\"Invalid method specified: {method}\")\n        return ret\n\n    def _get_locale_callable(self):\n        settings = self.get_settings()\n        func = settings.get(\"LOCALE_FUNC\")\n        return import_callable(func) if func else get_default_locale_callable()\n\n    def get_locale_for_request(self, request):\n        if not self._locale_callable_cache:\n            self._locale_callable_cache = self._get_locale_callable()\n        return self._locale_callable_cache(request)\n\n    def get_default_scope(self):\n        scope = []\n        if QUERY_EMAIL:\n            scope.append(\"email\")\n        return scope\n\n    def get_fields(self):\n        settings = self.get_settings()\n        default_fields = [\n            \"id\",\n            \"email\",\n            \"name\",\n            \"first_name\",\n            \"last_name\",\n            \"verified\",\n            \"locale\",\n            \"timezone\",\n            \"link\",\n            \"gender\",\n            \"updated_time\",\n        ]\n        return settings.get(\"FIELDS\", default_fields)\n\n    def get_auth_params_from_request(self, request, action):\n        ret = super().get_auth_params_from_request(request, action)\n        if action == AuthAction.REAUTHENTICATE:\n            ret[\"auth_type\"] = \"reauthenticate\"\n        elif action == AuthAction.REREQUEST:\n            ret[\"auth_type\"] = \"rerequest\"\n        return ret\n\n    def get_init_params(self, request, app):\n        init_params = {\"appId\": app.client_id, \"version\": GRAPH_API_VERSION}\n        settings = self.get_settings()\n        init_params.update(settings.get(\"INIT_PARAMS\", {}))\n        return init_params\n\n    def get_fb_login_options(self, request):\n        ret = self.get_auth_params_from_request(request, \"authenticate\")\n        ret[\"scope\"] = \",\".join(self.get_scope_from_request(request))\n        if ret.get(\"auth_type\") == \"reauthenticate\":\n            ret[\"auth_nonce\"] = self.get_nonce(request, or_create=True)\n        return ret\n\n    def get_sdk_url(self, request):\n        settings = self.get_settings()\n        sdk_url = settings.get(\"SDK_URL\", \"//connect.facebook.net/{locale}/sdk.js\")\n        field_names = [\n            tup[1] for tup in string.Formatter().parse(sdk_url) if tup[1] is not None\n        ]\n        if \"locale\" in field_names:\n            locale = self.get_locale_for_request(request)\n            sdk_url = sdk_url.format(locale=locale)\n        return sdk_url\n\n    def media_js(self, request):\n        if self.get_method() != \"js_sdk\":\n            return \"\"\n\n        def abs_uri(name):\n            return request.build_absolute_uri(reverse(name))\n\n        fb_data = {\n            \"appId\": self.app.client_id,\n            \"version\": GRAPH_API_VERSION,\n            \"sdkUrl\": self.get_sdk_url(request),\n            \"initParams\": self.get_init_params(request, self.app),\n            \"loginOptions\": self.get_fb_login_options(request),\n            \"loginByTokenUrl\": abs_uri(\"facebook_login_by_token\"),\n            \"cancelUrl\": abs_uri(\"socialaccount_login_cancelled\"),\n            \"logoutUrl\": abs_uri(\"account_logout\"),\n            \"loginUrl\": request.build_absolute_uri(\n                self.get_login_url(request, method=\"oauth2\")\n            ),\n            \"errorUrl\": abs_uri(\"socialaccount_login_error\"),\n            \"csrfToken\": get_token(request),\n        }\n        ctx = {\"fb_data\": fb_data}\n        return render_to_string(\"facebook/fbconnect.html\", ctx, request=request)\n\n    def get_nonce(self, request, or_create=False, pop=False):\n        if pop:\n            nonce = request.session.pop(NONCE_SESSION_KEY, None)\n        else:\n            nonce = request.session.get(NONCE_SESSION_KEY)\n        if not nonce and or_create:\n            nonce = get_random_string(NONCE_LENGTH)\n            request.session[NONCE_SESSION_KEY] = nonce\n        return nonce\n\n    def extract_uid(self, data):\n        return data[\"id\"]\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"username\"),\n            first_name=data.get(\"first_name\"),\n            last_name=data.get(\"last_name\"),\n            name=data.get(\"name\"),\n        )\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"email\")\n        if email:\n            # data['verified'] does not imply the email address is\n            # verified.\n            ret.append(EmailAddress(email=email, verified=False, primary=True))\n        return ret\n\n    def verify_token(self, request, token: dict):\n        \"\"\"\n        Verifies both normal oAuth2-style \"access_token\"s as well\n        as OIDC-style \"Limited Login\" JWTs.\n\n        Limited Login is an OIDC-based form of Facebook Login\n        that their iOS SDK uses when App Tracking Transparency consent is denied.\n        \"\"\"\n        from allauth.socialaccount.providers.facebook import flows\n\n        access_token = token.get(\"access_token\")\n        id_token = token.get(\"id_token\")\n\n        if not any([access_token, id_token]):\n            raise get_adapter().validation_error(\"invalid_token\")\n\n        try:\n            if access_token:\n                return flows.verify_token(request, self, access_token)\n            else:\n                assert id_token  # nosec\n                return flows.verify_limited_login_token(request, self, id_token)\n        except (OAuth2Error, requests.RequestException) as e:\n            raise get_adapter().validation_error(\"invalid_token\") from e\n\n\nprovider_classes = [FacebookProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/facebook/static/facebook/js/fbconnect.js",
    "content": "/* global document, window, FB */\n(function () {\n  'use strict'\n\n  function postForm (action, data) {\n    const f = document.createElement('form')\n    f.method = 'POST'\n    f.action = action\n\n    for (const key in data) {\n      const d = document.createElement('input')\n      d.type = 'hidden'\n      d.name = key\n      d.value = data[key]\n      f.appendChild(d)\n    }\n    document.body.appendChild(f)\n    f.submit()\n  }\n\n  function setLocationHref (url) {\n    if (typeof (url) === 'function') {\n      // Deprecated -- instead, override\n      // allauth.facebook.onLoginError et al directly.\n      url()\n    } else {\n      window.location.href = url\n    }\n  }\n\n  const allauth = window.allauth = window.allauth || {}\n  const fbSettings = JSON.parse(document.getElementById('allauth-facebook-settings').textContent)\n  let fbInitialized = false\n\n  allauth.facebook = {\n\n    init: function (opts) {\n      this.opts = opts\n\n      window.fbAsyncInit = function () {\n        FB.init(opts.initParams)\n        fbInitialized = true\n        allauth.facebook.onInit()\n      };\n\n      (function (d) {\n        const id = 'facebook-jssdk'\n        if (d.getElementById(id)) { return }\n        const js = d.createElement('script'); js.id = id; js.async = true\n        js.src = opts.sdkUrl\n        d.getElementsByTagName('head')[0].appendChild(js)\n      }(document))\n    },\n\n    onInit: function () {\n    },\n\n    login: function (nextUrl, action, process, scope) {\n      const self = this\n      if (!fbInitialized) {\n        const url = this.opts.loginUrl + '?next=' + encodeURIComponent(nextUrl) + '&action=' + encodeURIComponent(action) + '&process=' + encodeURIComponent(process) + '&scope=' + encodeURIComponent(scope)\n        setLocationHref(url)\n        return\n      }\n      if (action === 'reauthenticate' || action === 'rerequest') {\n        this.opts.loginOptions.auth_type = action\n      }\n      if (scope !== '') {\n        this.opts.loginOptions.scope = scope\n      }\n\n      FB.login(function (response) {\n        if (response.authResponse) {\n          self.onLoginSuccess(response, nextUrl, process)\n        } else if (response && response.status && ['not_authorized', 'unknown'].indexOf(response.status) > -1) {\n          self.onLoginCanceled(response)\n        } else {\n          self.onLoginError(response)\n        }\n      }, self.opts.loginOptions)\n    },\n\n    onLoginCanceled: function (/* response */) {\n      setLocationHref(this.opts.cancelUrl)\n    },\n\n    onLoginError: function (/* response */) {\n      setLocationHref(this.opts.errorUrl)\n    },\n\n    onLoginSuccess: function (response, nextUrl, process) {\n      const data = {\n        next: nextUrl || '',\n        process,\n        access_token: response.authResponse.accessToken,\n        expires_in: response.authResponse.expiresIn,\n        csrfmiddlewaretoken: this.opts.csrfToken\n      }\n\n      postForm(this.opts.loginByTokenUrl, data)\n    },\n\n    logout: function (nextUrl) {\n      const self = this\n      if (!fbInitialized) {\n        return\n      }\n      FB.logout(function (response) {\n        self.onLogoutSuccess(response, nextUrl)\n      })\n    },\n\n    onLogoutSuccess: function (response, nextUrl) {\n      const data = {\n        next: nextUrl || '',\n        csrfmiddlewaretoken: this.opts.csrfToken\n      }\n\n      postForm(this.opts.logoutUrl, data)\n    }\n  }\n\n  allauth.facebook.init(fbSettings)\n})()\n"
  },
  {
    "path": "allauth/socialaccount/providers/facebook/templates/facebook/fbconnect.html",
    "content": "{% load static %}\n<div id=\"fb-root\"></div>\n{{ fb_data|json_script:\"allauth-facebook-settings\" }}\n<script src=\"{% static 'facebook/js/fbconnect.js' %}\"></script>\n"
  },
  {
    "path": "allauth/socialaccount/providers/facebook/urls.py",
    "content": "from django.urls import path\n\nfrom allauth.socialaccount.providers.facebook.provider import FacebookProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\nfrom . import views\n\n\nurlpatterns = default_urlpatterns(FacebookProvider)\n\nurlpatterns += [\n    path(\n        \"facebook/login/token/\",\n        views.login_by_token,\n        name=\"facebook_login_by_token\",\n    ),\n]\n"
  },
  {
    "path": "allauth/socialaccount/providers/facebook/views.py",
    "content": "import logging\nimport requests\n\nfrom django import forms\nfrom django.core.exceptions import PermissionDenied\nfrom django.utils.decorators import method_decorator\nfrom django.views.generic import View\n\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.helpers import (\n    complete_social_login,\n    render_authentication_error,\n)\nfrom allauth.socialaccount.models import SocialLogin\nfrom allauth.socialaccount.providers.facebook import flows\nfrom allauth.socialaccount.providers.facebook.constants import (\n    GRAPH_API_URL,\n    GRAPH_API_VERSION,\n    PROVIDER_ID,\n)\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\nfrom .forms import FacebookConnectForm\n\n\nlogger = logging.getLogger(__name__)\n\n\nclass FacebookOAuth2Adapter(OAuth2Adapter):\n    provider_id = PROVIDER_ID\n    provider_default_auth_url = (\n        f\"https://www.facebook.com/{GRAPH_API_VERSION}/dialog/oauth\"\n    )\n\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n    scope_delimiter = \",\"\n    authorize_url = settings.get(\"AUTHORIZE_URL\", provider_default_auth_url)\n    access_token_url = f\"{GRAPH_API_URL}/oauth/access_token\"\n    access_token_method = \"GET\"  # nosec\n    expires_in_key = \"expires_in\"\n\n    def complete_login(self, request, app, access_token, **kwargs):\n        provider = self.get_provider()\n        return flows.complete_login(request, provider, access_token)\n\n\noauth2_login = OAuth2LoginView.adapter_view(FacebookOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(FacebookOAuth2Adapter)\n\n\nclass LoginByTokenView(View):\n    @method_decorator(login_not_required)\n    def dispatch(self, request):\n        self.adapter = get_adapter()\n        self.provider = self.adapter.get_provider(request, PROVIDER_ID)\n        try:\n            return super().dispatch(request)\n        except (\n            requests.RequestException,\n            forms.ValidationError,\n            PermissionDenied,\n        ) as exc:\n            return render_authentication_error(request, self.provider, exception=exc)\n\n    def get(self, request):\n        # If we leave out get().get() it will return a response with a 405, but\n        # we really want to show an authentication error.\n        raise PermissionDenied(\"405\")\n\n    def post(self, request):\n        form = FacebookConnectForm(request.POST)\n        if not form.is_valid():\n            raise self.adapter.validation_error(\"invalid_token\")\n        access_token = form.cleaned_data[\"access_token\"]\n        provider = self.provider\n        login_options = provider.get_fb_login_options(request)\n        auth_type = login_options.get(\"auth_type\")\n        auth_nonce = \"\"\n        if auth_type == \"reauthenticate\":\n            auth_nonce = provider.get_nonce(request, pop=True)\n        login = flows.verify_token(\n            request, provider, access_token, auth_type, auth_nonce\n        )\n        login.state = SocialLogin.state_from_request(request)\n        ret = complete_social_login(request, login)\n        return ret\n\n\nlogin_by_token = LoginByTokenView.as_view()\n"
  },
  {
    "path": "allauth/socialaccount/providers/feedly/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/feedly/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.feedly.views import FeedlyOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass FeedlyAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"picture\")\n\n\nclass FeedlyProvider(OAuth2Provider):\n    id = \"feedly\"\n    name = \"Feedly\"\n    account_class = FeedlyAccount\n    oauth2_adapter_class = FeedlyOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"https://cloud.feedly.com/subscriptions\"]\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            last_name=data.get(\"familyName\"),\n            first_name=data.get(\"givenName\"),\n        )\n\n\nprovider_classes = [FeedlyProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/feedly/urls.py",
    "content": "from allauth.socialaccount.providers.feedly.provider import FeedlyProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(FeedlyProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/feedly/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass FeedlyOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"feedly\"\n    host = app_settings.PROVIDERS.get(provider_id, {}).get(\"HOST\", \"cloud.feedly.com\")\n    access_token_url = f\"https://{host}/v3/auth/token\"\n    authorize_url = f\"https://{host}/v3/auth/auth\"\n    profile_url = f\"https://{host}/v3/profile\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"OAuth {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(FeedlyOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(FeedlyOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/feishu/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/feishu/client.py",
    "content": "import json\nfrom collections import OrderedDict\n\nfrom django.utils.http import urlencode\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Client, OAuth2Error\n\n\nclass FeishuOAuth2Client(OAuth2Client):\n    app_access_token_url = (\n        \"https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal/\"  # nosec\n    )\n\n    def get_redirect_url(self, authorization_url, scope, extra_params):\n        scope = self.scope_delimiter.join(set(scope))\n        params = {\n            \"app_id\": self.consumer_key,\n            \"redirect_uri\": self.callback_url,\n            \"scope\": scope,\n            \"response_type\": \"code\",\n        }\n        if self.state:\n            params[\"state\"] = self.state\n        params.update(extra_params)\n        sorted_params = OrderedDict()\n        for param in sorted(params):\n            sorted_params[param] = params[param]\n        return f\"{authorization_url}?{urlencode(sorted_params)}\"\n\n    def app_access_token(self):\n        data = {\n            \"app_id\": self.consumer_key,\n            \"app_secret\": self.consumer_secret,\n        }\n\n        self._strip_empty_keys(data)\n        url = self.app_access_token_url\n\n        # TODO: Proper exception handling\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.request(\"POST\", url, data=data)\n            resp.raise_for_status()\n            access_token = resp.json()\n        if not access_token or \"app_access_token\" not in access_token:\n            raise OAuth2Error(f\"Error retrieving app access token: {resp.content}\")\n        return access_token[\"app_access_token\"]\n\n    def get_access_token(self, code, pkce_code_verifier=None):\n        data = {\n            \"grant_type\": \"authorization_code\",\n            \"code\": code,\n            \"app_access_token\": self.app_access_token(),\n        }\n        params = None\n        self._strip_empty_keys(data)\n        url = self.access_token_url\n        if self.access_token_method == \"GET\":  # nosec\n            params = data\n            data = None\n        if data and pkce_code_verifier:\n            data[\"code_verifier\"] = pkce_code_verifier\n        # TODO: Proper exception handling\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.request(\n                self.access_token_method,\n                url,\n                params=params,\n                data=json.dumps(data),\n                headers={\"Content-Type\": \"application/json\"},\n            )\n            resp.raise_for_status()\n            access_token = resp.json()\n        if (\n            not access_token\n            or \"data\" not in access_token\n            or \"access_token\" not in access_token[\"data\"]\n        ):\n            raise OAuth2Error(f\"Error retrieving access token: {resp.content}\")\n        return access_token[\"data\"]\n"
  },
  {
    "path": "allauth/socialaccount/providers/feishu/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.feishu.views import FeishuOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass FeishuAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"avatar_big\")\n\n\nclass FeishuProvider(OAuth2Provider):\n    id = \"feishu\"\n    name = \"feishu\"\n    account_class = FeishuAccount\n    oauth2_adapter_class = FeishuOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"open_id\"]\n\n    def extract_common_fields(self, data):\n        return dict(username=data.get(\"name\"), name=data.get(\"name\"))\n\n\nprovider_classes = [FeishuProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/feishu/urls.py",
    "content": "from allauth.socialaccount.providers.feishu.provider import FeishuProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(FeishuProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/feishu/views.py",
    "content": "from django.urls import reverse\n\nfrom allauth.account import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\nfrom allauth.utils import build_absolute_uri\n\nfrom .client import FeishuOAuth2Client\n\n\nclass FeishuOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"feishu\"\n\n    authorization_url = \"https://open.feishu.cn/open-apis/authen/v1/index\"\n    access_token_url = (\n        \"https://open.feishu.cn/open-apis/authen/v1/access_token\"  # nosec\n    )\n    app_access_token_url = (\n        \"https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal/\"  # nosec\n    )\n    user_info_url = \"https://open.feishu.cn/open-apis/authen/v1/user_info\"\n\n    @property\n    def authorize_url(self):\n        settings = self.get_provider().get_settings()\n        url = settings.get(\"AUTHORIZE_URL\", self.authorization_url)\n        return url\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\n            \"Content-Type\": \"application/json\",\n            \"Authorization\": f\"Bearer {token.token}\",\n        }\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.user_info_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        if extra_data[\"code\"] != 0:\n            raise OAuth2Error(f\"Error retrieving code: {resp.content}\")\n        extra_data = extra_data[\"data\"]\n\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n    def get_client(self, request, app):\n        callback_url = reverse(f\"{self.provider_id}_callback\")\n        protocol = self.redirect_uri_protocol or app_settings.DEFAULT_HTTP_PROTOCOL\n        callback_url = build_absolute_uri(request, callback_url, protocol=protocol)\n        client = FeishuOAuth2Client(\n            request,\n            app.client_id,\n            app.secret,\n            self.access_token_method,\n            self.access_token_url,\n            callback_url,\n        )\n        return client\n\n\noauth2_login = OAuth2LoginView.adapter_view(FeishuOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(FeishuOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/figma/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/figma/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount import providers\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.figma.views import FigmaOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass FigmaAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"img_url\", \"\")\n\n\nclass FigmaProvider(OAuth2Provider):\n    id = \"figma\"\n    name = \"Figma\"\n    account_class = FigmaAccount\n    oauth2_adapter_class = FigmaOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return {\n            \"email\": data.get(\"email\"),\n            \"name\": data.get(\"handle\"),\n        }\n\n    def extract_email_addresses(self, data):\n        email = EmailAddress(\n            email=data.get(\"email\"),\n            primary=True,\n            verified=False,\n        )\n        return [email]\n\n\nproviders.registry.register(FigmaProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/figma/urls.py",
    "content": "from allauth.socialaccount.providers.figma.provider import FigmaProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(FigmaProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/figma/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass FigmaOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"figma\"\n\n    authorize_url = \"https://www.figma.com/oauth\"\n    access_token_url = \"https://www.figma.com/api/oauth/token\"  # nosec\n    userinfo_url = \"https://api.figma.com/v1/me\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.userinfo_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(FigmaOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(FigmaOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/fivehundredpx/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/fivehundredpx/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/fivehundredpx/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.fivehundredpx.views import (\n    FiveHundredPxOAuthAdapter,\n)\nfrom allauth.socialaccount.providers.oauth.provider import OAuthProvider\n\n\nclass FiveHundredPxAccount(ProviderAccount):\n    def get_profile_url(self):\n        return f\"https://500px.com/{self.account.extra_data.get('username')}\"\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"userpic_url\")\n\n\nclass FiveHundredPxProvider(OAuthProvider):\n    id = \"500px\"\n    name = \"500px\"\n    package = \"allauth.socialaccount.providers.fivehundredpx\"\n    account_class = FiveHundredPxAccount\n    oauth_adapter_class = FiveHundredPxOAuthAdapter\n\n    def get_default_scope(self):\n        return []\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            username=data.get(\"username\"),\n            email=data.get(\"email\"),\n            first_name=data.get(\"firstname\"),\n            last_name=data.get(\"lastname\"),\n        )\n\n\nprovider_classes = [FiveHundredPxProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/fivehundredpx/urls.py",
    "content": "from allauth.socialaccount.providers.fivehundredpx.provider import FiveHundredPxProvider\nfrom allauth.socialaccount.providers.oauth.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(FiveHundredPxProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/fivehundredpx/views.py",
    "content": "from allauth.socialaccount.providers.oauth.client import OAuth\nfrom allauth.socialaccount.providers.oauth.views import (\n    OAuthAdapter,\n    OAuthCallbackView,\n    OAuthLoginView,\n)\n\n\nAPI_BASE = \"https://api.500px.com/v1\"\n\n\nclass FiveHundredPxAPI(OAuth):\n    \"\"\"\n    Verifying 500px credentials\n    \"\"\"\n\n    url = f\"{API_BASE}/users\"\n\n    def get_user_info(self):\n        return self.query(self.url).json()[\"user\"]\n\n\nclass FiveHundredPxOAuthAdapter(OAuthAdapter):\n    provider_id = \"500px\"\n    request_token_url = f\"{API_BASE}/oauth/request_token\"\n    access_token_url = f\"{API_BASE}/oauth/access_token\"\n    authorize_url = f\"{API_BASE}/oauth/authorize\"\n\n    def complete_login(self, request, app, token, response):\n        client = FiveHundredPxAPI(\n            request, app.client_id, app.secret, self.request_token_url\n        )\n        extra_data = client.get_user_info()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth_login = OAuthLoginView.adapter_view(FiveHundredPxOAuthAdapter)\noauth_callback = OAuthCallbackView.adapter_view(FiveHundredPxOAuthAdapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/flickr/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/flickr/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.flickr.views import FlickrOAuthAdapter\nfrom allauth.socialaccount.providers.oauth.provider import OAuthProvider\n\n\nclass FlickrAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"person\").get(\"profileurl\").get(\"_content\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"picture-url\")\n\n    def to_str(self):\n        username = (\n            self.account.extra_data.get(\"person\", {})\n            .get(\"username\", {})\n            .get(\"_content\")\n        )\n        if username:\n            return username\n        realname = (\n            self.account.extra_data.get(\"person\", {})\n            .get(\"realname\", {})\n            .get(\"_content\")\n        )\n        if realname:\n            return realname\n        return super().to_str()\n\n\nclass FlickrProvider(OAuthProvider):\n    id = \"flickr\"\n    name = \"Flickr\"\n    account_class = FlickrAccount\n    oauth_adapter_class = FlickrOAuthAdapter\n\n    def get_default_scope(self):\n        scope = []\n        return scope\n\n    def get_auth_params_from_request(self, request, action):\n        ret = super().get_auth_params_from_request(request, action)\n        if \"perms\" not in ret:\n            ret[\"perms\"] = \"read\"\n        return ret\n\n    def get_profile_fields(self):\n        default_fields = [\n            \"id\",\n            \"first-name\",\n            \"last-name\",\n            \"email-address\",\n            \"picture-url\",\n            \"public-profile-url\",\n        ]\n        fields = self.get_settings().get(\"PROFILE_FIELDS\", default_fields)\n        return fields\n\n    def extract_uid(self, data):\n        return data[\"person\"][\"nsid\"]\n\n    def extract_common_fields(self, data):\n        person = data.get(\"person\", {})\n        name = person.get(\"realname\", {}).get(\"_content\")\n        username = person.get(\"username\", {}).get(\"_content\")\n        return dict(email=data.get(\"email-address\"), name=name, username=username)\n\n\nprovider_classes = [FlickrProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/flickr/urls.py",
    "content": "from allauth.socialaccount.providers.flickr.provider import FlickrProvider\nfrom allauth.socialaccount.providers.oauth.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(FlickrProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/flickr/views.py",
    "content": "from django.utils.http import urlencode\n\nfrom allauth.socialaccount.providers.oauth.client import OAuth\nfrom allauth.socialaccount.providers.oauth.views import (\n    OAuthAdapter,\n    OAuthCallbackView,\n    OAuthLoginView,\n)\n\n\nclass FlickrAPI(OAuth):\n    api_url = \"https://api.flickr.com/services/rest\"\n\n    def get_user_info(self):\n        default_params = {\"nojsoncallback\": \"1\", \"format\": \"json\"}\n        p = dict({\"method\": \"flickr.test.login\"}, **default_params)\n        u = self.query(f\"{self.api_url}?{urlencode(p)}\").json()\n\n        p = dict(\n            {\"method\": \"flickr.people.getInfo\", \"user_id\": u[\"user\"][\"id\"]},\n            **default_params,\n        )\n        user = self.query(f\"{self.api_url}?{urlencode(p)}\").json()\n        return user\n\n\nclass FlickrOAuthAdapter(OAuthAdapter):\n    provider_id = \"flickr\"\n    request_token_url = \"https://www.flickr.com/services/oauth/request_token\"  # nosec\n    access_token_url = \"https://www.flickr.com/services/oauth/access_token\"  # nosec\n    authorize_url = \"https://www.flickr.com/services/oauth/authorize\"\n\n    def complete_login(self, request, app, token, response):\n        client = FlickrAPI(request, app.client_id, app.secret, self.request_token_url)\n        extra_data = client.get_user_info()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth_login = OAuthLoginView.adapter_view(FlickrOAuthAdapter)\noauth_callback = OAuthCallbackView.adapter_view(FlickrOAuthAdapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/foursquare/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/foursquare/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.foursquare.views import FoursquareOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass FoursquareAccount(ProviderAccount):\n    def get_profile_url(self):\n        return f\"https://foursquare.com/user/{self.account.extra_data.get('id')}\"\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"photo\")\n\n    def to_str(self):\n        dflt = super().to_str()\n        return self.account.extra_data.get(\"contact\", {}).get(\"email\", dflt)\n\n\nclass FoursquareProvider(OAuth2Provider):\n    id = \"foursquare\"\n    name = \"Foursquare\"\n    account_class = FoursquareAccount\n    oauth2_adapter_class = FoursquareOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            first_name=data.get(\"firstname\"),\n            last_name=data.get(\"lastname\"),\n            email=data.get(\"contact\").get(\"email\"),\n        )\n\n\nprovider_classes = [FoursquareProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/foursquare/urls.py",
    "content": "from allauth.socialaccount.providers.foursquare.provider import FoursquareProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(FoursquareProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/foursquare/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass FoursquareOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"foursquare\"\n    access_token_url = \"https://foursquare.com/oauth2/access_token\"  # nosec\n    # Issue ?? -- this one authenticates over and over again...\n    # authorize_url = 'https://foursquare.com/oauth2/authorize'\n    authorize_url = \"https://foursquare.com/oauth2/authenticate\"\n    profile_url = \"https://api.foursquare.com/v2/users/self\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        # Foursquare needs a version number for their API requests as\n        # documented here\n        # https://developer.foursquare.com/overview/versioning\n        with get_adapter().get_requests_session() as sess:\n            params = {\"oauth_token\": token.token, \"v\": \"20140116\"}\n            resp = sess.get(self.profile_url, params=params)\n            extra_data = resp.json()[\"response\"][\"user\"]\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(FoursquareOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(FoursquareOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/frontier/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/frontier/provider.py",
    "content": "import hashlib\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.frontier.views import FrontierOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass FrontierAccount(ProviderAccount):\n    def get_profile_url(self):\n        return None\n\n    def get_avatar_url(self):\n        email_hash = hashlib.sha256(\n            self.account.extra_data.get(\"email\").lower().encode(\"utf-8\")\n        ).hexdigest()\n        return f\"https://www.gravatar.com/avatar/{email_hash}?d=mp\"\n\n\nclass FrontierProvider(OAuth2Provider):\n    id = \"frontier\"\n    name = \"Frontier\"\n    account_class = FrontierAccount\n    oauth2_adapter_class = FrontierOAuth2Adapter\n\n    def get_default_scope(self):\n        scope = [\"auth\", \"capi\"]\n        return scope\n\n    def extract_uid(self, data):\n        return str(data[\"customer_id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"email\"),\n            last_name=data.get(\"lastname\"),\n            first_name=data.get(\"firstname\"),\n        )\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"email\")\n        if email:\n            ret.append(EmailAddress(email=email, verified=True, primary=True))\n        return ret\n\n\nprovider_classes = [FrontierProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/frontier/urls.py",
    "content": "from allauth.socialaccount.providers.frontier.provider import FrontierProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(FrontierProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/frontier/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass FrontierOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"frontier\"\n    AUTH_API = \"https://auth.frontierstore.net\"\n    access_token_url = f\"{AUTH_API}/token\"\n    authorize_url = f\"{AUTH_API}/auth\"\n    profile_url = f\"{AUTH_API}/me\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(FrontierOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(FrontierOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/fxa/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/fxa/constants.py",
    "content": "from django.conf import settings\n\n\n_FXA_SETTINGS = getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {}).get(\"fxa\", {})\nFXA_OAUTH_ENDPOINT = _FXA_SETTINGS.get(\n    \"OAUTH_ENDPOINT\", \"https://oauth.accounts.firefox.com/v1\"\n)\nFXA_PROFILE_ENDPOINT = _FXA_SETTINGS.get(\n    \"PROFILE_ENDPOINT\", \"https://profile.accounts.firefox.com/v1\"\n)\nPROVIDER_ID = \"fxa\"\n"
  },
  {
    "path": "allauth/socialaccount/providers/fxa/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/fxa/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.fxa.constants import PROVIDER_ID\nfrom allauth.socialaccount.providers.fxa.views import FirefoxAccountsOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass FirefoxAccountsAccount(ProviderAccount):\n    pass\n\n\nclass FirefoxAccountsProvider(OAuth2Provider):\n    id = PROVIDER_ID\n    name = \"Firefox Accounts\"\n    account_class = FirefoxAccountsAccount\n    oauth2_adapter_class = FirefoxAccountsOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"profile\"]\n\n    def extract_uid(self, data):\n        return str(data[\"uid\"])\n\n    def extract_common_fields(self, data):\n        return dict(email=data.get(\"email\"))\n\n\nprovider_classes = [FirefoxAccountsProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/fxa/urls.py",
    "content": "from allauth.socialaccount.providers.fxa.provider import FirefoxAccountsProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(FirefoxAccountsProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/fxa/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\nfrom .constants import FXA_OAUTH_ENDPOINT, FXA_PROFILE_ENDPOINT, PROVIDER_ID\n\n\nclass FirefoxAccountsOAuth2Adapter(OAuth2Adapter):\n    provider_id = PROVIDER_ID\n    access_token_url = f\"{FXA_OAUTH_ENDPOINT}/token\"\n    authorize_url = f\"{FXA_OAUTH_ENDPOINT}/authorization\"\n    profile_url = f\"{FXA_PROFILE_ENDPOINT}/profile\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(FirefoxAccountsOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(FirefoxAccountsOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/gitea/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/gitea/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.gitea.views import GiteaOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass GiteaAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"html_url\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"avatar_url\")\n\n    def to_str(self):\n        dflt = super().to_str()\n        return next(\n            value\n            for value in (\n                self.account.extra_data.get(\"username\", None),\n                self.account.extra_data.get(\"login\", None),\n                dflt,\n            )\n            if value is not None\n        )\n\n\nclass GiteaProvider(OAuth2Provider):\n    id = \"gitea\"\n    name = \"Gitea\"\n    account_class = GiteaAccount\n    oauth2_adapter_class = GiteaOAuth2Adapter\n\n    def get_default_scope(self):\n        scope = []\n        return scope\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"login\"),\n            name=data.get(\"name\"),\n        )\n\n\nprovider_classes = [GiteaProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/gitea/urls.py",
    "content": "from allauth.socialaccount.providers.gitea.provider import GiteaProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(GiteaProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/gitea/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass GiteaOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"gitea\"\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n\n    if \"GITEA_URL\" in settings:\n        web_url = settings.get(\"GITEA_URL\").rstrip(\"/\")\n    else:\n        web_url = \"https://gitea.com\"\n    api_url = f\"{web_url}/api/v1\"\n\n    access_token_url = f\"{web_url}/login/oauth/access_token\"\n    authorize_url = f\"{web_url}/login/oauth/authorize\"\n    profile_url = f\"{api_url}/user\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"token {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(GiteaOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(GiteaOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/github/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/github/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.github.views import GitHubOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass GitHubAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"html_url\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"avatar_url\")\n\n\nclass GitHubProvider(OAuth2Provider):\n    id = \"github\"\n    name = \"GitHub\"\n    account_class = GitHubAccount\n    oauth2_adapter_class = GitHubOAuth2Adapter\n\n    def get_default_scope(self):\n        scope = []\n        if app_settings.QUERY_EMAIL:\n            scope.append(\"user:email\")\n        return scope\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"login\"),\n            name=data.get(\"name\"),\n        )\n\n    def extract_extra_data(self, data):\n        if \"emails\" in data:\n            data = dict(data)\n            data.pop(\"emails\")\n        return data\n\n    def extract_email_addresses(self, data):\n        ret = []\n        for email in data.get(\"emails\", []):\n            ret.append(\n                EmailAddress(\n                    email=email[\"email\"],\n                    primary=email[\"primary\"],\n                    verified=email[\"verified\"],\n                )\n            )\n        return ret\n\n\nprovider_classes = [GitHubProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/github/urls.py",
    "content": "from allauth.socialaccount.providers.github.provider import GitHubProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(GitHubProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/github/views.py",
    "content": "from http import HTTPStatus\n\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass GitHubOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"github\"\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n\n    if \"GITHUB_URL\" in settings:\n        web_url = settings.get(\"GITHUB_URL\").rstrip(\"/\")\n        api_url = f\"{web_url}/api/v3\"\n    else:\n        web_url = \"https://github.com\"\n        api_url = \"https://api.github.com\"\n\n    access_token_url = f\"{web_url}/login/oauth/access_token\"\n    authorize_url = f\"{web_url}/login/oauth/authorize\"\n    profile_url = f\"{api_url}/user\"\n    emails_url = f\"{api_url}/user/emails\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"token {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        if app_settings.QUERY_EMAIL:\n            if emails := self.get_emails(headers):\n                extra_data[\"emails\"] = emails\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n    def get_emails(self, headers) -> list | None:\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.emails_url, headers=headers)\n            # https://api.github.com/user/emails -- 404 is documented to occur.\n            if resp.status_code == HTTPStatus.NOT_FOUND:\n                return None\n            resp.raise_for_status()\n            return resp.json()\n\n\noauth2_login = OAuth2LoginView.adapter_view(GitHubOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(GitHubOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/gitlab/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/gitlab/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.gitlab.views import GitLabOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass GitLabAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"web_url\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"avatar_url\")\n\n\nclass GitLabProvider(OAuth2Provider):\n    id = \"gitlab\"\n    name = \"GitLab\"\n    account_class = GitLabAccount\n    oauth2_adapter_class = GitLabOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"read_user\"]\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"username\"),\n            name=data.get(\"name\"),\n        )\n\n\nprovider_classes = [GitLabProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/gitlab/urls.py",
    "content": "from allauth.socialaccount.providers.gitlab.provider import GitLabProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(GitLabProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/gitlab/views.py",
    "content": "from http import HTTPStatus\n\nfrom allauth.core import context\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\ndef _check_errors(response):\n    #  403 error's are presented as user-facing errors\n    if response.status_code == HTTPStatus.FORBIDDEN:\n        msg = response.content\n        raise OAuth2Error(f\"Invalid data from GitLab API: {msg!r}\")\n\n    try:\n        data = response.json()\n    except ValueError:  # JSONDecodeError on py3\n        raise OAuth2Error(f\"Invalid JSON from GitLab API: {response.text!r}\")\n\n    if response.status_code >= HTTPStatus.BAD_REQUEST or \"error\" in data:\n        # For errors, we expect the following format:\n        # {\"error\": \"error_name\", \"error_description\": \"Oops!\"}\n        # For example, if the token is not valid, we will get:\n        # {\"message\": \"status_code - message\"}\n        error = data.get(\"error\", \"\") or response.status_code\n        desc = data.get(\"error_description\", \"\") or data.get(\"message\", \"\")\n\n        raise OAuth2Error(f\"GitLab error: {error} ({desc})\")\n\n    # The expected output from the API follows this format:\n    # {\"id\": 12345, ...}\n    if \"id\" not in data:\n        # If the id is not present, the output is not usable (no UID)\n        raise OAuth2Error(f\"Invalid data from GitLab API: {data!r}\")\n\n    return data\n\n\nclass GitLabOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"gitlab\"\n    provider_default_url = \"https://gitlab.com\"\n    provider_api_version = \"v4\"\n\n    def _build_url(self, path):\n        settings = app_settings.PROVIDERS.get(self.provider_id, {})\n        gitlab_url = settings.get(\"GITLAB_URL\", self.provider_default_url)\n        # Prefer app based setting.\n        app = get_adapter().get_app(context.request, provider=self.provider_id)\n        gitlab_url = app.settings.get(\"gitlab_url\", gitlab_url)\n        return f\"{gitlab_url}{path}\"\n\n    @property\n    def access_token_url(self):\n        return self._build_url(\"/oauth/token\")\n\n    @property\n    def authorize_url(self):\n        return self._build_url(\"/oauth/authorize\")\n\n    @property\n    def profile_url(self):\n        return self._build_url(f\"/api/{self.provider_api_version}/user\")\n\n    def complete_login(self, request, app, token, response):\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, params={\"access_token\": token.token})\n            data = _check_errors(response)\n        return self.get_provider().sociallogin_from_response(request, data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(GitLabOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(GitLabOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/globus/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/globus/provider.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.providers.base import ProviderAccount, ProviderException\nfrom allauth.socialaccount.providers.globus.views import GlobusOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass GlobusAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"web_url\", \"dflt\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"avatar_url\", \"dflt\")\n\n\nclass GlobusProvider(OAuth2Provider):\n    id = \"globus\"\n    name = \"Globus\"\n    account_class = GlobusAccount\n    oauth2_adapter_class = GlobusOAuth2Adapter\n\n    def extract_uid(self, data):\n        if \"sub\" not in data:\n            raise ProviderException(\"Globus OAuth error\", data)\n        return str(data[\"sub\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"preferred_username\"),\n            name=data.get(\"name\"),\n        )\n\n    def get_default_scope(self):\n        scope = [\"openid\", \"profile\", \"offline_access\"]\n        if app_settings.QUERY_EMAIL:\n            scope.append(\"email\")\n        return scope\n\n\nprovider_classes = [GlobusProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/globus/urls.py",
    "content": "from allauth.socialaccount.providers.globus.provider import GlobusProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(GlobusProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/globus/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass GlobusOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"globus\"\n    provider_default_url = \"https://auth.globus.org/v2/oauth2\"\n\n    provider_base_url = \"https://auth.globus.org/v2/oauth2\"\n\n    access_token_url = f\"{provider_base_url}/token\"\n    authorize_url = f\"{provider_base_url}/authorize\"\n    profile_url = f\"{provider_base_url}/userinfo\"\n\n    def complete_login(self, request, app, token, response):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(\n                self.profile_url,\n                params={\"access_token\": token.token},\n                headers=headers,\n            )\n            extra_data = resp.json()\n\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(GlobusOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(GlobusOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/google/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/google/provider.py",
    "content": "import requests\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.app_settings import QUERY_EMAIL\nfrom allauth.socialaccount.providers.base import AuthAction, ProviderAccount\nfrom allauth.socialaccount.providers.google.views import GoogleOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass Scope:\n    EMAIL = \"email\"\n    PROFILE = \"profile\"\n\n\nclass GoogleAccount(ProviderAccount):\n    \"\"\"\n    The account data can be in two formats. One, originating from\n    the /v2/userinfo endpoint:\n\n        {'email': 'john.doe@gmail.com',\n         'given_name': 'John',\n         'id': '12345678901234567890',\n         'locale': 'en',\n         'name': 'John',\n         'picture': 'https://lh3.googleusercontent.com/a/code',\n         'verified_email': True}\n\n    The second, which is the payload of the id_token:\n\n        {'at_hash': '-someHASH',\n         'aud': '123-pqr.apps.googleusercontent.com',\n         'azp': '123-pqr.apps.googleusercontent.com',\n         'email': 'john.doe@gmail.com',\n         'email_verified': True,\n         'exp': 1707297277,\n         'given_name': 'John',\n         'iat': 1707293677,\n         'iss': 'https://accounts.google.com',\n         'locale': 'en',\n         'name': 'John',\n         'picture': 'https://lh3.googleusercontent.com/a/code',\n         'sub': '12345678901234567890'}\n    \"\"\"\n\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"link\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"picture\")\n\n\nclass GoogleProvider(OAuth2Provider):\n    id = \"google\"\n    name = \"Google\"\n    account_class = GoogleAccount\n    oauth2_adapter_class = GoogleOAuth2Adapter\n    supports_token_authentication = True\n\n    def get_default_scope(self):\n        scope = [Scope.PROFILE]\n        if QUERY_EMAIL:\n            scope.append(Scope.EMAIL)\n        return scope\n\n    def get_auth_params_from_request(self, request, action):\n        ret = super().get_auth_params_from_request(request, action)\n        if action == AuthAction.REAUTHENTICATE:\n            ret[\"prompt\"] = \"select_account consent\"\n        return ret\n\n    def extract_uid(self, data):\n        if \"sub\" in data:\n            return data[\"sub\"]\n        return data[\"id\"]\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            last_name=data.get(\"family_name\"),\n            first_name=data.get(\"given_name\"),\n        )\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"email\")\n        if email:\n            verified = bool(data.get(\"email_verified\") or data.get(\"verified_email\"))\n            ret.append(EmailAddress(email=email, verified=verified, primary=True))\n        return ret\n\n    def verify_token(self, request, token):\n        from allauth.socialaccount.providers.google import views\n\n        credential = token.get(\"id_token\")\n        if not credential:\n            raise get_adapter().validation_error(\"invalid_token\")\n        try:\n            identity_data = views._verify_and_decode(\n                app=self.app, credential=credential\n            )\n        except (OAuth2Error, requests.RequestException) as e:\n            raise get_adapter().validation_error(\"invalid_token\") from e\n        login = self.sociallogin_from_response(request, identity_data)\n        return login\n\n\nprovider_classes = [GoogleProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/google/urls.py",
    "content": "from django.urls import path\n\nfrom allauth.socialaccount.providers.google import views\nfrom allauth.socialaccount.providers.google.provider import GoogleProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(GoogleProvider)\n\nurlpatterns += [\n    path(\n        \"google/login/token/\",\n        views.login_by_token,\n        name=\"google_login_by_token\",\n    ),\n]\n"
  },
  {
    "path": "allauth/socialaccount/providers/google/views.py",
    "content": "import requests\n\nfrom django.conf import settings\nfrom django.core.exceptions import PermissionDenied, ValidationError\nfrom django.utils.decorators import method_decorator\nfrom django.views.decorators.csrf import csrf_exempt\nfrom django.views.generic import View\n\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.helpers import (\n    complete_social_login,\n    render_authentication_error,\n)\nfrom allauth.socialaccount.internal import jwtkit\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nCERTS_URL = (\n    getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {})\n    .get(\"google\", {})\n    .get(\"CERTS_URL\", \"https://www.googleapis.com/oauth2/v1/certs\")\n)\n\nIDENTITY_URL = (\n    getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {})\n    .get(\"google\", {})\n    .get(\"IDENTITY_URL\", \"https://www.googleapis.com/oauth2/v2/userinfo\")\n)\n\nACCESS_TOKEN_URL = (\n    getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {})\n    .get(\"google\", {})\n    .get(\"ACCESS_TOKEN_URL\", \"https://oauth2.googleapis.com/token\")\n)\n\nAUTHORIZE_URL = (\n    getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {})\n    .get(\"google\", {})\n    .get(\"AUTHORIZE_URL\", \"https://accounts.google.com/o/oauth2/v2/auth\")\n)\n\nID_TOKEN_ISSUER = (\n    getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {})\n    .get(\"google\", {})\n    .get(\"ID_TOKEN_ISSUER\", \"https://accounts.google.com\")\n)\n\nFETCH_USERINFO = (\n    getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {})\n    .get(\"google\", {})\n    .get(\"FETCH_USERINFO\", False)\n)\n\n\ndef _verify_and_decode(app, credential, verify_signature=True):\n    return jwtkit.verify_and_decode(\n        credential=credential,\n        keys_url=CERTS_URL,\n        issuer=ID_TOKEN_ISSUER,\n        audience=app.client_id,\n        lookup_kid=jwtkit.lookup_kid_pem_x509_certificate,\n        verify_signature=verify_signature,\n    )\n\n\nclass GoogleOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"google\"\n    access_token_url = ACCESS_TOKEN_URL\n    authorize_url = AUTHORIZE_URL\n    id_token_issuer = ID_TOKEN_ISSUER\n    identity_url = IDENTITY_URL\n    fetch_userinfo = FETCH_USERINFO\n\n    def complete_login(self, request, app, token, response, **kwargs):\n        data = None\n        id_token = response.get(\"id_token\")\n        if id_token:\n            data = self._decode_id_token(app, id_token)\n            if self.fetch_userinfo and \"picture\" not in data:\n                info = self._fetch_user_info(token.token)\n                picture = info.get(\"picture\")\n                if picture:\n                    data[\"picture\"] = picture\n        else:\n            data = self._fetch_user_info(token.token)\n        login = self.get_provider().sociallogin_from_response(request, data)\n        return login\n\n    def _decode_id_token(self, app, id_token):\n        \"\"\"\n        If the token was received by direct communication protected by\n        TLS between this library and Google, we are allowed to skip checking the\n        token signature according to the OpenID Connect Core 1.0 specification.\n\n        https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation\n        \"\"\"\n        verify_signature = not self.did_fetch_access_token\n        return _verify_and_decode(app, id_token, verify_signature=verify_signature)\n\n    def _fetch_user_info(self, access_token):\n        headers = {\"Authorization\": f\"Bearer {access_token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.identity_url, headers=headers)\n            if not resp.ok:\n                raise OAuth2Error(\"Request to user info failed\")\n            return resp.json()\n\n\noauth2_login = OAuth2LoginView.adapter_view(GoogleOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(GoogleOAuth2Adapter)\n\n\nclass LoginByTokenView(View):\n    @method_decorator(login_not_required)\n    def dispatch(self, request):\n        self.adapter = get_adapter()\n        self.provider = self.adapter.get_provider(\n            request, GoogleOAuth2Adapter.provider_id\n        )\n        try:\n            return super().dispatch(request)\n        except (\n            OAuth2Error,\n            requests.RequestException,\n            PermissionDenied,\n            ValidationError,\n        ) as exc:\n            return render_authentication_error(request, self.provider, exception=exc)\n\n    def get(self, request):\n        # If we leave out get() it will return a response with a 405, but\n        # we really want to show an authentication error.\n        raise PermissionDenied(\"405\")\n\n    def post(self, request, *args, **kwargs):\n        self.check_csrf(request)\n\n        credential = request.POST.get(\"credential\")\n        login = self.provider.verify_token(request, {\"id_token\": credential})\n        return complete_social_login(request, login)\n\n    def check_csrf(self, request):\n        csrf_token_cookie = request.COOKIES.get(\"g_csrf_token\")\n        if not csrf_token_cookie:\n            raise PermissionDenied(\"No CSRF token in Cookie.\")\n        csrf_token_body = request.POST.get(\"g_csrf_token\")\n        if not csrf_token_body:\n            raise PermissionDenied(\"No CSRF token in post body.\")\n        if csrf_token_cookie != csrf_token_body:\n            raise PermissionDenied(\"Failed to verify double submit cookie.\")\n\n\nlogin_by_token = csrf_exempt(LoginByTokenView.as_view())\n"
  },
  {
    "path": "allauth/socialaccount/providers/gumroad/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/gumroad/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.gumroad.views import GumroadOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass GumroadAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"url\")\n\n\nclass GumroadProvider(OAuth2Provider):\n    id = \"gumroad\"\n    name = \"Gumroad\"\n    account_class = GumroadAccount\n    oauth2_adapter_class = GumroadOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"edit_products\"]\n\n    def extract_uid(self, data):\n        return str(data[\"user_id\"])\n\n    def extract_common_fields(self, data):\n        try:\n            username = data[\"url\"].split(\"https://gumroad.com/\")[1]\n        except (KeyError, IndexError, AttributeError):\n            username = None\n        return dict(\n            username=username,\n            email=data.get(\"email\"),\n            name=data.get(\"name\"),\n            twitter_handle=data.get(\"twitter_handle\"),\n            url=data.get(\"url\"),\n        )\n\n\nprovider_classes = [GumroadProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/gumroad/urls.py",
    "content": "from allauth.socialaccount.providers.gumroad.provider import GumroadProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(GumroadProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/gumroad/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass GumroadOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"gumroad\"\n\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n    provider_base_url = settings.get(\"GUMROAD_URL\")\n    access_token_url = f\"{provider_base_url}/oauth/token\"\n    authorize_url = f\"{provider_base_url}/oauth/authorize\"\n    profile_url = \"https://api.gumroad.com/v2/user\"\n\n    def complete_login(self, request, app, token, response):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, params={\"access_token\": token.token})\n            resp.raise_for_status()\n            extra_data = resp.json()\n\n        return self.get_provider().sociallogin_from_response(\n            request, extra_data[\"user\"]\n        )\n\n\noauth2_login = OAuth2LoginView.adapter_view(GumroadOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(GumroadOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/hubic/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/hubic/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.hubic.views import HubicOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass HubicAccount(ProviderAccount):\n    pass\n\n\nclass HubicProvider(OAuth2Provider):\n    id = \"hubic\"\n    name = \"Hubic\"\n    account_class = HubicAccount\n    oauth2_adapter_class = HubicOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"email\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"firstname\").lower() + data.get(\"lastname\").lower(),\n            first_name=data.get(\"firstname\"),\n            last_name=data.get(\"lastname\"),\n        )\n\n\nprovider_classes = [HubicProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/hubic/urls.py",
    "content": "from allauth.socialaccount.providers.hubic.provider import HubicProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(HubicProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/hubic/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass HubicOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"hubic\"\n    access_token_url = \"https://api.hubic.com/oauth/token\"  # nosec\n    authorize_url = \"https://api.hubic.com/oauth/auth\"\n    profile_url = \"https://api.hubic.com/1.0/account\"\n    redirect_uri_protocol = \"https\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        token_type = kwargs[\"response\"][\"token_type\"]\n        headers = {\"Authorization\": f\"{token_type} {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(HubicOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(HubicOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/hubspot/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/hubspot/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.hubspot.views import HubspotOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass HubspotAccount(ProviderAccount):\n    def to_str(self):\n        return self.account.extra_data.get(\"user\") or super().to_str()\n\n\nclass HubspotProvider(OAuth2Provider):\n    id = \"hubspot\"\n    name = \"Hubspot\"\n    account_class = HubspotAccount\n    oauth2_adapter_class = HubspotOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"oauth\"]\n\n    def extract_uid(self, data):\n        return str(data[\"user_id\"])\n\n    def extract_common_fields(self, data):\n        return dict(email=data.get(\"user\"))\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"user\")\n        if email:\n            ret.append(EmailAddress(email=email, verified=True, primary=True))\n        return ret\n\n\nprovider_classes = [HubspotProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/hubspot/urls.py",
    "content": "from allauth.socialaccount.providers.hubspot.provider import HubspotProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(HubspotProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/hubspot/views.py",
    "content": "\"\"\"Views for Hubspot API.\"\"\"\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass HubspotOAuth2Adapter(OAuth2Adapter):\n    \"\"\"OAuth2Adapter for Hubspot API v3.\"\"\"\n\n    provider_id = \"hubspot\"\n\n    authorize_url = \"https://app.hubspot.com/oauth/authorize\"\n    access_token_url = \"https://api.hubapi.com/oauth/v1/token\"  # nosec\n    profile_url = \"https://api.hubapi.com/oauth/v1/access-tokens\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Content-Type\": \"application/json\"}\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(f\"{self.profile_url}/{token.token}\", headers=headers)\n            response.raise_for_status()\n            extra_data = response.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(HubspotOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(HubspotOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/instagram/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/instagram/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.instagram.views import InstagramOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass InstagramAccount(ProviderAccount):\n    PROFILE_URL = \"https://instagram.com/\"\n\n    def get_profile_url(self):\n        username = self.account.extra_data.get(\"username\")\n        return f\"{self.PROFILE_URL}{username}\"\n\n\nclass InstagramProvider(OAuth2Provider):\n    id = \"instagram\"\n    name = \"Instagram\"\n    account_class = InstagramAccount\n    oauth2_adapter_class = InstagramOAuth2Adapter\n\n    def extract_extra_data(self, data):\n        return data\n\n    def get_default_scope(self):\n        return [\"user_profile\"]\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(username=data.get(\"username\"))\n\n\nprovider_classes = [InstagramProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/instagram/urls.py",
    "content": "from allauth.socialaccount.providers.instagram.provider import InstagramProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(InstagramProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/instagram/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass InstagramOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"instagram\"\n    access_token_url = \"https://api.instagram.com/oauth/access_token\"  # nosec\n    authorize_url = \"https://api.instagram.com/oauth/authorize\"\n    profile_url = \"https://graph.instagram.com/me\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            params = {\"access_token\": token.token, \"fields\": [\"id\", \"username\"]}\n            resp = sess.get(self.profile_url, params=params)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(InstagramOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(InstagramOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/jupyterhub/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/jupyterhub/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.jupyterhub.views import JupyterHubOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass JupyterHubAccount(ProviderAccount):\n    pass\n\n\nclass JupyterHubProvider(OAuth2Provider):\n    id = \"jupyterhub\"\n    name = \"JupyterHub\"\n    account_class = JupyterHubAccount\n    oauth2_adapter_class = JupyterHubOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data.get(\"name\"))\n\n    def extract_common_fields(self, data):\n        return dict(name=data.get(\"name\", \"\"))\n\n\nprovider_classes = [JupyterHubProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/jupyterhub/urls.py",
    "content": "from allauth.socialaccount.providers.jupyterhub.provider import JupyterHubProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(JupyterHubProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/jupyterhub/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.models import SocialToken\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass JupyterHubOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"jupyterhub\"\n\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n    provider_base_url = settings.get(\"API_URL\", \"\")\n\n    access_token_url = f\"{provider_base_url}/hub/api/oauth2/token\"\n    authorize_url = f\"{provider_base_url}/hub/api/oauth2/authorize\"\n    profile_url = f\"{provider_base_url}/hub/api/user\"\n\n    def complete_login(self, request, app, token: SocialToken, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            user_profile = resp.json()\n\n        return self.get_provider().sociallogin_from_response(request, user_profile)\n\n\noauth2_login = OAuth2LoginView.adapter_view(JupyterHubOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(JupyterHubOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/kakao/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/kakao/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/kakao/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.kakao.views import KakaoOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass KakaoAccount(ProviderAccount):\n    @property\n    def properties(self):\n        return self.account.extra_data.get(\"properties\", {})\n\n    @property\n    def profile(self):\n        return self.account.extra_data.get(\"kakao_account\", {}).get(\"profile\", {})\n\n    def get_avatar_url(self):\n        return self.profile.get(\n            \"profile_image_url\", self.properties.get(\"profile_image\")\n        )\n\n    def get_user_data(self):\n        return self.account.extra_data.get(\"kakao_account\")\n\n\nclass KakaoProvider(OAuth2Provider):\n    id = \"kakao\"\n    name = \"Kakao\"\n    account_class = KakaoAccount\n    oauth2_adapter_class = KakaoOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        email = data.get(\"kakao_account\", {}).get(\"email\")\n        nickname = data.get(\"kakao_account\", {}).get(\"profile\", {}).get(\"nickname\")\n\n        return dict(email=email, username=nickname)\n\n    def extract_email_addresses(self, data):\n        ret = []\n        data = data.get(\"kakao_account\", {})\n        email = data.get(\"email\")\n\n        if email:\n            verified = data.get(\"is_email_verified\")\n            # data['is_email_verified'] imply the email address is\n            # verified\n            ret.append(EmailAddress(email=email, verified=verified, primary=True))\n        return ret\n\n\nprovider_classes = [KakaoProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/kakao/urls.py",
    "content": "from allauth.socialaccount.providers.kakao.provider import KakaoProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(KakaoProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/kakao/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass KakaoOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"kakao\"\n    access_token_url = \"https://kauth.kakao.com/oauth/token\"  # nosec\n    authorize_url = \"https://kauth.kakao.com/oauth/authorize\"\n    profile_url = \"https://kapi.kakao.com/v2/user/me\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(KakaoOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(KakaoOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/lemonldap/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/lemonldap/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.lemonldap.views import LemonLDAPOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass LemonLDAPAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"picture\")\n\n\nclass LemonLDAPProvider(OAuth2Provider):\n    id = \"lemonldap\"\n    name = \"LemonLDAP::NG\"\n    account_class = LemonLDAPAccount\n    oauth2_adapter_class = LemonLDAPOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"openid\", \"profile\", \"email\"]\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"preferred_username\"),\n            name=data.get(\"name\"),\n            picture=data.get(\"picture\"),\n        )\n\n\nprovider_classes = [LemonLDAPProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/lemonldap/urls.py",
    "content": "from allauth.socialaccount.providers.lemonldap.provider import LemonLDAPProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(LemonLDAPProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/lemonldap/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.models import SocialToken\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass LemonLDAPOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"lemonldap\"\n\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n    provider_base_url = settings.get(\"LEMONLDAP_URL\")\n\n    access_token_url = f\"{provider_base_url}/oauth2/token\"\n    authorize_url = f\"{provider_base_url}/oauth2/authorize\"\n    profile_url = f\"{provider_base_url}/oauth2/userinfo\"\n\n    def complete_login(self, request, app, token: SocialToken, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            response = sess.post(self.profile_url, headers=headers)\n            response.raise_for_status()\n            extra_data = response.json()\n        extra_data[\"id\"] = extra_data[\"sub\"]\n        del extra_data[\"sub\"]\n\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(LemonLDAPOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(LemonLDAPOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/lichess/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/lichess/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.app_settings import QUERY_EMAIL\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.lichess.views import LichessOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass LichessAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"url\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"avatar\")\n\n\nclass LichessProvider(OAuth2Provider):\n    id = \"lichess\"\n    name = \"Lichess\"\n    account_class = LichessAccount\n    oauth2_adapter_class = LichessOAuth2Adapter\n    pkce_enabled_default = True\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        first_name = data.get(\"profile\", {}).get(\"firstName\")\n        last_name = data.get(\"profile\", {}).get(\"lastName\")\n\n        return dict(\n            username=data.get(\"username\"),\n            email=data.get(\"email\"),\n            first_name=first_name,\n            last_name=last_name,\n        )\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"email\")\n\n        if email:\n            ret.append(\n                EmailAddress(\n                    email=email,\n                    primary=True,\n                )\n            )\n        return ret\n\n    def get_default_scope(self):\n        ret = []\n        if QUERY_EMAIL:\n            ret.append(\"email:read\")\n        return ret\n\n\nprovider_classes = [LichessProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/lichess/urls.py",
    "content": "from allauth.socialaccount.providers.lichess.provider import LichessProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(LichessProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/lichess/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.app_settings import QUERY_EMAIL\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass LichessOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"lichess\"\n\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n    provider_base_url = settings.get(\"API_URL\", \"https://lichess.org\")\n\n    access_token_url = f\"{provider_base_url}/api/token\"\n    authorize_url = f\"{provider_base_url}/oauth\"\n\n    profile_url = f\"{provider_base_url}/api/account\"\n    email_address_url = f\"{provider_base_url}/api/account/email\"\n\n    def complete_login(self, request, app, token, response):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            profile_res = sess.get(\n                self.profile_url,\n                params={\"access_token\": token.token},\n                headers=headers,\n            )\n            profile_res.raise_for_status()\n            extra_data = profile_res.json()\n\n            user_profile = (\n                extra_data[\"result\"] if \"result\" in extra_data else extra_data\n            )\n\n            # retrieve email address if requested\n            if QUERY_EMAIL:\n                email_resp = sess.get(self.email_address_url, headers=headers)\n\n                email_resp.raise_for_status()\n                email_data = email_resp.json()\n\n                # extract email address from response\n\n                email = email_data.get(\"email\", None)\n\n                if email:\n                    user_profile[\"email\"] = email\n\n        return self.get_provider().sociallogin_from_response(request, user_profile)\n\n\noauth2_login = OAuth2LoginView.adapter_view(LichessOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(LichessOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/line/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/line/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/line/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.line.views import LineOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass LineAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"pictureUrl\") or self.account.extra_data.get(\n            \"picture\"\n        )\n\n\nclass LineProvider(OAuth2Provider):\n    id = \"line\"\n    name = \"Line\"\n    account_class = LineAccount\n    oauth2_adapter_class = LineOAuth2Adapter\n\n    def get_default_scope(self):\n        return []\n\n    def extract_uid(self, data):\n        return str(data.get(\"userId\") or data.get(\"sub\"))\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"email\") or self.extract_uid(data),\n            first_name=data.get(\"first_name\"),\n            last_name=data.get(\"last_name\"),\n            name=data.get(\"name\"),\n        )\n\n\nprovider_classes = [LineProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/line/urls.py",
    "content": "from allauth.socialaccount.providers.line.provider import LineProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(LineProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/line/views.py",
    "content": "from datetime import timedelta\n\nfrom django.utils import timezone\n\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.models import SocialToken\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass LineOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"line\"\n    access_token_url = \"https://api.line.me/oauth2/v2.1/token\"  # nosec\n    authorize_url = \"https://access.line.me/oauth2/v2.1/authorize\"\n    profile_url = \"https://api.line.me/v2/profile\"  # https://developers.line.biz/en/reference/line-login/#get-user-profile\n    # https://developers.line.biz/en/reference/line-login/#verify-id-token\n    id_token_url = \"https://api.line.me/oauth2/v2.1/verify\"  # nosec\n\n    def parse_token(self, data):\n        \"\"\"\n        data: access_token data from line\n        \"\"\"\n        settings = app_settings.PROVIDERS.get(self.provider_id, {})\n        if \"email\" in settings.get(\"SCOPE\", \"\"):\n            token = SocialToken(token=data[\"id_token\"])\n        else:\n            token = SocialToken(token=data[\"access_token\"])\n        token.token_secret = data.get(\"refresh_token\", \"\")\n        expires_in = data.get(self.expires_in_key, None)\n        if expires_in:\n            token.expires_at = timezone.now() + timedelta(seconds=int(expires_in))\n\n        return token\n\n    def complete_login(self, request, app, token, **kwargs):\n        settings = app_settings.PROVIDERS.get(self.provider_id, {})\n        with get_adapter().get_requests_session() as sess:\n            if \"email\" in settings.get(\"SCOPE\", \"\"):\n                payload = {\"client_id\": app.client_id, \"id_token\": token.token}\n                resp = sess.post(self.id_token_url, payload)\n            else:\n                headers = {\"Authorization\": f\"Bearer {token.token}\"}\n                resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(LineOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(LineOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/linkedin_oauth2/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/linkedin_oauth2/provider.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.providers.base import ProviderAccount, ProviderException\nfrom allauth.socialaccount.providers.linkedin_oauth2.views import LinkedInOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\ndef _extract_name_field(data, field_name):\n    ret = \"\"\n    v = data.get(field_name, {})\n    if v:\n        if isinstance(v, str):\n            # Old V1 data\n            ret = v\n        else:\n            localized = v.get(\"localized\", {})\n            preferred_locale = v.get(\n                \"preferredLocale\", {\"country\": \"US\", \"language\": \"en\"}\n            )\n            locale_key = f\"{preferred_locale['language']}_{preferred_locale['country']}\"\n            if locale_key in localized:\n                ret = localized.get(locale_key)\n            elif localized:\n                ret = next(iter(localized.values()))\n    return ret\n\n\ndef _extract_email(data):\n    \"\"\"\n    {'elements': [{'handle': 'urn:li:emailAddress:319371470',\n               'handle~': {'emailAddress': 'raymond.penners@intenct.nl'}}]}\n    \"\"\"\n    ret = \"\"\n    elements = data.get(\"elements\", [])\n    if len(elements) > 0:\n        ret = elements[0].get(\"handle~\", {}).get(\"emailAddress\", \"\")\n    return ret\n\n\nclass LinkedInOAuth2Account(ProviderAccount):\n    def to_str(self):\n        ret = super().to_str()\n        if self.account.extra_data.get(\"emailAddress\"):\n            return self.account.extra_data[\"emailAddress\"]\n        first_name = _extract_name_field(self.account.extra_data, \"firstName\")\n        last_name = _extract_name_field(self.account.extra_data, \"lastName\")\n        if first_name or last_name:\n            ret = f\"{first_name} {last_name}\".strip()\n        return ret\n\n    def get_avatar_url(self):\n        \"\"\"\n        Attempts the load the avatar associated to the avatar.\n\n        Requires the `profilePicture(displayImage~:playableStreams)`\n        profile field configured in settings.py\n\n        :return:\n        \"\"\"\n        provider_configuration = self.account.get_provider().get_settings()\n        configured_profile_fields = provider_configuration.get(\"PROFILE_FIELDS\", [])\n        # Can't get the avatar when this field is not specified\n        picture_field = \"profilePicture(displayImage~:playableStreams)\"\n        if picture_field not in configured_profile_fields:\n            return super().get_avatar_url()\n        # Iterate over the fields and attempt to get it by configured size\n        profile_picture_config = provider_configuration.get(\"PROFILEPICTURE\", {})\n        req_size = profile_picture_config.get(\"display_size_w_h\", (100.0, 100.0))\n        req_auth_method = profile_picture_config.get(\"authorization_method\", \"PUBLIC\")\n        # Iterate over the data returned by the provider\n        profile_elements = (\n            self.account.extra_data.get(\"profilePicture\", {})\n            .get(\"displayImage~\", {})\n            .get(\"elements\", [])\n        )\n        for single_element in profile_elements:\n            if not req_auth_method == single_element[\"authorizationMethod\"]:\n                continue\n            # Get the dimensions from the payload\n            image_data = (\n                single_element.get(\"data\", {})\n                .get(\"com.linkedin.digitalmedia.mediaartifact.StillImage\", {})\n                .get(\"displaySize\", {})\n            )\n            if not image_data:\n                continue\n            width, height = image_data[\"width\"], image_data[\"height\"]\n            if not width or not height:\n                continue\n            if not width == req_size[0] or not height == req_size[1]:\n                continue\n            # Get the uri since actual size matches the requested size.\n            to_return = single_element.get(\n                \"identifiers\",\n                [\n                    {},\n                ],\n            )[\n                0\n            ].get(\"identifier\")\n            if to_return:\n                return to_return\n        return super().get_avatar_url()\n\n\nclass LinkedInOAuth2Provider(OAuth2Provider):\n    id = \"linkedin_oauth2\"\n    # Name is displayed to ordinary users -- don't include protocol\n    name = \"LinkedIn\"\n    account_class = LinkedInOAuth2Account\n    oauth2_adapter_class = LinkedInOAuth2Adapter\n\n    def extract_uid(self, data):\n        if \"id\" not in data:\n            raise ProviderException(\n                \"LinkedIn encountered an internal error while logging in. \\\n                Please try again.\"\n            )\n        return str(data[\"id\"])\n\n    def get_profile_fields(self):\n        default_fields = [\n            \"id\",\n            \"firstName\",\n            \"lastName\",\n            # This would be needed to in case you need access to the image\n            # URL. Not enabling this by default due to the amount of data\n            # returned.\n            #\n            # 'profilePicture(displayImage~:playableStreams)'\n        ]\n        fields = self.get_settings().get(\"PROFILE_FIELDS\", default_fields)\n        return fields\n\n    def get_default_scope(self):\n        scope = [\"r_liteprofile\"]\n        if app_settings.QUERY_EMAIL:\n            scope.append(\"r_emailaddress\")\n        return scope\n\n    def extract_common_fields(self, data):\n        return dict(\n            first_name=_extract_name_field(data, \"firstName\"),\n            last_name=_extract_name_field(data, \"lastName\"),\n            email=_extract_email(data),\n        )\n\n\nprovider_classes = [LinkedInOAuth2Provider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/linkedin_oauth2/urls.py",
    "content": "from allauth.socialaccount.providers.linkedin_oauth2.provider import (\n    LinkedInOAuth2Provider,\n)\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(LinkedInOAuth2Provider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/linkedin_oauth2/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass LinkedInOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"linkedin_oauth2\"\n    access_token_url = \"https://www.linkedin.com/oauth/v2/accessToken\"  # nosec\n    authorize_url = \"https://www.linkedin.com/oauth/v2/authorization\"\n    profile_url = \"https://api.linkedin.com/v2/me\"\n    email_url = \"https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))\"  # noqa\n    access_token_method = \"GET\"  # nosec\n\n    def complete_login(self, request, app, token, **kwargs):\n        extra_data = self.get_user_info(token)\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n    def get_user_info(self, token):\n        fields = self.get_provider().get_profile_fields()\n\n        headers = {\n            **self.get_provider().get_settings().get(\"HEADERS\", {}),\n            \"Authorization\": f\"Bearer {token.token}\",\n        }\n\n        info = {}\n        with get_adapter().get_requests_session() as sess:\n            if app_settings.QUERY_EMAIL:\n                sess = get_adapter().get_requests_session()\n                resp = sess.get(self.email_url, headers=headers)\n                # If this response goes wrong, that is not a blocker in order to\n                # continue.\n                if resp.ok:\n                    info = resp.json()\n\n            url = f\"{self.profile_url}?projection=({','.join(fields)})\"\n            resp = sess.get(url, headers=headers)\n            resp.raise_for_status()\n            info.update(resp.json())\n        return info\n\n\noauth2_login = OAuth2LoginView.adapter_view(LinkedInOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(LinkedInOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/mailchimp/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/mailchimp/provider.py",
    "content": "\"\"\"Customise Provider classes for MailChimp API v3.\"\"\"\n\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.mailchimp.views import MailChimpOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass MailChimpAccount(ProviderAccount):\n    \"\"\"ProviderAccount subclass for MailChimp.\"\"\"\n\n    def get_profile_url(self):\n        \"\"\"Return base profile url.\"\"\"\n        return self.account.extra_data[\"api_endpoint\"]\n\n    def get_avatar_url(self):\n        \"\"\"Return avatar url.\"\"\"\n        return self.account.extra_data[\"login\"][\"avatar\"]\n\n    def to_str(self):\n        dflt = super().to_str()\n        login_data = self.account.extra_data.get(\"login\", {})\n        return login_data.get(\"login_email\") or login_data.get(\"email\") or dflt\n\n\nclass MailChimpProvider(OAuth2Provider):\n    \"\"\"OAuth2Provider subclass for MailChimp v3.\"\"\"\n\n    id = \"mailchimp\"\n    name = \"MailChimp\"\n    account_class = MailChimpAccount\n    oauth2_adapter_class = MailChimpOAuth2Adapter\n\n    def extract_uid(self, data):\n        \"\"\"Extract uid ('user_id') and ensure it's a str.\"\"\"\n        return str(data[\"user_id\"])\n\n    def get_default_scope(self):\n        \"\"\"Ensure scope is null to fit their API.\"\"\"\n        return [\"\"]\n\n    def extract_common_fields(self, data):\n        \"\"\"Extract fields from a metadata query.\"\"\"\n        return dict(\n            dc=data.get(\"dc\"),\n            role=data.get(\"role\"),\n            account_name=data.get(\"accountname\"),\n            user_id=data.get(\"user_id\"),\n            login=data.get(\"login\"),\n            login_url=data.get(\"login_url\"),\n            api_endpoint=data.get(\"api_endpoint\"),\n        )\n\n\nprovider_classes = [MailChimpProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/mailchimp/urls.py",
    "content": "\"\"\"Register urls for MailChimpProvider\"\"\"\n\nfrom allauth.socialaccount.providers.mailchimp.provider import MailChimpProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(MailChimpProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/mailchimp/views.py",
    "content": "\"\"\"Views for MailChimp API v3.\"\"\"\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass MailChimpOAuth2Adapter(OAuth2Adapter):\n    \"\"\"OAuth2Adapter for MailChimp API v3.\"\"\"\n\n    provider_id = \"mailchimp\"\n    authorize_url = \"https://login.mailchimp.com/oauth2/authorize\"\n    access_token_url = \"https://login.mailchimp.com/oauth2/token\"  # nosec\n    profile_url = \"https://login.mailchimp.com/oauth2/metadata\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        \"\"\"Complete login, ensuring correct OAuth header.\"\"\"\n        headers = {\"Authorization\": f\"OAuth {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(MailChimpOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(MailChimpOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/mailcow/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/mailcow/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.mailcow.views import MailcowAdapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass MailcowAccount(ProviderAccount):\n    pass\n\n\nclass MailcowProvider(OAuth2Provider):\n    id = \"mailcow\"\n    name = \"Mailcow\"\n    account_class = MailcowAccount\n    oauth2_adapter_class = MailcowAdapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            username=data[\"username\"],\n            name=data[\"displayName\"],\n            full_name=data.get(\"full_name\"),\n            email=data[\"email\"],\n        )\n\n    def get_default_scope(self):\n        scope = [\"profile\"]\n        return scope\n\n\nprovider_classes = [MailcowProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/mailcow/urls.py",
    "content": "from allauth.socialaccount.providers.mailcow.provider import MailcowProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(MailcowProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/mailcow/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\nfrom allauth.utils import get_request_param\n\n\nclass MailcowAdapter(OAuth2Adapter):\n    provider_id = \"mailcow\"\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n    server = settings.get(\"SERVER\", \"https://hosted.mailcow.de\")\n    access_token_url = f\"{server}/oauth/token\"\n    authorize_url = f\"{server}/oauth/authorize\"\n    profile_url = f\"{server}/oauth/profile\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        code = get_request_param(request, \"code\")\n        extra_data = self.get_user_info(token.token, code)\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n    def get_user_info(self, access_token, code):\n        with get_adapter().get_requests_session() as sess:\n            params = {\"access_token\": access_token, \"code\": code}\n            resp = sess.get(self.profile_url, params=params)\n            resp.raise_for_status()\n        return resp.json()\n\n\noauth2_login = OAuth2LoginView.adapter_view(MailcowAdapter)\noauth2_callback = OAuth2CallbackView.adapter_view(MailcowAdapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/mailru/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/mailru/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.mailru.views import MailRuOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass MailRuAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"link\")\n\n    def get_avatar_url(self):\n        ret = None\n        if self.account.extra_data.get(\"has_pic\"):\n            pic_big_url = self.account.extra_data.get(\"pic_big\")\n            pic_small_url = self.account.extra_data.get(\"pic_small\")\n            if pic_big_url:\n                return pic_big_url\n            elif pic_small_url:\n                return pic_small_url\n        else:\n            return ret\n\n\nclass MailRuProvider(OAuth2Provider):\n    id = \"mailru\"\n    name = \"Mail.RU\"\n    account_class = MailRuAccount\n    oauth2_adapter_class = MailRuOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"uid\"]\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            last_name=data.get(\"last_name\"),\n            username=data.get(\"nick\"),\n            first_name=data.get(\"first_name\"),\n        )\n\n\nprovider_classes = [MailRuProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/mailru/urls.py",
    "content": "from allauth.socialaccount.providers.mailru.provider import MailRuProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(MailRuProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/mailru/views.py",
    "content": "from hashlib import md5\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass MailRuOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"mailru\"\n    access_token_url = \"https://connect.mail.ru/oauth/token\"  # nosec\n    authorize_url = \"https://connect.mail.ru/oauth/authorize\"\n    profile_url = \"https://www.appsmail.ru/platform/api\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        uid = kwargs[\"response\"][\"x_mailru_vid\"]\n        data = {\n            \"method\": \"users.getInfo\",\n            \"app_id\": app.client_id,\n            \"secure\": \"1\",\n            \"uids\": uid,\n        }\n        param_list = sorted([f\"{item}={data[item]}\" for item in data])\n        # See: https://api.mail.ru/docs/guides/restapi/\n        data[\"sig\"] = md5(\n            (\"\".join(param_list) + app.secret).encode(\"utf-8\")\n        ).hexdigest()  # nosec\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, params=data)\n            extra_data = response.json()[0]\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(MailRuOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(MailRuOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/mediawiki/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/mediawiki/provider.py",
    "content": "from collections.abc import Mapping\nfrom typing import Any\n\nfrom django.conf import settings\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.mediawiki.views import MediaWikiOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nsettings = getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {}).get(\"mediawiki\", {})\n\n\nclass MediaWikiAccount(ProviderAccount):\n    def get_profile_url(self):\n        userpage = settings.get(\n            \"USERPAGE_TEMPLATE\", \"https://meta.wikimedia.org/wiki/User:{username}\"\n        )\n        username = self.account.extra_data.get(\"username\")\n        if not username:\n            return None\n        return userpage.format(username=username.replace(\" \", \"_\"))\n\n\nclass MediaWikiProvider(OAuth2Provider):\n    id = \"mediawiki\"\n    name = \"MediaWiki\"\n    account_class = MediaWikiAccount\n    oauth2_adapter_class = MediaWikiOAuth2Adapter\n\n    @staticmethod\n    def _get_email(data: Mapping[str, Any]) -> str | None:\n        if data.get(\"confirmed_email\"):\n            return data.get(\"email\")\n        return None\n\n    def extract_uid(self, data):\n        return str(data[\"sub\"])\n\n    def extract_extra_data(self, data: Mapping[str, Any]) -> dict[str, Any]:\n        return dict(\n            email=self._get_email(data),\n            realname=data.get(\"realname\"),\n            username=data.get(\"username\"),\n        )\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=self._get_email(data),\n            username=data.get(\"username\"),\n            name=data.get(\"realname\"),\n        )\n\n    def extract_email_addresses(self, data: Mapping[str, Any]) -> list[EmailAddress]:\n        # A MediaWiki account may not have email address.\n        if addr := self._get_email(data):\n            return [EmailAddress(email=addr, verified=True, primary=True)]\n        return []\n\n\nprovider_classes = [MediaWikiProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/mediawiki/urls.py",
    "content": "from allauth.socialaccount.providers.mediawiki.provider import MediaWikiProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(MediaWikiProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/mediawiki/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass MediaWikiOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"mediawiki\"\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n    REST_API = settings.get(\"REST_API\", \"https://meta.wikimedia.org/w/rest.php\")\n    access_token_url = f\"{REST_API}/oauth2/access_token\"\n    authorize_url = f\"{REST_API}/oauth2/authorize\"\n    profile_url = f\"{REST_API}/oauth2/resource/profile\"\n    # Allow custom User-Agent per Wikimedia policy.\n    headers = {\"User-Agent\": settings.get(\"USER_AGENT\", \"django-allauth\")}\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\", **self.headers}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(MediaWikiOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(MediaWikiOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/meetup/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/meetup/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/meetup/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.meetup.views import MeetupOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass MeetupAccount(ProviderAccount):\n    pass\n\n\nclass MeetupProvider(OAuth2Provider):\n    id = \"meetup\"\n    name = \"Meetup\"\n    account_class = MeetupAccount\n    oauth2_adapter_class = MeetupOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(email=data.get(\"email\"), name=data.get(\"name\"))\n\n\nprovider_classes = [MeetupProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/meetup/urls.py",
    "content": "from allauth.socialaccount.providers.meetup.provider import MeetupProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(MeetupProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/meetup/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass MeetupOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"meetup\"\n    access_token_url = \"https://secure.meetup.com/oauth2/access\"  # nosec\n    authorize_url = \"https://secure.meetup.com/oauth2/authorize\"\n    profile_url = \"https://api.meetup.com/2/member/self\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, params={\"access_token\": token.token})\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(MeetupOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(MeetupOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/microsoft/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/microsoft/provider.py",
    "content": "from allauth.socialaccount.providers.base import AuthAction, ProviderAccount\nfrom allauth.socialaccount.providers.microsoft.views import MicrosoftGraphOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass MicrosoftGraphAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"photo\")\n\n\nclass MicrosoftGraphProvider(OAuth2Provider):\n    id = \"microsoft\"\n    name = \"Microsoft\"\n    account_class = MicrosoftGraphAccount\n    oauth2_adapter_class = MicrosoftGraphOAuth2Adapter\n\n    def get_default_scope(self):\n        \"\"\"\n        Docs on Scopes and Permissions:\n        https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-permissions-and-consent#scopes-and-permissions\n        \"\"\"\n        return [\"User.Read\"]\n\n    def get_auth_params_from_request(self, request, action):\n        ret = super().get_auth_params_from_request(request, action)\n        if action == AuthAction.REAUTHENTICATE:\n            ret[\"prompt\"] = \"select_account\"\n        return ret\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"mail\") or data.get(\"userPrincipalName\"),\n            username=data.get(\"mailNickname\"),\n            last_name=data.get(\"surname\"),\n            first_name=data.get(\"givenName\"),\n        )\n\n\nprovider_classes = [MicrosoftGraphProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/microsoft/urls.py",
    "content": "from allauth.socialaccount.providers.microsoft.provider import MicrosoftGraphProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(MicrosoftGraphProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/microsoft/views.py",
    "content": "import json\n\nfrom allauth.core import context\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\ndef _check_errors(response):\n    try:\n        data = response.json()\n    except json.decoder.JSONDecodeError:\n        raise OAuth2Error(f\"Invalid JSON from Microsoft Graph API: {response.text}\")\n\n    if \"id\" not in data:\n        error_message = \"Error retrieving Microsoft profile\"\n        microsoft_error_message = data.get(\"error\", {}).get(\"message\")\n        if microsoft_error_message:\n            error_message = f\"{error_message}: {microsoft_error_message}\"\n        raise OAuth2Error(error_message)\n\n    return data\n\n\nclass MicrosoftGraphOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"microsoft\"\n\n    def _build_tenant_url(self, path):\n        settings = app_settings.PROVIDERS.get(self.provider_id, {})\n        # Lower case \"tenant\" for backwards compatibility\n        tenant = settings.get(\"TENANT\", settings.get(\"tenant\", \"common\"))\n        # Prefer app based tenant setting.\n        app = get_adapter().get_app(context.request, provider=self.provider_id)\n        tenant = app.settings.get(\"tenant\", tenant)\n        login_url = app.settings.get(\"login_url\", \"https://login.microsoftonline.com\")\n        return f\"{login_url}/{tenant}{path}\"\n\n    @property\n    def access_token_url(self):\n        return self._build_tenant_url(\"/oauth2/v2.0/token\")\n\n    @property\n    def authorize_url(self):\n        return self._build_tenant_url(\"/oauth2/v2.0/authorize\")\n\n    @property\n    def profile_url(self):\n        app = get_adapter().get_app(context.request, provider=self.provider_id)\n        graph_url = app.settings.get(\"graph_url\", \"https://graph.microsoft.com\")\n        return f\"{graph_url}/v1.0/me\"\n\n    user_properties = (\n        \"businessPhones\",\n        \"displayName\",\n        \"givenName\",\n        \"id\",\n        \"jobTitle\",\n        \"mail\",\n        \"mobilePhone\",\n        \"officeLocation\",\n        \"preferredLanguage\",\n        \"surname\",\n        \"userPrincipalName\",\n        \"mailNickname\",\n        \"companyName\",\n    )\n    profile_url_params = {\"$select\": \",\".join(user_properties)}\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(\n                self.profile_url, params=self.profile_url_params, headers=headers\n            )\n            extra_data = _check_errors(response)\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(MicrosoftGraphOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(MicrosoftGraphOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/miro/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/miro/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.miro.views import MiroOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass MiroAccount(ProviderAccount):\n    pass\n\n\nclass MiroProvider(OAuth2Provider):\n    id = \"miro\"\n    name = \"Miro\"\n    account_class = MiroAccount\n    oauth2_adapter_class = MiroOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(email=data.get(\"email\"), name=data.get(\"name\"))\n\n    def get_default_scope(self):\n        return [\"identity:read\"]\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"email\")\n        if email and data.get(\"state\") == \"registered\":\n            ret.append(EmailAddress(email=email, verified=True, primary=True))\n        return ret\n\n\nprovider_classes = [MiroProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/miro/urls.py",
    "content": "from allauth.socialaccount.providers.miro.provider import MiroProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(MiroProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/miro/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass MiroOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"miro\"\n    access_token_url = \"https://api.miro.com/v1/oauth/token\"  # nosec\n    authorize_url = \"https://miro.com/oauth/authorize\"\n    profile_url = \"https://api.miro.com/v1/users/me\"\n\n    def complete_login(self, request, app, token, response):\n        headers = {\n            \"Authorization\": f\"Bearer {token.token}\",\n            \"Content-Type\": \"application/json\",\n        }\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(MiroOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(MiroOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/naver/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/naver/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/naver/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.naver.views import NaverOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass NaverAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"profile_image\")\n\n\nclass NaverProvider(OAuth2Provider):\n    id = \"naver\"\n    name = \"Naver\"\n    account_class = NaverAccount\n    oauth2_adapter_class = NaverOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        email = data.get(\"email\")\n        return dict(email=email)\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"email\")\n        if email:\n            ret.append(EmailAddress(email=email, verified=True, primary=True))\n        return ret\n\n\nprovider_classes = [NaverProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/naver/urls.py",
    "content": "from allauth.socialaccount.providers.naver.provider import NaverProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(NaverProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/naver/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass NaverOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"naver\"\n    access_token_url = \"https://nid.naver.com/oauth2.0/token\"  # nosec\n    authorize_url = \"https://nid.naver.com/oauth2.0/authorize\"\n    profile_url = \"https://openapi.naver.com/v1/nid/me\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json().get(\"response\")\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(NaverOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(NaverOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/netiq/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/netiq/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.netiq.views import NetIQOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass NetIQAccount(ProviderAccount):\n    pass\n\n\nclass NetIQProvider(OAuth2Provider):\n    id = \"netiq\"\n    name = \"NetIQ\"\n    account_class = NetIQAccount\n    oauth2_adapter_class = NetIQOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"openid\", \"profile\", \"email\"]\n\n    def extract_uid(self, data):\n        uid_field = self.app.settings.get(\"uid_field\", \"sub\")\n        return str(data[uid_field])\n\n    def extract_extra_data(self, data):\n        return data\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data[\"email\"],\n            last_name=data[\"family_name\"],\n            first_name=data[\"given_name\"],\n        )\n\n\nprovider_classes = [NetIQProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/netiq/urls.py",
    "content": "from allauth.socialaccount.providers.netiq.provider import NetIQProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(NetIQProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/netiq/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass NetIQOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"netiq\"\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n    provider_base_url = settings.get(\"NETIQ_URL\")\n\n    @property\n    def access_token_url(self):\n        return f\"{self.provider_base_url}/nidp/oauth/nam/token\"\n\n    @property\n    def authorize_url(self):\n        return f\"{self.provider_base_url}/nidp/oauth/nam/authz\"\n\n    @property\n    def userinfo_url(self):\n        return f\"{self.provider_base_url}/nidp/oauth/nam/userinfo\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        \"\"\"\n        Get the user info from userinfo endpoint and return a\n        A populated instance of the `SocialLogin` model (unsaved)\n        :param request:\n        :param app:\n        :param token:\n        :param kwargs:\n        :return:\n        \"\"\"\n\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.userinfo_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(NetIQOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(NetIQOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/nextcloud/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/nextcloud/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.nextcloud.views import NextCloudOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass NextCloudAccount(ProviderAccount):\n    pass\n\n\nclass NextCloudProvider(OAuth2Provider):\n    id = \"nextcloud\"\n    name = \"NextCloud\"\n    account_class = NextCloudAccount\n    oauth2_adapter_class = NextCloudOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            username=data[\"displayname\"],\n            email=data.get(\"email\"),\n        )\n\n    def get_default_scope(self):\n        scope = [\"read\"]\n        return scope\n\n\nprovider_classes = [NextCloudProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/nextcloud/urls.py",
    "content": "from allauth.socialaccount.providers.nextcloud.provider import NextCloudProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(NextCloudProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/nextcloud/views.py",
    "content": "from allauth.core import context\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.models import SocialToken\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass NextCloudOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"nextcloud\"\n\n    def _build_server_url(self, path):\n        settings = app_settings.PROVIDERS.get(self.provider_id, {})\n        server = settings.get(\"SERVER\", \"https://nextcloud.example.org\")\n        # Prefer app based setting.\n        app = get_adapter().get_app(context.request, provider=self.provider_id)\n        server = app.settings.get(\"server\", server)\n        ret = f\"{server}{path}\"\n        return ret\n\n    @property\n    def access_token_url(self):\n        return self._build_server_url(\"/apps/oauth2/api/v1/token\")\n\n    @property\n    def authorize_url(self):\n        return self._build_server_url(\"/apps/oauth2/authorize\")\n\n    @property\n    def profile_url(self):\n        return self._build_server_url(\"/ocs/v1.php/cloud/users/\")\n\n    def complete_login(self, request, app, token: SocialToken, **kwargs):\n        extra_data = self.get_user_info(token, kwargs[\"response\"][\"user_id\"])\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n    def get_user_info(self, token: SocialToken, user_id):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(\n                f\"{self.profile_url}{user_id}\",\n                params={\"format\": \"json\"},\n                headers=headers,\n            )\n            resp.raise_for_status()\n            data = resp.json()[\"ocs\"][\"data\"]\n        return data\n\n\noauth2_login = OAuth2LoginView.adapter_view(NextCloudOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(NextCloudOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/notion/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/notion/client.py",
    "content": "from http import HTTPStatus\nfrom requests.auth import HTTPBasicAuth\nfrom urllib.parse import parse_qsl\n\nfrom django.utils.http import urlencode\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Client, OAuth2Error\n\n\nclass NotionOAuth2Client(OAuth2Client):\n    def get_redirect_url(self, authorization_url, scope, extra_params) -> str:\n        scope = self.scope_delimiter.join(set(scope))\n        params = {\n            \"client_id\": self.consumer_key,\n            \"scope\": scope,\n            \"response_type\": \"code\",\n            \"owner\": \"user\",\n        }\n        if self.state:\n            params[\"state\"] = self.state\n        return f\"{authorization_url}?{urlencode(params)}\"\n\n    def get_access_token(self, code, pkce_code_verifier=None):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.request(\n                self.access_token_method,\n                self.access_token_url,\n                auth=HTTPBasicAuth(self.consumer_key, self.consumer_secret),\n                json={\"code\": code, \"grant_type\": \"authorization_code\"},\n                headers=self.headers,\n            )\n            access_token = None\n            if resp.status_code in [HTTPStatus.OK, HTTPStatus.CREATED]:\n                try:\n                    access_token = resp.json()\n                except ValueError:\n                    access_token = dict(parse_qsl(resp.text))\n            if not access_token or \"access_token\" not in access_token:\n                raise OAuth2Error(f\"Error retrieving access token: {resp.content}\")\n            return access_token\n"
  },
  {
    "path": "allauth/socialaccount/providers/notion/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.notion.views import NotionOAuth2Adapter\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\n\n\nclass NotionAccount(ProviderAccount):\n    def get_user(self):\n        return self.account.extra_data[\"owner\"][\"user\"]\n\n    def get_name(self):\n        return self.get_user()[\"name\"]\n\n    def get_avatar_url(self):\n        return self.get_user()[\"avatar_url\"]\n\n    def get_workspace_name(self):\n        return self.account.extra_data[\"workspace_name\"]\n\n    def get_workspace_icon(self):\n        return self.account.extra_data[\"workspace_icon\"]\n\n    def to_str(self):\n        name = self.get_name()\n        workspace = self.get_workspace_name()\n        return f\"{name} ({workspace})\"\n\n\nclass NotionProvider(OAuth2Provider):\n    id = \"notion\"\n    name = \"Notion\"\n    account_class = NotionAccount\n    oauth2_adapter_class = NotionOAuth2Adapter\n\n    def extract_uid(self, data):\n        \"\"\"\n        The unique identifier for Notion is a combination of the User ID\n        and the Workspace ID they have authorized the application with.\n        \"\"\"\n        user_id = data[\"owner\"][\"user\"][\"id\"]\n        workspace_id = data[\"workspace_id\"]\n        return f\"user-{user_id}_workspace-{workspace_id}\"\n\n    def extract_common_fields(self, data):\n        user = data[\"owner\"][\"user\"]\n        user[\"email\"] = user[\"person\"][\"email\"]\n        return user\n\n    def extract_email_addresses(self, data):\n        user = data[\"owner\"][\"user\"]\n        email = user[\"person\"][\"email\"]\n        return [EmailAddress(email=email, verified=False, primary=True)]\n\n\nprovider_classes = [NotionProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/notion/urls.py",
    "content": "from allauth.socialaccount.providers.notion.provider import NotionProvider\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\n\n\nurlpatterns = default_urlpatterns(NotionProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/notion/views.py",
    "content": "from allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\nfrom .client import NotionOAuth2Client\n\n\nclass NotionOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"notion\"\n    basic_auth = True\n    client_class = NotionOAuth2Client\n\n    authorize_url = \"https://api.notion.com/v1/oauth/authorize\"\n    access_token_url = \"https://api.notion.com/v1/oauth/token\"  # nosec\n\n    def complete_login(self, request, app, token, **kwargs):\n        return self.get_provider().sociallogin_from_response(\n            request, kwargs[\"response\"]\n        )\n\n\noauth2_login = OAuth2LoginView.adapter_view(NotionOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(NotionOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/oauth/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/oauth/client.py",
    "content": "\"\"\"\nParts derived from socialregistration and authorized by: alen, pinda\nInspired by:\n    https://github.com/leah/python-oauth/blob/master/oauth/example/client.py\n    https://github.com/facebook/tornado/blob/master/tornado/auth.py\n\"\"\"\n\nfrom http import HTTPStatus\nfrom urllib.parse import parse_qsl, urlparse\n\nfrom django.http import HttpResponseRedirect\nfrom django.utils.http import urlencode\nfrom django.utils.translation import gettext as _\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth.oauth1_auth import OAuth1\nfrom allauth.utils import build_absolute_uri, get_request_param\n\n\ndef get_token_prefix(url) -> str:\n    \"\"\"\n    Returns a prefix for the token to store in the session so we can hold\n    more than one single oauth provider's access key in the session.\n\n    Example:\n\n        The request token url ``https://x.com/oauth/request_token``\n        returns ``x.com``\n\n    \"\"\"\n    return urlparse(url).netloc\n\n\nclass OAuthError(Exception):\n    pass\n\n\nclass OAuthClient:\n    def __init__(\n        self,\n        request,\n        consumer_key,\n        consumer_secret,\n        request_token_url,\n        access_token_url,\n        callback_url,\n        parameters=None,\n        provider=None,\n    ):\n        self.request = request\n\n        self.request_token_url = request_token_url\n        self.access_token_url = access_token_url\n\n        self.consumer_key = consumer_key\n        self.consumer_secret = consumer_secret\n\n        self.parameters = parameters\n\n        self.callback_url = callback_url\n        self.provider = provider\n\n        self.errors = []\n        self.request_token = None\n        self.access_token = None\n\n    def _get_request_token(self):\n        \"\"\"\n        Obtain a temporary request token to authorize an access token and to\n        sign the request to obtain the access token\n        \"\"\"\n        if self.request_token is None:\n            get_params = {}\n            if self.parameters:\n                get_params.update(self.parameters)\n            get_params[\"oauth_callback\"] = build_absolute_uri(\n                self.request, self.callback_url\n            )\n            rt_url = f\"{self.request_token_url}?{urlencode(get_params)}\"\n            oauth = OAuth1(self.consumer_key, client_secret=self.consumer_secret)\n            with get_adapter().get_requests_session() as sess:\n                response = sess.post(url=rt_url, auth=oauth)\n                if response.status_code not in [HTTPStatus.OK, HTTPStatus.CREATED]:\n                    raise OAuthError(\n                        _(\n                            \"Invalid response while obtaining request token\"\n                            ' from \"%s\". Response was: %s.'\n                        )\n                        % (get_token_prefix(self.request_token_url), response.text)\n                    )\n                self.request_token = dict(parse_qsl(response.text))\n            self.request.session[\n                f\"oauth_{get_token_prefix(self.request_token_url)}_request_token\"\n            ] = self.request_token\n        return self.request_token\n\n    def get_access_token(self):\n        \"\"\"\n        Obtain the access token to access private resources at the API\n        endpoint.\n        \"\"\"\n        if self.access_token is None:\n            request_token = self._get_rt_from_session()\n            oauth = OAuth1(\n                self.consumer_key,\n                client_secret=self.consumer_secret,\n                resource_owner_key=request_token[\"oauth_token\"],\n                resource_owner_secret=request_token[\"oauth_token_secret\"],\n            )\n            at_url = self.access_token_url\n            # Passing along oauth_verifier is required according to:\n            # https://groups.google.com/group/twitter-development-talk/browse_frm/thread/472500cfe9e7cdb9#\n            # Though, the custom oauth_callback seems to work without it?\n            oauth_verifier = get_request_param(self.request, \"oauth_verifier\")\n            if oauth_verifier:\n                at_url = f\"{at_url}?{urlencode({'oauth_verifier': oauth_verifier})}\"\n            with get_adapter().get_requests_session() as sess:\n                response = sess.post(url=at_url, auth=oauth)\n                if response.status_code not in [HTTPStatus.OK, HTTPStatus.CREATED]:\n                    raise OAuthError(\n                        _('Invalid response while obtaining access token from \"%s\".')\n                        % get_token_prefix(self.request_token_url)\n                    )\n                self.access_token = dict(parse_qsl(response.text))\n\n            self.request.session[\n                f\"oauth_{get_token_prefix(self.request_token_url)}_access_token\"\n            ] = self.access_token\n        return self.access_token\n\n    def _get_rt_from_session(self):\n        \"\"\"\n        Returns the request token cached in the session by\n        ``_get_request_token``\n        \"\"\"\n        try:\n            return self.request.session[\n                f\"oauth_{get_token_prefix(self.request_token_url)}_request_token\"\n            ]\n        except KeyError:\n            raise OAuthError(\n                _('No request token saved for \"%s\".')\n                % get_token_prefix(self.request_token_url)\n            )\n\n    def is_valid(self) -> bool:\n        try:\n            self._get_rt_from_session()\n            self.get_access_token()\n        except OAuthError as e:\n            self.errors.append(e.args[0])\n            return False\n        return True\n\n    def get_redirect(self, authorization_url, extra_params):\n        \"\"\"\n        Returns a ``HttpResponseRedirect`` object to redirect the user\n        to the URL the OAuth provider handles authorization.\n        \"\"\"\n        request_token = self._get_request_token()\n        params = {\n            \"oauth_token\": request_token[\"oauth_token\"],\n            \"oauth_callback\": self.request.build_absolute_uri(self.callback_url),\n        }\n        params.update(extra_params)\n        url = f\"{authorization_url}?{urlencode(params)}\"\n        return HttpResponseRedirect(url)\n\n\nclass OAuth:\n    \"\"\"\n    Base class to perform oauth signed requests from access keys saved\n    in a user's session. See the ``OAuthTwitter`` class below for an\n    example.\n    \"\"\"\n\n    def __init__(self, request, consumer_key, secret_key, request_token_url):\n        self.request = request\n        self.consumer_key = consumer_key\n        self.secret_key = secret_key\n        self.request_token_url = request_token_url\n\n    def _get_at_from_session(self):\n        \"\"\"\n        Get the saved access token for private resources from the session.\n        \"\"\"\n        try:\n            return self.request.session[\n                f\"oauth_{get_token_prefix(self.request_token_url)}_access_token\"\n            ]\n        except KeyError:\n            raise OAuthError(\n                _('No access token saved for \"%s\".')\n                % get_token_prefix(self.request_token_url)\n            )\n\n    def query(self, url, method=\"GET\", params=None, headers=None):\n        \"\"\"\n        Request a API endpoint at ``url`` with ``params`` being either the\n        POST or GET data.\n        \"\"\"\n        access_token = self._get_at_from_session()\n        oauth = OAuth1(\n            self.consumer_key,\n            client_secret=self.secret_key,\n            resource_owner_key=access_token[\"oauth_token\"],\n            resource_owner_secret=access_token[\"oauth_token_secret\"],\n        )\n        with get_adapter().get_requests_session() as sess:\n            response = sess.request(\n                url, method=method.lower(), auth=oauth, headers=headers, params=params\n            )\n            if response.status_code != HTTPStatus.OK:\n                raise OAuthError(\n                    _('No access to private resources at \"%s\".')\n                    % get_token_prefix(self.request_token_url)\n                )\n\n        return response\n"
  },
  {
    "path": "allauth/socialaccount/providers/oauth/oauth1_auth.py",
    "content": "# This file is from the requests-oauthlib library,\n# https://github.com/requests/requests-oauthlib/blob/416d7382a193d180aac3a2fb7da6f621401ac960/requests_oauthlib/oauth1_auth.py\n#\n# The requests-oauthlib library is licensed under the ISC License:\n#\n# ISC License\n#\n# Copyright (c) 2014 Kenneth Reitz.\n#\n# Permission to use, copy, modify, and/or distribute this software for any\n# purpose with or without fee is hereby granted, provided that the above\n# copyright notice and this permission notice appear in all copies.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\nimport logging\nfrom requests.auth import AuthBase\nfrom requests.utils import to_native_string\n\nfrom oauthlib.common import extract_params\nfrom oauthlib.oauth1 import (\n    SIGNATURE_HMAC,\n    SIGNATURE_TYPE_AUTH_HEADER,\n    SIGNATURE_TYPE_BODY,\n    Client,\n)\n\n\nCONTENT_TYPE_FORM_URLENCODED = \"application/x-www-form-urlencoded\"\nCONTENT_TYPE_MULTI_PART = \"multipart/form-data\"\n\n\nlog = logging.getLogger(__name__)\n\n\n# OBS!: Correct signing of requests are conditional on invoking OAuth1\n# as the last step of preparing a request, or at least having the\n# content-type set properly.\nclass OAuth1(AuthBase):\n    \"\"\"Signs the request using OAuth 1 (RFC5849)\"\"\"\n\n    client_class = Client\n\n    def __init__(\n        self,\n        client_key,\n        client_secret=None,\n        resource_owner_key=None,\n        resource_owner_secret=None,\n        callback_uri=None,\n        signature_method=SIGNATURE_HMAC,\n        signature_type=SIGNATURE_TYPE_AUTH_HEADER,\n        rsa_key=None,\n        verifier=None,\n        decoding=\"utf-8\",\n        client_class=None,\n        force_include_body=False,\n        **kwargs,\n    ):\n\n        try:\n            signature_type = signature_type.upper()\n        except AttributeError:\n            pass\n\n        client_class = client_class or self.client_class\n\n        self.force_include_body = force_include_body\n\n        self.client = client_class(\n            client_key,\n            client_secret,\n            resource_owner_key,\n            resource_owner_secret,\n            callback_uri,\n            signature_method,\n            signature_type,\n            rsa_key,\n            verifier,\n            decoding=decoding,\n            **kwargs,\n        )\n\n    def __call__(self, r):\n        \"\"\"Add OAuth parameters to the request.\n\n        Parameters may be included from the body if the content-type is\n        urlencoded, if no content type is set a guess is made.\n        \"\"\"\n        # Overwriting url is safe here as request will not modify it past\n        # this point.\n        log.debug(\"Signing request %s using client %s\", r, self.client)\n\n        content_type = r.headers.get(\"Content-Type\", \"\")\n        if (\n            not content_type\n            and extract_params(r.body)\n            or self.client.signature_type == SIGNATURE_TYPE_BODY\n        ):\n            content_type = CONTENT_TYPE_FORM_URLENCODED\n        if not isinstance(content_type, str):\n            content_type = content_type.decode(\"utf-8\")\n\n        is_form_encoded = CONTENT_TYPE_FORM_URLENCODED in content_type\n\n        log.debug(\n            \"Including body in call to sign: %s\",\n            is_form_encoded or self.force_include_body,\n        )\n\n        if is_form_encoded:\n            r.headers[\"Content-Type\"] = CONTENT_TYPE_FORM_URLENCODED\n            r.url, headers, r.body = self.client.sign(\n                str(r.url), str(r.method), r.body or \"\", r.headers\n            )\n        elif self.force_include_body:\n            # To allow custom clients to work on non form encoded bodies.\n            r.url, headers, r.body = self.client.sign(\n                str(r.url), str(r.method), r.body or \"\", r.headers\n            )\n        else:\n            # Omit body data in the signing of non form-encoded requests\n            r.url, headers, _ = self.client.sign(\n                str(r.url), str(r.method), None, r.headers\n            )\n\n        r.prepare_headers(headers)\n        r.url = to_native_string(r.url)\n        log.debug(\"Updated url: %s\", r.url)\n        log.debug(\"Updated headers: %s\", headers)\n        log.debug(\"Updated body: %r\", r.body)\n        return r\n"
  },
  {
    "path": "allauth/socialaccount/providers/oauth/provider.py",
    "content": "import logging\nfrom urllib.parse import parse_qsl\n\nfrom django.core.exceptions import ImproperlyConfigured\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nfrom allauth.socialaccount.helpers import render_authentication_error\nfrom allauth.socialaccount.providers.base import Provider\nfrom allauth.socialaccount.providers.base.constants import AuthAction\nfrom allauth.socialaccount.providers.oauth.client import OAuthError\n\n\nlogger = logging.getLogger(__name__)\n\n\nclass OAuthProvider(Provider):\n    supports_redirect = True\n\n    def get_login_url(self, request, **kwargs):\n        url = reverse(f\"{self.id}_login\")\n        if kwargs:\n            url = f\"{url}?{urlencode(kwargs)}\"\n        return url\n\n    def get_auth_params(self):\n        settings = self.get_settings()\n        ret = dict(settings.get(\"AUTH_PARAMS\", {}))\n        return ret\n\n    def get_auth_params_from_request(self, request, action):\n        ret = self.get_auth_params()\n        dynamic_auth_params = request.GET.get(\"auth_params\", None)\n        if dynamic_auth_params:\n            ret.update(dict(parse_qsl(dynamic_auth_params)))\n        return ret\n\n    def get_auth_url(self, request, action):\n        # TODO: This is ugly. Move authorization_url away from the\n        # adapter into the provider. Hmpf, the line between\n        # adapter/provider is a bit too thin here.\n        return None\n\n    def get_scope_from_request(self, request):\n        return self.get_scope()\n\n    def get_scope(self):\n        settings = self.get_settings()\n        scope = settings.get(\"SCOPE\")\n        if scope is None:\n            scope = self.get_default_scope()\n        return scope\n\n    def get_default_scope(self):\n        return []\n\n    def get_oauth_adapter(self, request):\n        if not hasattr(self, \"oauth_adapter_class\"):\n            raise ImproperlyConfigured(f\"No oauth_adapter_class set for {self!r}\")\n        return self.oauth_adapter_class(request)\n\n    def get_redirect_from_request_kwargs(self, request):\n        kwargs = super().get_redirect_from_request_kwargs(request)\n        kwargs[\"scope\"] = self.get_scope_from_request(request)\n        action = request.GET.get(\"action\", AuthAction.AUTHENTICATE)\n        kwargs[\"action\"] = action\n        kwargs[\"auth_params\"] = self.get_auth_params_from_request(request, action)\n        return kwargs\n\n    def redirect(self, request, process, next_url=None, data=None, **kwargs):\n        callback_url = reverse(f\"{self.id}_callback\")\n        oauth_adapter = self.get_oauth_adapter(request)\n        action = kwargs.pop(\"action\", AuthAction.AUTHENTICATE)\n        auth_url = self.get_auth_url(request, action) or oauth_adapter.authorize_url\n        auth_params = kwargs.pop(\"auth_params\", None)\n        if auth_params is None:\n            auth_params = self.get_auth_params()\n        scope = kwargs.pop(\"scope\", None)\n        if scope is None:\n            scope = self.get_scope()\n        self.stash_redirect_state(request, process, next_url, data, **kwargs)\n        client = oauth_adapter._get_client(request, callback_url, scope=scope)\n        try:\n            return client.get_redirect(auth_url, auth_params)\n        except OAuthError as e:\n            logger.error(\"OAuth authentication error\", exc_info=True)\n            return render_authentication_error(request, self, exception=e)\n"
  },
  {
    "path": "allauth/socialaccount/providers/oauth/urls.py",
    "content": "from django.urls import include, path\n\nfrom allauth.utils import import_attribute\n\n\ndef default_urlpatterns(provider):\n    login_view = import_attribute(f\"{provider.get_package()}.views.oauth_login\")\n    callback_view = import_attribute(f\"{provider.get_package()}.views.oauth_callback\")\n\n    urlpatterns = [\n        path(\"login/\", login_view, name=f\"{provider.id}_login\"),\n        path(\"login/callback/\", callback_view, name=f\"{provider.id}_callback\"),\n    ]\n\n    return [path(f\"{provider.get_slug()}/\", include(urlpatterns))]\n"
  },
  {
    "path": "allauth/socialaccount/providers/oauth/views.py",
    "content": "import logging\n\nfrom django.http import HttpRequest\nfrom django.urls import reverse\n\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.helpers import (\n    complete_social_login,\n    render_authentication_error,\n)\nfrom allauth.socialaccount.models import SocialLogin, SocialToken\nfrom allauth.socialaccount.providers.base.constants import AuthError\nfrom allauth.socialaccount.providers.base.views import BaseLoginView\nfrom allauth.socialaccount.providers.oauth.client import OAuthClient, OAuthError\n\n\nlogger = logging.getLogger(__name__)\n\n\nclass OAuthAdapter:\n    client_class = OAuthClient\n\n    def __init__(self, request) -> None:\n        self.request = request\n\n    def complete_login(self, request, app):\n        \"\"\"\n        Returns a SocialLogin instance\n        \"\"\"\n        raise NotImplementedError\n\n    def get_provider(self):\n        adapter = get_adapter(self.request)\n        app = adapter.get_app(self.request, provider=self.provider_id)\n        return app.get_provider(self.request)\n\n    def _get_client(self, request, callback_url, scope=None):\n        provider = self.get_provider()\n        app = provider.app\n        parameters = {}\n        if scope:\n            parameters[\"scope\"] = \" \".join(scope)\n        client = self.client_class(\n            request,\n            app.client_id,\n            app.secret,\n            self.request_token_url,\n            self.access_token_url,\n            callback_url,\n            parameters=parameters,\n            provider=provider,\n        )\n        return client\n\n\nclass OAuthView:\n    request: HttpRequest\n\n    @classmethod\n    def adapter_view(cls, adapter):\n        @login_not_required\n        def view(request, *args, **kwargs):\n            self = cls()\n            self.request = request\n            self.adapter = adapter(request)\n            return self.dispatch(request, *args, **kwargs)\n\n        return view\n\n\nclass OAuthLoginView(OAuthView, BaseLoginView):\n    def get_provider(self):\n        provider = self.adapter.get_provider()\n        return provider\n\n\nclass OAuthCallbackView(OAuthView):\n    def dispatch(self, request):\n        \"\"\"\n        View to handle final steps of OAuth based authentication where the user\n        gets redirected back to from the service provider\n        \"\"\"\n        provider = self.adapter.get_provider()\n        login_done_url = reverse(f\"{self.adapter.provider_id}_callback\")\n        client = self.adapter._get_client(request, login_done_url)\n        if not client.is_valid():\n            if \"denied\" in request.GET:\n                error = AuthError.CANCELLED\n            else:\n                error = AuthError.UNKNOWN\n            return render_authentication_error(\n                request,\n                provider,\n                error=error,\n                extra_context={\n                    \"oauth_client\": client,\n                    \"callback_view\": self,\n                },\n            )\n        app = provider.app\n        try:\n            access_token = client.get_access_token()\n            token = SocialToken(\n                token=access_token[\"oauth_token\"],\n                # .get() -- e.g. Evernote does not feature a secret\n                token_secret=access_token.get(\"oauth_token_secret\", \"\"),\n            )\n            if app.pk:\n                token.app = app\n            login = self.adapter.complete_login(\n                request, app, token, response=access_token\n            )\n            login.token = token\n            login.state = SocialLogin.unstash_state(request)\n            return complete_social_login(request, login)\n        except OAuthError as e:\n            return render_authentication_error(request, provider, exception=e)\n"
  },
  {
    "path": "allauth/socialaccount/providers/oauth2/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/oauth2/client.py",
    "content": "import requests\nfrom http import HTTPStatus\nfrom urllib.parse import parse_qsl\n\nfrom django.utils.http import urlencode\n\nfrom allauth.socialaccount.adapter import get_adapter\n\n\nclass OAuth2Error(Exception):\n    pass\n\n\nclass OAuth2Client:\n    client_id_parameter = \"client_id\"\n\n    def __init__(\n        self,\n        request,\n        consumer_key,\n        consumer_secret,\n        access_token_method,\n        access_token_url,\n        callback_url,\n        scope_delimiter=\" \",\n        headers=None,\n        basic_auth=False,\n    ):\n        self.request = request\n        self.access_token_method = access_token_method\n        self.access_token_url = access_token_url\n        self.callback_url = callback_url\n        self.consumer_key = consumer_key\n        self.consumer_secret = consumer_secret\n        self.scope_delimiter = scope_delimiter\n        self.state = None\n        self.headers = headers\n        self.basic_auth = basic_auth\n\n    def get_redirect_url(self, authorization_url, scope, extra_params) -> str:\n        scope = self.scope_delimiter.join(set(scope))\n        params = {\n            self.client_id_parameter: self.consumer_key,\n            \"redirect_uri\": self.callback_url,\n            \"scope\": scope,\n            \"response_type\": \"code\",\n        }\n        if self.state:\n            params[\"state\"] = self.state\n        params.update(extra_params)\n        return f\"{authorization_url}?{urlencode(params)}\"\n\n    def get_access_token(self, code, pkce_code_verifier=None, extra_data=None):\n        data = {\n            \"redirect_uri\": self.callback_url,\n            \"grant_type\": \"authorization_code\",\n            \"code\": code,\n        }\n        if self.basic_auth:\n            auth = requests.auth.HTTPBasicAuth(self.consumer_key, self.consumer_secret)\n        else:\n            auth = None\n            data.update(\n                {\n                    self.client_id_parameter: self.consumer_key,\n                    \"client_secret\": self.consumer_secret,\n                }\n            )\n        if extra_data:\n            data.update(extra_data)\n        params = None\n        self._strip_empty_keys(data)\n        url = self.access_token_url\n        if self.access_token_method == \"GET\":  # nosec\n            params = data\n            data = None\n        if data and pkce_code_verifier:\n            data[\"code_verifier\"] = pkce_code_verifier\n        # TODO: Proper exception handling\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.request(\n                self.access_token_method,\n                url,\n                params=params,\n                data=data,\n                headers=self.headers,\n                auth=auth,\n            )\n            access_token = None\n            if resp.status_code in [HTTPStatus.OK, HTTPStatus.CREATED]:\n                # Weibo sends json via 'text/plain;charset=UTF-8'\n                if (\n                    resp.headers[\"content-type\"].split(\";\")[0] == \"application/json\"\n                    or resp.text[:2] == '{\"'\n                ):\n                    access_token = resp.json()\n                else:\n                    access_token = dict(parse_qsl(resp.text))\n            if not access_token or \"access_token\" not in access_token:\n                raise OAuth2Error(f\"Error retrieving access token: {resp.content}\")\n            return access_token\n\n    def _strip_empty_keys(self, params) -> None:\n        \"\"\"Added because the Dropbox OAuth2 flow doesn't\n        work when scope is passed in, which is empty.\n        \"\"\"\n        keys = [k for k, v in params.items() if v == \"\"]\n        for key in keys:\n            del params[key]\n"
  },
  {
    "path": "allauth/socialaccount/providers/oauth2/provider.py",
    "content": "from urllib.parse import parse_qsl\n\nfrom django.core.exceptions import ImproperlyConfigured\nfrom django.http import HttpResponseRedirect\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nfrom allauth.socialaccount.helpers import render_authentication_error\nfrom allauth.socialaccount.providers.base import Provider\nfrom allauth.socialaccount.providers.base.constants import AuthAction\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom allauth.socialaccount.providers.oauth2.utils import generate_code_challenge\nfrom allauth.socialaccount.providers.oauth2.views import OAuth2Adapter\n\n\nclass OAuth2Provider(Provider):\n    pkce_enabled_default = False\n    oauth2_adapter_class: type[OAuth2Adapter]\n    supports_redirect = True\n\n    def get_login_url(self, request, **kwargs):\n        url = reverse(f\"{self.id}_login\")\n        if kwargs:\n            url = f\"{url}?{urlencode(kwargs)}\"\n        return url\n\n    def get_callback_url(self):\n        return reverse(f\"{self.id}_callback\")\n\n    def get_pkce_params(self) -> dict:\n        enabled = self.app.settings.get(\"oauth_pkce_enabled\")\n        if enabled is None:\n            settings = self.get_settings()\n            enabled = settings.get(\"OAUTH_PKCE_ENABLED\", self.pkce_enabled_default)\n        if enabled:\n            pkce_code_params = generate_code_challenge()\n            return pkce_code_params\n        return {}\n\n    def get_auth_params(self):\n        \"\"\"\n        Returns a dictionary of additional parameters passed to the OAuth2\n        redirect URL. Additional -- so no need to pass the standard `client_id`,\n        `redirect_uri`, `response_type`.\n        \"\"\"\n        ret = self.app.settings.get(\"auth_params\")\n        if ret is None:\n            settings = self.get_settings()\n            ret = settings.get(\"AUTH_PARAMS\", {})\n        return dict(ret)\n\n    def get_auth_params_from_request(self, request, action):\n        \"\"\"\n        Returns a dictionary of additional parameters passed to the OAuth2\n        redirect URL. Additional -- so no need to pass the standard `client_id`,\n        `redirect_uri`, `response_type`.\n        \"\"\"\n        ret = self.get_auth_params()\n        dynamic_auth_params = request.GET.get(\"auth_params\", None)\n        if dynamic_auth_params:\n            ret.update(dict(parse_qsl(dynamic_auth_params)))\n        return ret\n\n    def get_default_scope(self):\n        \"\"\"\n        Returns the default scope to use.\n        \"\"\"\n        return []\n\n    def get_scope(self):\n        \"\"\"\n        Returns the scope to use, taking settings `SCOPE` into consideration.\n        \"\"\"\n        scope = self.app.settings.get(\"scope\")\n        if scope is None:\n            settings = self.get_settings()\n            scope = settings.get(\"SCOPE\", self.get_default_scope())\n        return list(scope)\n\n    def get_scope_from_request(self, request):\n        \"\"\"\n        Returns the scope to use for the given request.\n        \"\"\"\n        scope = self.get_scope()\n        dynamic_scope = request.GET.get(\"scope\", None)\n        if dynamic_scope:\n            scope.extend(dynamic_scope.split(\",\"))\n        return scope\n\n    def get_oauth2_adapter(self, request):\n        if not hasattr(self, \"oauth2_adapter_class\"):\n            raise ImproperlyConfigured(f\"No oauth2_adapter_class set for {self!r}\")\n        return self.oauth2_adapter_class(request)\n\n    def get_redirect_from_request_kwargs(self, request):\n        kwargs = super().get_redirect_from_request_kwargs(request)\n        kwargs[\"scope\"] = self.get_scope_from_request(request)\n        action = request.GET.get(\"action\", AuthAction.AUTHENTICATE)\n        kwargs[\"auth_params\"] = self.get_auth_params_from_request(request, action)\n        return kwargs\n\n    def redirect(self, request, process, next_url=None, data=None, **kwargs):\n        app = self.app\n        oauth2_adapter = self.get_oauth2_adapter(request)\n        client = oauth2_adapter.get_client(request, app)\n\n        auth_params = kwargs.pop(\"auth_params\", None)\n        if auth_params is None:\n            auth_params = self.get_auth_params()\n        pkce_params = self.get_pkce_params()\n        code_verifier = pkce_params.pop(\"code_verifier\", None)\n        auth_params.update(pkce_params)\n\n        scope = kwargs.pop(\"scope\", None)\n        if scope is None:\n            scope = self.get_scope()\n\n        state_id = self.stash_redirect_state(\n            request, process, next_url, data, pkce_code_verifier=code_verifier, **kwargs\n        )\n        client.state = state_id\n        try:\n            return HttpResponseRedirect(\n                client.get_redirect_url(\n                    oauth2_adapter.authorize_url, scope, auth_params\n                )\n            )\n        except OAuth2Error as e:\n            return render_authentication_error(\n                request, self, extra_context={\"state_id\": state_id}, exception=e\n            )\n"
  },
  {
    "path": "allauth/socialaccount/providers/oauth2/urls.py",
    "content": "from django.urls import include, path\n\nfrom allauth.utils import import_attribute\n\n\ndef default_urlpatterns(provider):\n    login_view = import_attribute(f\"{provider.get_package()}.views.oauth2_login\")\n    callback_view = import_attribute(f\"{provider.get_package()}.views.oauth2_callback\")\n\n    urlpatterns = [\n        path(\"login/\", login_view, name=f\"{provider.id}_login\"),\n        path(\"login/callback/\", callback_view, name=f\"{provider.id}_callback\"),\n    ]\n\n    return [path(f\"{provider.get_slug()}/\", include(urlpatterns))]\n"
  },
  {
    "path": "allauth/socialaccount/providers/oauth2/utils.py",
    "content": "import base64\nimport hashlib\nfrom secrets import token_urlsafe\n\n\ndef generate_code_challenge() -> dict:\n    # Create a code verifier with a length of 128 characters\n    code_verifier = token_urlsafe(96)\n    hashed_verifier = hashlib.sha256(code_verifier.encode(\"ascii\"))\n    code_challenge = base64.urlsafe_b64encode(hashed_verifier.digest())\n    code_challenge_without_padding = code_challenge.rstrip(b\"=\")\n    return {\n        \"code_verifier\": code_verifier,\n        \"code_challenge_method\": \"S256\",\n        \"code_challenge\": code_challenge_without_padding,\n    }\n"
  },
  {
    "path": "allauth/socialaccount/providers/oauth2/views.py",
    "content": "from datetime import timedelta\nfrom requests import RequestException\n\nfrom django.conf import settings\nfrom django.core.exceptions import PermissionDenied\nfrom django.http import HttpRequest\nfrom django.shortcuts import render\nfrom django.urls import reverse\nfrom django.utils import timezone\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.core.exceptions import ImmediateHttpResponse\nfrom allauth.core.internal.httpkit import add_query_params\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.helpers import (\n    complete_social_login,\n    render_authentication_error,\n)\nfrom allauth.socialaccount.internal import statekit\nfrom allauth.socialaccount.models import SocialToken\nfrom allauth.socialaccount.providers.base import ProviderException\nfrom allauth.socialaccount.providers.base.constants import AuthError\nfrom allauth.socialaccount.providers.base.views import BaseLoginView\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Client, OAuth2Error\nfrom allauth.utils import build_absolute_uri, get_request_param\n\n\nclass OAuth2Adapter:\n    expires_in_key = \"expires_in\"\n    client_class = OAuth2Client\n    supports_state = True\n    redirect_uri_protocol: str | None = None\n    access_token_method = \"POST\"  # nosec\n    login_cancelled_error = \"access_denied\"\n    scope_delimiter = \" \"\n    basic_auth = False\n    headers: dict[str, str] | None = None\n\n    def __init__(self, request) -> None:\n        self.request = request\n        self.did_fetch_access_token = False\n\n    def get_provider(self):\n        return get_adapter(self.request).get_provider(\n            self.request, provider=self.provider_id\n        )\n\n    def complete_login(self, request, app, token: SocialToken, **kwargs):\n        \"\"\"\n        Returns a SocialLogin instance\n        \"\"\"\n        raise NotImplementedError\n\n    def get_callback_url(self, request, app):\n        callback_url = reverse(f\"{self.provider_id}_callback\")\n        protocol = self.redirect_uri_protocol\n        return build_absolute_uri(request, callback_url, protocol)\n\n    def parse_token(self, data):\n        token = SocialToken(token=data[\"access_token\"])\n        token.token_secret = data.get(\"refresh_token\", \"\")\n        expires_in = data.get(self.expires_in_key, None)\n        if expires_in:\n            token.expires_at = timezone.now() + timedelta(seconds=int(expires_in))\n        return token\n\n    def get_access_token_data(self, request, app, client, pkce_code_verifier=None):\n        code = get_request_param(self.request, \"code\")\n        data = client.get_access_token(code, pkce_code_verifier=pkce_code_verifier)\n        self.did_fetch_access_token = True\n        return data\n\n    def get_client(self, request, app):\n        callback_url = self.get_callback_url(request, app)\n        client = self.client_class(\n            self.request,\n            app.client_id,\n            app.secret,\n            self.access_token_method,\n            self.access_token_url,\n            callback_url,\n            scope_delimiter=self.scope_delimiter,\n            headers=self.headers,\n            basic_auth=self.basic_auth,\n        )\n        return client\n\n\nclass OAuth2View:\n    request: HttpRequest\n\n    @classmethod\n    def adapter_view(cls, adapter):\n        @login_not_required\n        def view(request, *args, **kwargs):\n            self = cls()\n            self.request = request\n            if not isinstance(adapter, OAuth2Adapter):\n                self.adapter = adapter(request)\n            else:\n                self.adapter = adapter\n            try:\n                return self.dispatch(request, *args, **kwargs)\n            except ImmediateHttpResponse as e:\n                return e.response\n\n        return view\n\n\nclass OAuth2LoginView(OAuth2View, BaseLoginView):\n    def get_provider(self):\n        return self.adapter.get_provider()\n\n\nclass OAuth2CallbackView(OAuth2View):\n    def dispatch(self, request, *args, **kwargs):\n        provider = self.adapter.get_provider()\n        state, resp = self._get_state(request, provider)\n        if resp:\n            return resp\n        if \"error\" in request.GET or \"code\" not in request.GET:\n            # Distinguish cancel from error\n            auth_error = request.GET.get(\"error\", None)\n            if auth_error == self.adapter.login_cancelled_error:\n                error = AuthError.CANCELLED\n            else:\n                error = AuthError.UNKNOWN\n            return render_authentication_error(\n                request,\n                provider,\n                error=error,\n                extra_context={\n                    \"state\": state,\n                    \"callback_view\": self,\n                },\n            )\n        app = provider.app\n        client = self.adapter.get_client(self.request, app)\n\n        try:\n            access_token = self.adapter.get_access_token_data(\n                request, app, client, pkce_code_verifier=state.get(\"pkce_code_verifier\")\n            )\n            token = self.adapter.parse_token(access_token)\n            if app.pk:\n                token.app = app\n            login = self.adapter.complete_login(\n                request, app, token, response=access_token\n            )\n            login.token = token\n            login.state = state\n            return complete_social_login(request, login)\n        except (\n            PermissionDenied,\n            OAuth2Error,\n            RequestException,\n            ProviderException,\n        ) as e:\n            return render_authentication_error(\n                request, provider, exception=e, extra_context={\"state\": state}\n            )\n\n    def _redirect_strict_samesite(self, request, provider):\n        if (\n            \"_redir\" in request.GET\n            or settings.SESSION_COOKIE_SAMESITE.lower() != \"strict\"\n            or request.method != \"GET\"\n        ):\n            return\n        redirect_to = request.get_full_path()\n        redirect_to = add_query_params(redirect_to, {\"_redir\": \"\"})\n        return render(\n            request,\n            f\"socialaccount/login_redirect.{account_settings.TEMPLATE_EXTENSION}\",\n            {\n                \"provider\": provider,\n                \"redirect_to\": redirect_to,\n            },\n        )\n\n    def _get_state(self, request, provider):\n        state = None\n        state_id = get_request_param(request, \"state\")\n        if self.adapter.supports_state:\n            if state_id:\n                state = statekit.unstash_state(request, state_id)\n        else:\n            state = statekit.unstash_last_state(request)\n        if state is None:\n            resp = self._redirect_strict_samesite(request, provider)\n            if resp:\n                # 'Strict' is in effect, let's try a redirect and then another\n                # shot at finding our state...\n                return None, resp\n            return None, render_authentication_error(\n                request,\n                provider,\n                extra_context={\n                    \"state_id\": state_id,\n                    \"callback_view\": self,\n                },\n            )\n        return state, None\n"
  },
  {
    "path": "allauth/socialaccount/providers/odnoklassniki/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/odnoklassniki/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.odnoklassniki.views import (\n    OdnoklassnikiOAuth2Adapter,\n)\n\n\nclass OdnoklassnikiAccount(ProviderAccount):\n    def get_profile_url(self):\n        return f\"https://ok.ru/profile/{self.account.extra_data['uid']}\"\n\n    def get_avatar_url(self):\n        ret = None\n        pic_big_url = self.account.extra_data.get(\"pic1024x768\")\n        pic_medium_url = self.account.extra_data.get(\"pic640x480\")\n        pic_small_url = self.account.extra_data.get(\"pic190x190\")\n        if pic_big_url:\n            return pic_big_url\n        elif pic_medium_url:\n            return pic_medium_url\n        elif pic_small_url:\n            return pic_small_url\n        else:\n            return ret\n\n\nclass OdnoklassnikiProvider(OAuth2Provider):\n    id = \"odnoklassniki\"\n    name = \"Odnoklassniki\"\n    account_class = OdnoklassnikiAccount\n    oauth2_adapter_class = OdnoklassnikiOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"uid\"]\n\n    def extract_common_fields(self, data):\n        return dict(\n            last_name=data.get(\"last_name\"),\n            first_name=data.get(\"first_name\"),\n            email=data.get(\"email\"),\n        )\n\n\nprovider_classes = [OdnoklassnikiProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/odnoklassniki/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.odnoklassniki.provider import OdnoklassnikiProvider\n\n\nurlpatterns = default_urlpatterns(OdnoklassnikiProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/odnoklassniki/views.py",
    "content": "from hashlib import md5\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nUSER_FIELDS = [\n    \"age\",\n    \"birthday\",\n    \"current_status\",\n    \"current_status_date\",\n    \"current_status_id\",\n    \"email\",\n    \"first_name\",\n    \"gender\",\n    \"has_email\",\n    \"last_name\",\n    \"locale\",\n    \"location\",\n    \"name\",\n    \"online\",\n    \"photo_id\",\n    \"pic1024x768\",  # big\n    \"pic190x190\",  # small\n    \"pic640x480\",  # medium\n    \"pic_1\",  # aka pic50x50\n    \"pic_2\",  # aka pic128max\n    \"uid\",\n]\n\n\nclass OdnoklassnikiOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"odnoklassniki\"\n    access_token_url = \"https://api.odnoklassniki.ru/oauth/token.do\"  # nosec\n    authorize_url = \"https://www.odnoklassniki.ru/oauth/authorize\"\n    profile_url = \"https://api.odnoklassniki.ru/fb.do\"\n    access_token_method = \"POST\"  # nosec\n\n    def complete_login(self, request, app, token, **kwargs):\n        data = {\n            \"method\": \"users.getCurrentUser\",\n            \"access_token\": token.token,\n            \"fields\": \",\".join(USER_FIELDS),\n            \"format\": \"JSON\",\n            \"application_key\": app.key,\n        }\n        # Ondoklassniki prescribes a weak algo\n        suffix = md5(\n            f\"{data['access_token']:s}{app.secret:s}\".encode()\n        ).hexdigest()  # nosec\n        check_list = sorted(\n            [f\"{k:s}={v:s}\" for k, v in data.items() if k != \"access_token\"]\n        )\n        data[\"sig\"] = md5(\n            (\"\".join(check_list) + suffix).encode(\"utf-8\")\n        ).hexdigest()  # nosec\n\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, params=data)\n            extra_data = response.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(OdnoklassnikiOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(OdnoklassnikiOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/okta/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/okta/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.okta.views import OktaOAuth2Adapter\n\n\nclass OktaAccount(ProviderAccount):\n    pass\n\n\nclass OktaProvider(OAuth2Provider):\n    id = \"okta\"\n    name = \"Okta\"\n    account_class = OktaAccount\n    oauth2_adapter_class = OktaOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"openid\", \"profile\", \"email\", \"offline_access\"]\n\n    def extract_uid(self, data):\n        uid_field = self.app.settings.get(\"uid_field\", \"sub\")\n        return str(data[uid_field])\n\n    def extract_extra_data(self, data):\n        return data\n\n    def extract_email_addresses(self, data):\n        return [\n            EmailAddress(\n                email=data[\"email\"], verified=bool(data[\"email_verified\"]), primary=True\n            )\n        ]\n\n    def extract_common_fields(self, data):\n        ret = dict(\n            email=data[\"email\"],\n            last_name=data[\"family_name\"],\n            first_name=data[\"given_name\"],\n        )\n        preferred_username = data.get(\"preferred_username\")\n        if preferred_username:\n            ret[\"username\"] = preferred_username.partition(\"@\")[0]\n        return ret\n\n\nprovider_classes = [OktaProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/okta/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.okta.provider import OktaProvider\n\n\nurlpatterns = default_urlpatterns(OktaProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/okta/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass OktaOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"okta\"\n\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n    okta_base_url = settings.get(\"OKTA_BASE_URL\")\n\n    @property\n    def access_token_url(self):\n        return f\"https://{self.okta_base_url}/oauth2/v1/token\"\n\n    @property\n    def authorize_url(self):\n        return f\"https://{self.okta_base_url}/oauth2/v1/authorize\"\n\n    @property\n    def userinfo_url(self):\n        return f\"https://{self.okta_base_url}/oauth2/v1/userinfo\"\n\n    @property\n    def access_token_method(self):\n        return \"POST\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        \"\"\"\n        Get the user info from userinfo endpoint and return a\n        A populated instance of the `SocialLogin` model (unsaved)\n\n        :param request:\n        :param app:\n        :param token:\n        :param kwargs:\n        :return:\n        \"\"\"\n\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.userinfo_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(OktaOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(OktaOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/openid/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/openid/admin.py",
    "content": "from django.contrib import admin\n\nfrom .models import OpenIDNonce, OpenIDStore\n\n\nclass OpenIDStoreAdmin(admin.ModelAdmin):\n    pass\n\n\nclass OpenIDNonceAdmin(admin.ModelAdmin):\n    pass\n\n\nadmin.site.register(OpenIDStore, OpenIDStoreAdmin)\nadmin.site.register(OpenIDNonce, OpenIDNonceAdmin)\n"
  },
  {
    "path": "allauth/socialaccount/providers/openid/forms.py",
    "content": "from django import forms\nfrom django.utils.safestring import mark_safe\n\n\nclass LoginForm(forms.Form):\n    openid = forms.URLField(\n        label=(\"OpenID\"),\n        help_text=mark_safe(\n            'Get an <a href=\"http://openidexplained.com/get\">OpenID</a>'\n        ),  # nosec\n    )\n    next = forms.CharField(widget=forms.HiddenInput, required=False)\n    process = forms.CharField(widget=forms.HiddenInput, required=False)\n"
  },
  {
    "path": "allauth/socialaccount/providers/openid/migrations/0001_initial.py",
    "content": "from django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n    dependencies = []\n\n    operations = [\n        migrations.CreateModel(\n            name=\"OpenIDNonce\",\n            fields=[\n                (\n                    \"id\",\n                    models.AutoField(\n                        verbose_name=\"ID\",\n                        serialize=False,\n                        auto_created=True,\n                        primary_key=True,\n                    ),\n                ),\n                (\"server_url\", models.CharField(max_length=255)),\n                (\"timestamp\", models.IntegerField()),\n                (\"salt\", models.CharField(max_length=255)),\n                (\"date_created\", models.DateTimeField(auto_now_add=True)),\n            ],\n            options={},\n            bases=(models.Model,),\n        ),\n        migrations.CreateModel(\n            name=\"OpenIDStore\",\n            fields=[\n                (\n                    \"id\",\n                    models.AutoField(\n                        verbose_name=\"ID\",\n                        serialize=False,\n                        auto_created=True,\n                        primary_key=True,\n                    ),\n                ),\n                (\"server_url\", models.CharField(max_length=255)),\n                (\"handle\", models.CharField(max_length=255)),\n                (\"secret\", models.TextField()),\n                (\"issued\", models.IntegerField()),\n                (\"lifetime\", models.IntegerField()),\n                (\"assoc_type\", models.TextField()),\n            ],\n            options={},\n            bases=(models.Model,),\n        ),\n    ]\n"
  },
  {
    "path": "allauth/socialaccount/providers/openid/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/openid/models.py",
    "content": "from django.db import models\n\n\nclass OpenIDStore(models.Model):\n    server_url = models.CharField(max_length=255)\n    handle = models.CharField(max_length=255)\n    secret = models.TextField()\n    issued = models.IntegerField()\n    lifetime = models.IntegerField()\n    assoc_type = models.TextField()\n\n    def __str__(self) -> str:\n        return self.server_url\n\n\nclass OpenIDNonce(models.Model):\n    server_url = models.CharField(max_length=255)\n    timestamp = models.IntegerField()\n    salt = models.CharField(max_length=255)\n    date_created = models.DateTimeField(auto_now_add=True)\n\n    def __str__(self) -> str:\n        return self.server_url\n"
  },
  {
    "path": "allauth/socialaccount/providers/openid/provider.py",
    "content": "from urllib.parse import urlparse\n\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nfrom allauth.socialaccount.providers.base import Provider, ProviderAccount\n\nfrom .utils import (\n    AXAttribute,\n    OldAXAttribute,\n    SRegField,\n    get_email_from_response,\n    get_value_from_response,\n)\n\n\nclass OpenIDAccount(ProviderAccount):\n    def get_brand(self):\n        ret = super().get_brand()\n        domain = urlparse(self.account.uid).netloc\n        provider_map = {}\n        for d, p in provider_map.items():\n            if domain.lower().find(d) >= 0:\n                ret = p\n                break\n        return ret\n\n    def to_str(self):\n        return self.account.uid\n\n\nclass OpenIDProvider(Provider):\n    id = \"openid\"\n    name = \"OpenID\"\n    account_class = OpenIDAccount\n    uses_apps = False\n\n    def get_login_url(self, request, **kwargs):\n        url = reverse(\"openid_login\")\n        if kwargs:\n            url += f\"?{urlencode(kwargs)}\"\n        return url\n\n    def get_brands(self):\n        default_servers = []\n        return self.get_settings().get(\"SERVERS\", default_servers)\n\n    def get_server_settings(self, endpoint):\n        servers = self.get_settings().get(\"SERVERS\", [])\n        for server in servers:\n            if endpoint is not None and endpoint.startswith(server.get(\"openid_url\")):\n                return server\n        return {}\n\n    def extract_extra_data(self, response):\n        extra_data = {}\n        server_settings = self.get_server_settings(response.endpoint.server_url)\n        extra_attributes = server_settings.get(\"extra_attributes\", [])\n        for attribute_id, name, _ in extra_attributes:\n            extra_data[attribute_id] = get_value_from_response(\n                response, ax_names=[name]\n            )\n        return extra_data\n\n    def extract_uid(self, response):\n        return response.identity_url\n\n    def extract_common_fields(self, response):\n        first_name = (\n            get_value_from_response(\n                response,\n                ax_names=[\n                    AXAttribute.PERSON_FIRST_NAME,\n                    OldAXAttribute.PERSON_FIRST_NAME,\n                ],\n            )\n            or \"\"\n        )\n        last_name = (\n            get_value_from_response(\n                response,\n                ax_names=[\n                    AXAttribute.PERSON_LAST_NAME,\n                    OldAXAttribute.PERSON_LAST_NAME,\n                ],\n            )\n            or \"\"\n        )\n        name = (\n            get_value_from_response(\n                response,\n                sreg_names=[SRegField.NAME],\n                ax_names=[AXAttribute.PERSON_NAME, OldAXAttribute.PERSON_NAME],\n            )\n            or \"\"\n        )\n        return dict(\n            email=get_email_from_response(response),\n            first_name=first_name,\n            last_name=last_name,\n            name=name,\n        )\n\n\nprovider_classes = [OpenIDProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/openid/urls.py",
    "content": "from django.urls import path\n\nfrom . import views\n\n\nurlpatterns = [\n    path(\"openid/login/\", views.login, name=\"openid_login\"),\n    path(\"openid/callback/\", views.callback, name=\"openid_callback\"),\n]\n"
  },
  {
    "path": "allauth/socialaccount/providers/openid/utils.py",
    "content": "import base64\nimport pickle  # nosec\nfrom collections import UserDict\n\nfrom openid.association import Association as OIDAssociation\nfrom openid.extensions.ax import FetchResponse\nfrom openid.extensions.sreg import SRegResponse\nfrom openid.store.interface import OpenIDStore as OIDStore\n\nfrom allauth.account.internal.emailkit import valid_email_or_none\n\nfrom .models import OpenIDNonce, OpenIDStore\n\n\nclass JSONSafeSession(UserDict):\n    \"\"\"\n    openid puts e.g. class OpenIDServiceEndpoint in the session.\n    Django 1.6 no longer pickles stuff, so we'll need to do some\n    hacking here...\n    \"\"\"\n\n    def __init__(self, session):\n        UserDict.__init__(self)\n        self.data = session\n\n    def __setitem__(self, key, value):\n        data = base64.b64encode(pickle.dumps(value)).decode(\"ascii\")\n        return UserDict.__setitem__(self, key, data)\n\n    def __getitem__(self, key):\n        data = UserDict.__getitem__(self, key)\n        # We can avoid all of this once this is released:\n        #     https://github.com/necaris/python3-openid/pull/71\n        # We're not loading pickled data from an external source, so this\n        # is safe.\n        return pickle.loads(base64.b64decode(data.encode(\"ascii\")))  # nosec\n\n\nclass OldAXAttribute:\n    PERSON_NAME = \"http://openid.net/schema/namePerson\"\n    PERSON_FIRST_NAME = \"http://openid.net/schema/namePerson/first\"\n    PERSON_LAST_NAME = \"http://openid.net/schema/namePerson/last\"\n\n\nclass AXAttribute:\n    CONTACT_EMAIL = \"http://axschema.org/contact/email\"\n    PERSON_NAME = \"http://axschema.org/namePerson\"\n    PERSON_FIRST_NAME = \"http://axschema.org/namePerson/first\"\n    PERSON_LAST_NAME = \"http://axschema.org/namePerson/last\"\n\n\nAXAttributes = [\n    AXAttribute.CONTACT_EMAIL,\n    AXAttribute.PERSON_NAME,\n    AXAttribute.PERSON_FIRST_NAME,\n    AXAttribute.PERSON_LAST_NAME,\n    OldAXAttribute.PERSON_NAME,\n    OldAXAttribute.PERSON_FIRST_NAME,\n    OldAXAttribute.PERSON_LAST_NAME,\n]\n\n\nclass SRegField:\n    EMAIL = \"email\"\n    NAME = \"fullname\"\n\n\nSRegFields = [\n    SRegField.EMAIL,\n    SRegField.NAME,\n]\n\n\nclass DBOpenIDStore(OIDStore):\n    max_nonce_age = 6 * 60 * 60\n\n    def storeAssociation(self, server_url, assoc=None):\n        try:\n            secret = base64.encodebytes(assoc.secret)\n        except AttributeError:\n            # Python 2.x compat\n            secret = base64.encodestring(assoc.secret)\n        else:\n            secret = secret.decode()\n        OpenIDStore.objects.create(\n            server_url=server_url,\n            handle=assoc.handle,\n            secret=secret,\n            issued=assoc.issued,\n            lifetime=assoc.lifetime,\n            assoc_type=assoc.assoc_type,\n        )\n\n    def getAssociation(self, server_url, handle=None):\n        stored_assocs = OpenIDStore.objects.filter(server_url=server_url)\n        if handle:\n            stored_assocs = stored_assocs.filter(handle=handle)\n\n        stored_assocs.order_by(\"-issued\")\n\n        if not stored_assocs.exists():\n            return None\n\n        return_val = None\n\n        for stored_assoc in stored_assocs:\n            assoc = OIDAssociation(\n                stored_assoc.handle,\n                base64.decodebytes(stored_assoc.secret.encode(\"utf-8\")),\n                stored_assoc.issued,\n                stored_assoc.lifetime,\n                stored_assoc.assoc_type,\n            )\n            # See:\n            # necaris/python3-openid@1abb155c8fc7b508241cbe9d2cae24f18e4a379b\n            if hasattr(assoc, \"getExpiresIn\"):\n                expires_in = assoc.getExpiresIn()\n            else:\n                expires_in = assoc.expiresIn\n            if expires_in == 0:\n                stored_assoc.delete()\n            else:\n                if return_val is None:\n                    return_val = assoc\n\n        return return_val\n\n    def removeAssociation(self, server_url, handle):\n        stored_assocs = OpenIDStore.objects.filter(server_url=server_url)\n        if handle:\n            stored_assocs = stored_assocs.filter(handle=handle)\n\n        stored_assocs.delete()\n\n    def useNonce(self, server_url, timestamp, salt):\n        try:\n            OpenIDNonce.objects.get(\n                server_url=server_url, timestamp=timestamp, salt=salt\n            )\n        except OpenIDNonce.DoesNotExist:\n            OpenIDNonce.objects.create(\n                server_url=server_url, timestamp=timestamp, salt=salt\n            )\n            return True\n\n        return False\n\n\ndef get_email_from_response(response):\n    email = None\n    sreg = SRegResponse.fromSuccessResponse(response)\n    if sreg:\n        email = valid_email_or_none(sreg.get(SRegField.EMAIL))\n    if not email:\n        ax = FetchResponse.fromSuccessResponse(response)\n        if ax:\n            try:\n                values = ax.get(AXAttribute.CONTACT_EMAIL)\n                if values:\n                    email = valid_email_or_none(values[0])\n            except KeyError:\n                pass\n    return email\n\n\ndef get_value_from_response(response, sreg_names=None, ax_names=None):\n    value = None\n    if sreg_names:\n        sreg = SRegResponse.fromSuccessResponse(response)\n        if sreg:\n            for name in sreg_names:\n                value = sreg.get(name)\n                if value:\n                    break\n\n    if not value and ax_names:\n        ax = FetchResponse.fromSuccessResponse(response)\n        if ax:\n            for name in ax_names:\n                try:\n                    values = ax.get(name)\n                    if values:\n                        value = values[0]\n                except KeyError:\n                    pass\n                if value:\n                    break\n    return value\n"
  },
  {
    "path": "allauth/socialaccount/providers/openid/views.py",
    "content": "from django.contrib.auth import REDIRECT_FIELD_NAME\nfrom django.http import HttpResponse, HttpResponseBase, HttpResponseRedirect\nfrom django.shortcuts import render\nfrom django.urls import reverse\nfrom django.utils.decorators import method_decorator\nfrom django.views import View\nfrom django.views.decorators.csrf import csrf_exempt\n\nfrom openid.consumer import consumer\nfrom openid.consumer.discover import DiscoveryFailure\nfrom openid.extensions.ax import AttrInfo, FetchRequest\nfrom openid.extensions.sreg import SRegRequest\nfrom openid.message import InvalidOpenIDNamespace\n\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.socialaccount.app_settings import QUERY_EMAIL\nfrom allauth.socialaccount.helpers import (\n    complete_social_login,\n    render_authentication_error,\n)\nfrom allauth.socialaccount.models import SocialLogin\nfrom allauth.socialaccount.providers.openid.provider import OpenIDProvider\n\nfrom ..base import AuthError\nfrom .forms import LoginForm\nfrom .utils import AXAttributes, DBOpenIDStore, JSONSafeSession, SRegFields\n\n\ndef _openid_consumer(request, provider, endpoint):\n    server_settings = provider.get_server_settings(endpoint)\n    stateless = server_settings.get(\"stateless\", False)\n    store = None if stateless else DBOpenIDStore()\n    client = consumer.Consumer(JSONSafeSession(request.session), store)\n    return client\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass OpenIDLoginView(View):\n    template_name = \"openid/login.html\"\n    form_class = LoginForm\n    provider_class = OpenIDProvider\n\n    def dispatch(self, request, *args, **kwargs) -> HttpResponseBase:\n        self.provider = self.provider_class(request)\n        return super().dispatch(request, *args, **kwargs)\n\n    def get(self, request) -> HttpResponse:\n        form = self.get_form()\n        if not form.is_valid():\n            return render(request, self.template_name, {\"form\": form})\n\n        try:\n            return self.perform_openid_auth(form)\n        except (UnicodeDecodeError, DiscoveryFailure) as e:\n            # UnicodeDecodeError: necaris/python3-openid#1\n            return render_authentication_error(request, self.provider, exception=e)\n\n    def post(self, request) -> HttpResponse:\n        form = self.get_form()\n        if form.is_valid():\n            try:\n                return self.perform_openid_auth(form)\n            except (UnicodeDecodeError, DiscoveryFailure) as e:\n                form._errors[\"openid\"] = form.error_class([e])\n\n        return render(request, self.template_name, {\"form\": form})\n\n    def get_form(self):\n        if self.request.method == \"GET\" and \"openid\" not in self.request.GET:\n            return self.form_class(\n                initial={\n                    \"next\": self.request.GET.get(REDIRECT_FIELD_NAME),\n                    \"process\": self.request.GET.get(\"process\"),\n                }\n            )\n\n        return self.form_class(\n            dict(list(self.request.GET.items()) + list(self.request.POST.items()))\n        )\n\n    def get_client(self, provider, endpoint):\n        return _openid_consumer(self.request, provider, endpoint)\n\n    def get_realm(self, provider):\n        return provider.get_settings().get(\n            \"REALM\", self.request.build_absolute_uri(\"/\")\n        )\n\n    def get_callback_url(self):\n        return reverse(callback)\n\n    def perform_openid_auth(self, form):\n        if not form.is_valid():\n            return form\n\n        request = self.request\n        provider = self.provider\n        endpoint = form.cleaned_data[\"openid\"]\n        client = self.get_client(provider, endpoint)\n        realm = self.get_realm(provider)\n\n        auth_request = client.begin(endpoint)\n        if QUERY_EMAIL:\n            sreg = SRegRequest()\n            for name in SRegFields:\n                sreg.requestField(field_name=name, required=True)\n            auth_request.addExtension(sreg)\n            ax = FetchRequest()\n            for name in AXAttributes:\n                ax.add(AttrInfo(name, required=True))\n            server_settings = provider.get_server_settings(request.GET.get(\"openid\"))\n            extra_attributes = server_settings.get(\"extra_attributes\", [])\n            for _, name, required in extra_attributes:\n                ax.add(AttrInfo(name, required=required))\n            auth_request.addExtension(ax)\n\n        SocialLogin.stash_state(request)\n\n        # Fix for issues 1523 and 2072 (github django-allauth)\n        if \"next\" in form.cleaned_data and form.cleaned_data[\"next\"]:\n            auth_request.return_to_args[\"next\"] = form.cleaned_data[\"next\"]\n        redirect_url = auth_request.redirectURL(\n            realm, request.build_absolute_uri(self.get_callback_url())\n        )\n        return HttpResponseRedirect(redirect_url)\n\n\nlogin = OpenIDLoginView.as_view()\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass OpenIDCallbackView(View):\n    provider_class = OpenIDProvider\n\n    def get(self, request) -> HttpResponse:\n        provider = self.provider = self.provider_class(request)\n        endpoint = request.GET.get(\"openid.op_endpoint\", \"\")\n        client = self.get_client(provider, endpoint)\n        try:\n            response = self.get_openid_response(client)\n        except InvalidOpenIDNamespace as e:\n            return render_authentication_error(self.request, self.provider, exception=e)\n\n        if response.status == consumer.SUCCESS:\n            login = provider.sociallogin_from_response(request, response)\n            login.state = SocialLogin.unstash_state(request)\n            return self.complete_login(login)\n        else:\n            if response.status == consumer.CANCEL:\n                error = AuthError.CANCELLED\n            else:\n                error = AuthError.UNKNOWN\n            return self.render_error(error)\n\n    post = get\n\n    def complete_login(self, login) -> HttpResponse:\n        return complete_social_login(self.request, login)\n\n    def render_error(self, error) -> HttpResponse:\n        return render_authentication_error(self.request, self.provider, error=error)\n\n    def get_client(self, provider, endpoint):\n        return _openid_consumer(self.request, provider, endpoint)\n\n    def get_openid_response(self, client):\n        return client.complete(\n            dict(list(self.request.GET.items()) + list(self.request.POST.items())),\n            self.request.build_absolute_uri(self.request.path),\n        )\n\n\ncallback = csrf_exempt(OpenIDCallbackView.as_view())\n"
  },
  {
    "path": "allauth/socialaccount/providers/openid_connect/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/openid_connect/provider.py",
    "content": "import requests\n\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.internal import jwtkit\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.openid_connect.views import (\n    OpenIDConnectOAuth2Adapter,\n)\n\n\ndef _pick_data(data: dict) -> dict:\n    # Prefer userinfo, it likely has more info compared to the ID token.\n    if userinfo := data.get(\"userinfo\"):\n        return userinfo\n    elif id_token := data.get(\"id_token\"):\n        return id_token\n    # For backwards compatibility with <65.11\n    return data\n\n\nclass OpenIDConnectProviderAccount(ProviderAccount):\n    def get_user_data(self) -> dict | None:\n        return _pick_data(self.account.extra_data)\n\n\nclass OpenIDConnectProvider(OAuth2Provider):\n    id = \"openid_connect\"\n    name = \"OpenID Connect\"\n    account_class = OpenIDConnectProviderAccount\n    oauth2_adapter_class = OpenIDConnectOAuth2Adapter\n    supports_token_authentication = True\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.name = self.app.name\n\n    @property\n    def server_url(self):\n        url = self.app.settings[\"server_url\"]\n        return self.wk_server_url(url)\n\n    def wk_server_url(self, url):\n        well_known_uri = \"/.well-known/openid-configuration\"\n        if \"/.well-known/\" not in url:\n            url += well_known_uri\n        return url\n\n    def get_login_url(self, request, **kwargs):\n        url = reverse(\n            f\"{self.app.provider}_login\", kwargs={\"provider_id\": self.app.provider_id}\n        )\n        if kwargs:\n            url = f\"{url}?{urlencode(kwargs)}\"\n        return url\n\n    def get_callback_url(self):\n        return reverse(\n            f\"{self.app.provider}_callback\",\n            kwargs={\"provider_id\": self.app.provider_id},\n        )\n\n    @property\n    def token_auth_method(self):\n        return self.app.settings.get(\"token_auth_method\")\n\n    def get_default_scope(self):\n        return [\"openid\", \"profile\", \"email\"]\n\n    def extract_uid(self, data):\n        data = _pick_data(data)\n        return str(data[self.app.settings.get(\"uid_field\", \"sub\")])\n\n    def extract_common_fields(self, data):\n        data = _pick_data(data)\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"preferred_username\"),\n            name=data.get(\"name\"),\n            user_id=data.get(\"user_id\"),\n            picture=data.get(\"picture\"),\n            last_name=data.get(\"family_name\"),\n            first_name=data.get(\"given_name\"),\n        )\n\n    def extract_email_addresses(self, data):\n        data = _pick_data(data)\n        addresses = []\n        email = data.get(\"email\")\n        if email:\n            addresses.append(\n                EmailAddress(\n                    email=email,\n                    verified=data.get(\"email_verified\", False),\n                    primary=True,\n                )\n            )\n        return addresses\n\n    def get_oauth2_adapter(self, request):\n        return self.oauth2_adapter_class(request, self.app.provider_id)\n\n    def verify_token(self, request, token):\n        id_token = token.get(\"id_token\")\n        if not id_token:\n            raise get_adapter().validation_error(\"invalid_token\")\n        try:\n            oauth2_adapter = self.get_oauth2_adapter(request)\n            openid_config = oauth2_adapter.openid_config\n            identity_data = jwtkit.verify_and_decode(\n                credential=id_token,\n                keys_url=openid_config[\"jwks_uri\"],\n                issuer=openid_config[\"issuer\"],\n                audience=[self.app.client_id],\n                lookup_kid=jwtkit.lookup_kid_jwk,\n            )\n        except (OAuth2Error, requests.RequestException) as e:\n            raise get_adapter().validation_error(\"invalid_token\") from e\n        login = self.sociallogin_from_response(request, identity_data)\n        return login\n\n\nprovider_classes = [OpenIDConnectProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/openid_connect/urls.py",
    "content": "from django.urls import include, path, re_path\n\nfrom allauth.socialaccount import app_settings\n\nfrom . import views\n\n\nurlpatterns = [\n    re_path(\n        r\"^(?P<provider_id>[^/]+)/\",\n        include(\n            [\n                path(\n                    \"login/\",\n                    views.login,\n                    name=\"openid_connect_login\",\n                ),\n                path(\n                    \"login/callback/\",\n                    views.callback,\n                    name=\"openid_connect_callback\",\n                ),\n            ]\n        ),\n    )\n]\n\nif app_settings.OPENID_CONNECT_URL_PREFIX:\n    urlpatterns = [\n        path(f\"{app_settings.OPENID_CONNECT_URL_PREFIX}/\", include(urlpatterns))\n    ]\n"
  },
  {
    "path": "allauth/socialaccount/providers/openid_connect/views.py",
    "content": "from django.http import Http404\nfrom django.urls import reverse\n\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.internal import jwtkit\nfrom allauth.socialaccount.models import SocialApp, SocialToken\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\nfrom allauth.utils import build_absolute_uri\n\n\nclass OpenIDConnectOAuth2Adapter(OAuth2Adapter):\n    def __init__(self, request, provider_id):\n        self.provider_id = provider_id\n        super().__init__(request)\n\n    @property\n    def openid_config(self):\n        if not hasattr(self, \"_openid_config\"):\n            server_url = self.get_provider().server_url\n            with get_adapter().get_requests_session() as sess:\n                resp = sess.get(server_url)\n                resp.raise_for_status()\n                self._openid_config = resp.json()\n        return self._openid_config\n\n    @property\n    def basic_auth(self):\n        token_auth_method = self.get_provider().app.settings.get(\"token_auth_method\")\n        if token_auth_method:\n            return token_auth_method == \"client_secret_basic\"  # nosec\n        methods = self.openid_config.get(\"token_endpoint_auth_methods_supported\", [])\n        # Basic auth is problematic, especially when client ID contains a colon.\n        return \"client_secret_post\" not in methods and \"client_secret_basic\" in methods\n\n    @property\n    def access_token_url(self):\n        return self.openid_config[\"token_endpoint\"]\n\n    @property\n    def authorize_url(self):\n        return self.openid_config[\"authorization_endpoint\"]\n\n    @property\n    def profile_url(self):\n        return self.openid_config[\"userinfo_endpoint\"]\n\n    def complete_login(self, request, app, token: SocialToken, **kwargs):\n        id_token_str = kwargs[\"response\"].get(\"id_token\")\n        fetch_userinfo = app.settings.get(\"fetch_userinfo\", True)\n        data = {}\n        if fetch_userinfo or (not id_token_str):\n            data[\"userinfo\"] = self._fetch_user_info(token.token)\n        if id_token_str:\n            data[\"id_token\"] = self._decode_id_token(app, id_token_str)\n        return self.get_provider().sociallogin_from_response(request, data)\n\n    def _fetch_user_info(self, access_token: str) -> dict:\n        headers = {\"Authorization\": f\"Bearer {access_token}\"}\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, headers=headers)\n            response.raise_for_status()\n        return response.json()\n\n    def _decode_id_token(self, app: SocialApp, id_token: str) -> dict:\n        \"\"\"\n        If the token was received by direct communication protected by\n        TLS between this library and Google, we are allowed to skip checking the\n        token signature according to the OpenID Connect Core 1.0 specification.\n\n        https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation\n        \"\"\"\n        verify_signature = not self.did_fetch_access_token\n        return jwtkit.verify_and_decode(\n            credential=id_token,\n            keys_url=self.openid_config[\"jwks_uri\"],\n            issuer=self.openid_config[\"issuer\"],\n            audience=app.client_id,\n            lookup_kid=jwtkit.lookup_kid_jwk,\n            verify_signature=verify_signature,\n        )\n\n    def get_callback_url(self, request, app):\n        callback_url = reverse(\n            \"openid_connect_callback\", kwargs={\"provider_id\": self.provider_id}\n        )\n        protocol = self.redirect_uri_protocol\n        return build_absolute_uri(request, callback_url, protocol)\n\n\n@login_not_required\ndef login(request, provider_id):\n    try:\n        view = OAuth2LoginView.adapter_view(\n            OpenIDConnectOAuth2Adapter(request, provider_id)\n        )\n        return view(request)\n    except SocialApp.DoesNotExist:\n        raise Http404\n\n\n@login_not_required\ndef callback(request, provider_id):\n    try:\n        view = OAuth2CallbackView.adapter_view(\n            OpenIDConnectOAuth2Adapter(request, provider_id)\n        )\n        return view(request)\n    except SocialApp.DoesNotExist:\n        raise Http404\n"
  },
  {
    "path": "allauth/socialaccount/providers/openstreetmap/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/openstreetmap/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth.provider import OAuthProvider\nfrom allauth.socialaccount.providers.openstreetmap.views import (\n    OpenStreetMapOAuthAdapter,\n)\n\n\nclass OpenStreetMapAccount(ProviderAccount):\n    def get_profile_url(self):\n        display_name = self.account.extra_data[\"display_name\"]\n        return f\"https://www.openstreetmap.org/user/{display_name}\"\n\n    def get_avatar_url(self):\n        ret = None\n        if img := self.account.extra_data.get(\"img\"):\n            ret = img.get(\"href\")\n        if not ret:\n            # Backwards compatible (OSM provider data originating from XML)\n            ret = self.account.extra_data.get(\"avatar\")\n        return ret\n\n    def get_username(self):\n        return self.account.extra_data[\"display_name\"]\n\n\nclass OpenStreetMapProvider(OAuthProvider):\n    id = \"openstreetmap\"\n    name = \"OpenStreetMap\"\n    account_class = OpenStreetMapAccount\n    oauth_adapter_class = OpenStreetMapOAuthAdapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(username=data[\"display_name\"])\n\n\nprovider_classes = [OpenStreetMapProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/openstreetmap/urls.py",
    "content": "from allauth.socialaccount.providers.oauth.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.openstreetmap.provider import OpenStreetMapProvider\n\n\nurlpatterns = default_urlpatterns(OpenStreetMapProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/openstreetmap/views.py",
    "content": "from allauth.socialaccount.providers.oauth.client import OAuth\nfrom allauth.socialaccount.providers.oauth.views import (\n    OAuthAdapter,\n    OAuthCallbackView,\n    OAuthLoginView,\n)\n\n\nclass OpenStreetMapAPI(OAuth):\n    url = \"https://api.openstreetmap.org/api/0.6/user/details.json\"\n\n    def get_user_info(self):\n        data = self.query(self.url).json()\n        return data[\"user\"]\n\n\nclass OpenStreetMapOAuthAdapter(OAuthAdapter):\n    provider_id = \"openstreetmap\"\n    request_token_url = \"https://www.openstreetmap.org/oauth/request_token\"  # nosec\n    access_token_url = \"https://www.openstreetmap.org/oauth/access_token\"  # nosec\n    authorize_url = \"https://www.openstreetmap.org/oauth/authorize\"\n\n    def complete_login(self, request, app, token, response):\n        client = OpenStreetMapAPI(\n            request, app.client_id, app.secret, self.request_token_url\n        )\n        extra_data = client.get_user_info()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth_login = OAuthLoginView.adapter_view(OpenStreetMapOAuthAdapter)\noauth_callback = OAuthCallbackView.adapter_view(OpenStreetMapOAuthAdapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/orcid/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/orcid/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.orcid.views import OrcidOAuth2Adapter\n\n\nclass Scope:\n    USERINFO_PROFILE = \"/authenticate\"\n\n\nclass OrcidAccount(ProviderAccount):\n    def get_profile_url(self):\n        return extract_from_dict(self.account.extra_data, [\"orcid-identifier\", \"uri\"])\n\n\nclass OrcidProvider(OAuth2Provider):\n    id = \"orcid\"\n    name = \"Orcid.org\"\n    account_class = OrcidAccount\n    oauth2_adapter_class = OrcidOAuth2Adapter\n\n    def get_default_scope(self):\n        return [Scope.USERINFO_PROFILE]\n\n    def extract_uid(self, data):\n        return extract_from_dict(data, [\"orcid-identifier\", \"path\"])\n\n    def extract_common_fields(self, data):\n        common_fields = dict(\n            email=extract_from_dict(data, [\"person\", \"emails\", \"email\", 0, \"email\"]),\n            last_name=extract_from_dict(\n                data, [\"person\", \"name\", \"family-name\", \"value\"]\n            ),\n            first_name=extract_from_dict(\n                data, [\"person\", \"name\", \"given-names\", \"value\"]\n            ),\n        )\n        return {key: value for (key, value) in common_fields.items() if value}\n\n\nprovider_classes = [OrcidProvider]\n\n\ndef extract_from_dict(data, path):\n    \"\"\"\n    Navigate `data`, a multidimensional array (list or dictionary), and returns\n    the object at `path`.\n    \"\"\"\n    value = data\n    try:\n        for key in path:\n            value = value[key]\n        return value\n    except (KeyError, IndexError, TypeError):\n        return \"\"\n"
  },
  {
    "path": "allauth/socialaccount/providers/orcid/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.orcid.provider import OrcidProvider\n\n\nurlpatterns = default_urlpatterns(OrcidProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/orcid/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass OrcidOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"orcid\"\n    member_api_default = False\n    base_domain_default = \"orcid.org\"\n\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n\n    base_domain = settings.get(\"BASE_DOMAIN\", base_domain_default)\n    member_api = settings.get(\"MEMBER_API\", member_api_default)\n\n    api_domain = f\"{'api' if member_api else 'pub'}.{base_domain}\"\n\n    authorize_url = f\"https://{base_domain}/oauth/authorize\"\n    access_token_url = f\"https://{api_domain}/oauth/token\"\n    profile_url = f\"https://{api_domain}/v3.0/%s/record\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        params = {}\n        if self.member_api:\n            params[\"access_token\"] = token.token\n\n        headers = {\"accept\": \"application/orcid+json\"}\n        with get_adapter().get_requests_session() as sess:\n            url = self.profile_url % kwargs[\"response\"][\"orcid\"]\n            resp = sess.get(url, params=params, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(OrcidOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(OrcidOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/patreon/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/patreon/constants.py",
    "content": "from django.conf import settings\n\n\nPROVIDER_ID = \"patreon\"\nAPI_VERSION = (\n    getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {})\n    .get(\"patreon\", {})\n    .get(\"VERSION\", \"v1\")\n)\nUSE_API_V2 = True if API_VERSION == \"v2\" else False\nAPI_URL = f\"https://www.patreon.com/api/oauth2/{API_VERSION if USE_API_V2 else 'api'}\"\n"
  },
  {
    "path": "allauth/socialaccount/providers/patreon/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/patreon/provider.py",
    "content": "\"\"\"\nProvider for Patreon\n\"\"\"\n\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.patreon.views import PatreonOAuth2Adapter\n\nfrom .constants import PROVIDER_ID, USE_API_V2\n\n\nclass PatreonAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"attributes\").get(\"thumb_url\")\n\n    def to_str(self):\n        email = self.account.extra_data.get(\"attributes\", {}).get(\"email\")\n        return email or super().to_str()\n\n\nclass PatreonProvider(OAuth2Provider):\n    id = PROVIDER_ID\n    name = \"Patreon\"\n    account_class = PatreonAccount\n    oauth2_adapter_class = PatreonOAuth2Adapter\n\n    def get_default_scope(self):\n        if USE_API_V2:\n            return [\n                \"identity\",\n                \"identity[email]\",\n                \"campaigns\",\n                \"campaigns.members\",\n            ]\n        return [\"pledges-to-me\", \"users\", \"my-campaign\"]\n\n    def extract_uid(self, data):\n        return data.get(\"id\")\n\n    def extract_common_fields(self, data):\n        details = data[\"attributes\"]\n        return {\n            \"email\": details.get(\"email\"),\n            \"fullname\": details.get(\"full_name\"),\n            \"first_name\": details.get(\"first_name\"),\n            \"last_name\": details.get(\"last_name\"),\n        }\n\n\nprovider_classes = [PatreonProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/patreon/urls.py",
    "content": "\"\"\"URLs for Patreon Provider\"\"\"\n\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.patreon.provider import PatreonProvider\n\n\nurlpatterns = default_urlpatterns(PatreonProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/patreon/views.py",
    "content": "\"\"\"\nViews for PatreonProvider\nhttps://www.patreon.com/platform/documentation/oauth\n\"\"\"\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\nfrom .constants import API_URL, PROVIDER_ID, USE_API_V2\n\n\nclass PatreonOAuth2Adapter(OAuth2Adapter):\n    provider_id = PROVIDER_ID\n    access_token_url = \"https://www.patreon.com/api/oauth2/token\"  # nosec\n    authorize_url = \"https://www.patreon.com/oauth2/authorize\"\n    profile_url = \"{}/{}\".format(\n        API_URL,\n        (\n            \"identity?include=memberships&fields%5Buser%5D=email,first_name,\"\n            \"full_name,image_url,last_name,social_connections,\"\n            \"thumb_url,url,vanity\"\n            if USE_API_V2\n            else \"current_user\"\n        ),\n    )\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json().get(\"data\")\n\n            if USE_API_V2:\n                # Extract tier/pledge level for Patreon API v2:\n                try:\n                    memberships = extra_data[\"relationships\"][\"memberships\"]\n                    member_id = memberships[\"data\"][0][\"id\"]\n                    member_url = (\n                        \"{}/members/{}?include=\"\n                        \"currently_entitled_tiers&fields%5Btier%5D=title\"\n                    ).format(API_URL, member_id)\n                    resp_member = sess.get(member_url, headers=headers)\n                    resp_data = resp_member.json()\n                    pledge_title = resp_data[\"included\"][0][\"attributes\"][\"title\"]\n                    extra_data[\"pledge_level\"] = pledge_title\n                except (KeyError, IndexError):\n                    extra_data[\"pledge_level\"] = None\n                    pass\n\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(PatreonOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(PatreonOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/paypal/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/paypal/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.paypal.views import PaypalOAuth2Adapter\n\n\nclass PaypalAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"picture\")\n\n\nclass PaypalProvider(OAuth2Provider):\n    id = \"paypal\"\n    name = \"Paypal\"\n    account_class = PaypalAccount\n    oauth2_adapter_class = PaypalOAuth2Adapter\n\n    def get_default_scope(self):\n        # See: https://developer.paypal.com/docs/integration/direct/identity/attributes/  # noqa\n        return [\"openid\", \"email\"]\n\n    def extract_uid(self, data):\n        return str(data[\"user_id\"])\n\n    def extract_common_fields(self, data):\n        # See: https://developer.paypal.com/docs/api/#get-user-information\n        return dict(\n            first_name=data.get(\"given_name\", \"\"),\n            last_name=data.get(\"family_name\", \"\"),\n            email=data.get(\"email\"),\n        )\n\n\nprovider_classes = [PaypalProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/paypal/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.paypal.provider import PaypalProvider\n\n\nurlpatterns = default_urlpatterns(PaypalProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/paypal/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass PaypalOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"paypal\"\n\n    @property\n    def authorize_url(self):\n        path = \"webapps/auth/protocol/openidconnect/v1/authorize\"\n        return f\"https://www.{self._get_endpoint()}/{path}\"\n\n    @property\n    def access_token_url(self):\n        path = \"v1/identity/openidconnect/tokenservice\"\n        return f\"https://api.{self._get_endpoint()}/{path}\"\n\n    @property\n    def profile_url(self):\n        path = \"v1/identity/openidconnect/userinfo\"\n        return f\"https://api.{self._get_endpoint()}/{path}\"\n\n    def _get_endpoint(self):\n        settings = self.get_provider().get_settings()\n        if settings.get(\"MODE\") == \"live\":\n            return \"paypal.com\"\n        else:\n            return \"sandbox.paypal.com\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            response = sess.post(\n                self.profile_url,\n                params={\"schema\": \"openid\", \"access_token\": token.token},\n            )\n            extra_data = response.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(PaypalOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(PaypalOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/pinterest/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/pinterest/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.pinterest.views import PinterestOAuth2Adapter\n\n\nclass PinterestAccount(ProviderAccount):\n    def get_username(self):\n        return self.account.extra_data.get(\"username\")\n\n    def get_profile_url(self):\n        # v5 extra_data not same as v1\n        username = self.get_username()\n        if username:\n            return f\"https://www.pinterest.com/{username}/\"\n        return self.account.extra_data.get(\"url\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"profile_image\")\n\n\nclass PinterestProvider(OAuth2Provider):\n    id = \"pinterest\"\n    name = \"Pinterest\"\n    account_class = PinterestAccount\n    oauth2_adapter_class = PinterestOAuth2Adapter\n\n    @property\n    def api_version(self):\n        return self.get_settings().get(\"API_VERSION\", \"v1\")\n\n    def get_default_scope(self):\n        # See: https://developers.pinterest.com/docs/api/overview/#scopes\n        if self.api_version == \"v5\":\n            # See: https://developers.pinterest.com/docs/getting-started/scopes/\n            return [\"user_accounts:read\"]\n        elif self.api_version == \"v3\":\n            return [\"read_users\"]\n        return [\"read_public\"]\n\n    def extract_extra_data(self, data):\n        if self.api_version == \"v5\":\n            return data\n        return data.get(\"data\", {})\n\n    def extract_uid(self, data):\n        if self.api_version == \"v5\":\n            return data[\"username\"]\n        return str(data[\"data\"][\"id\"])\n\n    def extract_common_fields(self, data):\n        if self.api_version == \"v5\":\n            return dict(username=data[\"username\"])\n        return dict(\n            first_name=data.get(\"data\", {}).get(\"first_name\"),\n            last_name=data.get(\"data\", {}).get(\"last_name\"),\n        )\n\n\nprovider_classes = [PinterestProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/pinterest/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.pinterest.provider import PinterestProvider\n\n\nurlpatterns = default_urlpatterns(PinterestProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/pinterest/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass PinterestOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"pinterest\"\n\n    provider_default_url = \"api.pinterest.com\"\n    provider_default_api_version = \"v1\"\n\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n\n    provider_base_url = settings.get(\"PINTEREST_URL\", provider_default_url)\n    provider_api_version = settings.get(\"API_VERSION\", provider_default_api_version)\n\n    authorize_url = \"https://www.pinterest.com/oauth/\"\n    access_token_url = f\"https://{provider_base_url}/{provider_api_version}/oauth/token\"\n    basic_auth = True\n    if provider_api_version == \"v5\":\n        profile_url = f\"https://{provider_base_url}/{provider_api_version}/user_account\"\n    elif provider_api_version == \"v3\":\n        profile_url = f\"https://{provider_base_url}/{provider_api_version}/users/me\"\n    else:\n        profile_url = f\"https://{provider_base_url}/{provider_api_version}/me\"\n\n    if provider_api_version == \"v3\":\n        access_token_method = \"PUT\"  # nosec\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, headers=headers)\n            extra_data = response.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(PinterestOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(PinterestOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/pocket/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/pocket/client.py",
    "content": "from http import HTTPStatus\nfrom urllib.parse import urlencode\n\nfrom django.http import HttpResponseRedirect\nfrom django.utils.translation import gettext as _\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth.client import (\n    OAuthClient,\n    OAuthError,\n    get_token_prefix,\n)\nfrom allauth.utils import build_absolute_uri\n\n\nclass PocketOAuthClient(OAuthClient):\n    def _get_request_token(self):\n        \"\"\"\n        Obtain a temporary request token to authorize an access token and to\n        sign the request to obtain the access token\n        \"\"\"\n        if self.request_token is None:\n            redirect_url = build_absolute_uri(self.request, self.callback_url)\n            headers = {\n                \"X-Accept\": \"application/json\",\n            }\n            data = {\n                \"consumer_key\": self.consumer_key,\n                \"redirect_uri\": redirect_url,\n            }\n            with get_adapter().get_requests_session() as sess:\n                response = sess.post(\n                    url=self.request_token_url,\n                    json=data,\n                    headers=headers,\n                )\n                if response.status_code != HTTPStatus.OK:\n                    raise OAuthError(\n                        _('Invalid response while obtaining request token from \"%s\".')\n                        % get_token_prefix(self.request_token_url)\n                    )\n                self.request_token = response.json()[\"code\"]\n            self.request.session[\n                f\"oauth_{get_token_prefix(self.request_token_url)}_request_token\"\n            ] = self.request_token\n        return self.request_token\n\n    def get_redirect(self, authorization_url, extra_params):\n        \"\"\"\n        Returns a ``HttpResponseRedirect`` object to redirect the user\n        to the Pocket authorization URL.\n        \"\"\"\n        request_token = self._get_request_token()\n        params = {\n            \"request_token\": request_token,\n            \"redirect_uri\": self.request.build_absolute_uri(self.callback_url),\n        }\n        params.update(extra_params)\n        url = f\"{authorization_url}?{urlencode(params)}\"\n        return HttpResponseRedirect(url)\n\n    def get_access_token(self):\n        \"\"\"\n        Obtain the access token to access private resources at the API\n        endpoint.\n        \"\"\"\n        if self.access_token is None:\n            request_token = self._get_rt_from_session()\n            url = self.access_token_url\n            headers = {\n                \"X-Accept\": \"application/json\",\n            }\n            data = {\n                \"consumer_key\": self.consumer_key,\n                \"code\": request_token,\n            }\n            with get_adapter().get_requests_session() as sess:\n                response = sess.post(url=url, headers=headers, json=data)\n                if response.status_code != HTTPStatus.OK:\n                    raise OAuthError(\n                        _('Invalid response while obtaining access token from \"%s\".')\n                        % get_token_prefix(self.request_token_url)\n                    )\n                r = response.json()\n            self.access_token = {\n                \"oauth_token\": request_token,\n                \"oauth_token_secret\": r[\"access_token\"],\n                \"username\": r[\"username\"],\n            }\n\n            self.request.session[\n                f\"oauth_{get_token_prefix(self.request_token_url)}_access_token\"\n            ] = self.access_token\n        return self.access_token\n"
  },
  {
    "path": "allauth/socialaccount/providers/pocket/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/pocket/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth.provider import OAuthProvider\nfrom allauth.socialaccount.providers.pocket.views import PocketOAuthAdapter\n\n\nclass PocketAccount(ProviderAccount):\n    pass\n\n\nclass PocketProvider(OAuthProvider):\n    id = \"pocket\"\n    name = \"Pocket\"\n    account_class = PocketAccount\n    oauth_adapter_class = PocketOAuthAdapter\n\n    def extract_uid(self, data):\n        return data[\"username\"]\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data[\"username\"],\n        )\n\n    def extract_email_addresses(self, data):\n        return [\n            EmailAddress(\n                email=data[\"username\"],\n                verified=True,\n                primary=True,\n            )\n        ]\n\n\nprovider_classes = [PocketProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/pocket/urls.py",
    "content": "from allauth.socialaccount.providers.oauth.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.pocket.provider import PocketProvider\n\n\nurlpatterns = default_urlpatterns(PocketProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/pocket/views.py",
    "content": "from ..oauth.views import OAuthAdapter, OAuthCallbackView, OAuthLoginView\nfrom .client import PocketOAuthClient\n\n\nclass PocketOAuthAdapter(OAuthAdapter):\n    provider_id = \"pocket\"\n    request_token_url = \"https://getpocket.com/v3/oauth/request\"  # nosec\n    access_token_url = \"https://getpocket.com/v3/oauth/authorize\"  # nosec\n    authorize_url = \"https://getpocket.com/auth/authorize\"\n    client_class = PocketOAuthClient\n\n    def complete_login(self, request, app, token, response):\n        return self.get_provider().sociallogin_from_response(request, response)\n\n\noauth_login = OAuthLoginView.adapter_view(PocketOAuthAdapter)\noauth_callback = OAuthCallbackView.adapter_view(PocketOAuthAdapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/questrade/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/questrade/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.questrade.views import QuestradeOAuth2Adapter\n\n\nclass QuestradeAccount(ProviderAccount):\n    pass\n\n\nclass QuestradeProvider(OAuth2Provider):\n    id = \"questrade\"\n    name = \"Questrade\"\n    account_class = QuestradeAccount\n    oauth2_adapter_class = QuestradeOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"userId\"])\n\n\nprovider_classes = [QuestradeProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/questrade/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.questrade.provider import QuestradeProvider\n\n\nurlpatterns = default_urlpatterns(QuestradeProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/questrade/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass QuestradeOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"questrade\"\n    access_token_url = \"https://login.questrade.com/oauth2/token\"  # nosec\n    authorize_url = \"https://login.questrade.com/oauth2/authorize\"\n    supports_state = False\n\n    def complete_login(self, request, app, token, **kwargs):\n        api_server = kwargs.get(\"response\", {}).get(\n            \"api_server\", \"https://api01.iq.questrade.com/\"\n        )\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(f\"{api_server}v1/accounts\", headers=headers)\n            resp.raise_for_status()\n            data = resp.json()\n        data.update(kwargs)\n        return self.get_provider().sociallogin_from_response(request, data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(QuestradeOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(QuestradeOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/quickbooks/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/quickbooks/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/quickbooks/provider.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.providers.base import ProviderAccount, ProviderException\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.quickbooks.views import QuickBooksOAuth2Adapter\n\n\nclass QuickBooksAccount(ProviderAccount):\n    pass\n\n\nclass QuickBooksOAuth2Provider(OAuth2Provider):\n    id = \"quickbooks\"\n    # Name is displayed to ordinary users -- don't include protocol\n    name = \"QuickBooks\"\n    account_class = QuickBooksAccount\n    oauth2_adapter_class = QuickBooksOAuth2Adapter\n\n    def extract_uid(self, data):\n        if \"sub\" not in data:\n            raise ProviderException(\"QBO error\", data)\n        return str(data[\"sub\"])\n\n    def get_profile_fields(self):\n        default_fields = [\n            \"address\",\n            \"sub\",\n            \"phoneNumber\",\n            \"givenName\",\n            \"familyName\",\n            \"email\",\n            \"emailVerified\",\n        ]\n        fields = self.get_settings().get(\"PROFILE_FIELDS\", default_fields)\n        return fields\n\n    def get_default_scope(self):\n        scope = [\n            \"openid\",\n            \"com.intuit.quickbooks.accounting\",\n            \"profile\",\n            \"phone\",\n        ]\n        if app_settings.QUERY_EMAIL:\n            scope.append(\"email\")\n        return scope\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            address=data.get(\"address\"),\n            sub=data.get(\"sub\"),\n            givenName=data.get(\"givenName\"),\n            familynName=data.get(\"familyName\"),\n            emailVerified=data.get(\"emailVerified\"),\n            phoneNumber=data.get(\"phoneNumber\"),\n        )\n\n\nprovider_classes = [QuickBooksOAuth2Provider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/quickbooks/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.quickbooks.provider import QuickBooksOAuth2Provider\n\n\nurlpatterns = default_urlpatterns(QuickBooksOAuth2Provider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/quickbooks/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass QuickBooksOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"quickbooks\"\n    access_token_url = (\n        \"https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer\"  # nosec\n    )\n    authorize_url = \"https://appcenter.intuit.com/connect/oauth2\"\n    profile_test = \"https://sandbox-accounts.platform.intuit.com/v1/openid_connect/userinfo\"  # NOQA\n    profile_url = \"https://accounts.platform.intuit.com/v1/openid_connect/userinfo\"\n    profile_url_method = \"GET\"\n    access_token_method = \"POST\"  # nosec\n\n    def complete_login(self, request, app, token, **kwargs):\n        realm_id = request.GET.get(\"realmId\")\n        extra_data = self.get_user_info(token)\n        if realm_id:\n            extra_data[\"realmId\"] = realm_id\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n    def get_user_info(self, token):\n        auth_header = f\"Bearer {token.token}\"\n        headers = {\n            \"Accept\": \"application/json\",\n            \"Authorization\": auth_header,\n            \"accept\": \"application/json\",\n        }\n        is_sandbox = self.get_provider().get_settings().get(\"SANDBOX\", False)\n        url = self.profile_test if is_sandbox else self.profile_url\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(url, headers=headers)\n            resp.raise_for_status()\n            return resp.json()\n\n\noauth2_login = OAuth2LoginView.adapter_view(QuickBooksOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(QuickBooksOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/reddit/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/reddit/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.reddit.views import RedditAdapter\n\n\nclass RedditAccount(ProviderAccount):\n    pass\n\n\nclass RedditProvider(OAuth2Provider):\n    id = \"reddit\"\n    name = \"Reddit\"\n    account_class = RedditAccount\n    oauth2_adapter_class = RedditAdapter\n\n    def extract_uid(self, data):\n        return data[\"name\"]\n\n    def extract_common_fields(self, data):\n        return dict(username=data.get(\"name\"))\n\n    def get_default_scope(self):\n        scope = [\"identity\"]\n        return scope\n\n\nprovider_classes = [RedditProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/reddit/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.reddit.provider import RedditProvider\n\n\nurlpatterns = default_urlpatterns(RedditProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/reddit/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass RedditAdapter(OAuth2Adapter):\n    provider_id = \"reddit\"\n    access_token_url = \"https://www.reddit.com/api/v1/access_token\"  # nosec\n    authorize_url = \"https://www.reddit.com/api/v1/authorize\"\n    profile_url = \"https://oauth.reddit.com/api/v1/me\"\n    basic_auth = True\n\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n    # Allow custom User Agent to comply with reddit API limits\n    headers = {\"User-Agent\": settings.get(\"USER_AGENT\", \"django-allauth-header\")}\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"bearer {token.token}\", **self.headers}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n\n            # This only here because of weird response from the test suite\n            if isinstance(resp, list):\n                resp = resp[0]\n\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(RedditAdapter)\noauth2_callback = OAuth2CallbackView.adapter_view(RedditAdapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/robinhood/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/robinhood/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.robinhood.views import RobinhoodOAuth2Adapter\n\n\nclass RobinhoodAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return None\n\n\nclass RobinhoodProvider(OAuth2Provider):\n    id = \"robinhood\"\n    name = \"Robinhood\"\n    account_class = RobinhoodAccount\n    oauth2_adapter_class = RobinhoodOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"read\"]\n\n    def extract_uid(self, data):\n        return data[\"id\"]\n\n    def extract_common_fields(self, data):\n        return dict(username=data.get(\"username\"))\n\n\nprovider_classes = [RobinhoodProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/robinhood/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.robinhood.provider import RobinhoodProvider\n\n\nurlpatterns = default_urlpatterns(RobinhoodProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/robinhood/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass RobinhoodOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"robinhood\"\n\n    @property\n    def authorize_url(self):\n        return \"https://www.robinhood.com/oauth2/authorize/\"\n\n    @property\n    def access_token_url(self):\n        return \"https://api.robinhood.com/oauth2/token/\"\n\n    @property\n    def profile_url(self):\n        return \"https://api.robinhood.com/user/id/\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, headers=headers)\n            extra_data = response.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(RobinhoodOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(RobinhoodOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/salesforce/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/salesforce/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount import providers\nfrom allauth.socialaccount.providers.base import AuthAction, ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.salesforce.views import SalesforceOAuth2Adapter\n\n\nclass SalesforceAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"link\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"picture\")\n\n\nclass SalesforceProvider(OAuth2Provider):\n    id = \"salesforce\"\n    name = \"Salesforce\"\n    package = \"allauth.socialaccount.providers.salesforce\"\n    account_class = SalesforceAccount\n    oauth2_adapter_class = SalesforceOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"id\", \"openid\"]\n\n    def get_auth_params_from_request(self, request, action):\n        ret = super().get_auth_params_from_request(request, action)\n        if action == AuthAction.REAUTHENTICATE:\n            ret[\"approval_prompt\"] = \"force\"\n        return ret\n\n    def extract_uid(self, data):\n        return str(data[\"user_id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            last_name=data.get(\"family_name\"),\n            first_name=data.get(\"given_name\"),\n            username=data.get(\"preferred_username\"),\n        )\n\n    def extract_email_addresses(self, data):\n        # a salesforce user must have an email, but it might not be verified\n        email = EmailAddress(\n            email=data.get(\"email\"),\n            primary=True,\n            verified=data.get(\"email_verified\"),\n        )\n        return [email]\n\n\nproviders.registry.register(SalesforceProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/salesforce/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.salesforce.provider import SalesforceProvider\n\n\nurlpatterns = default_urlpatterns(SalesforceProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/salesforce/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass SalesforceOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"salesforce\"\n\n    @property\n    def base_url(self):\n        return self.get_provider().app.key\n\n    @property\n    def authorize_url(self):\n        return f\"{self.base_url}/services/oauth2/authorize\"\n\n    @property\n    def access_token_url(self):\n        return f\"{self.base_url}/services/oauth2/token\"\n\n    @property\n    def userinfo_url(self):\n        return f\"{self.base_url}/services/oauth2/userinfo\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.userinfo_url, params={\"oauth_token\": token.token})\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(SalesforceOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(SalesforceOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/saml/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/saml/provider.py",
    "content": "from django.http import HttpResponseRedirect\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nfrom allauth.socialaccount.providers.base import Provider, ProviderAccount\n\n\nclass SAMLAccount(ProviderAccount):\n    pass\n\n\nclass SAMLProvider(Provider):\n    id = \"saml\"\n    name = \"SAML\"\n    supports_redirect = True\n    account_class = SAMLAccount\n    default_attribute_mapping = {\n        \"uid\": [\n            \"urn:oasis:names:tc:SAML:attribute:subject-id\",\n        ],\n        \"email\": [\n            \"urn:oid:0.9.2342.19200300.100.1.3\",\n            \"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress\",\n        ],\n        \"email_verified\": [\n            \"http://schemas.auth0.com/email_verified\",\n        ],\n        \"first_name\": [\n            \"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname\",\n            \"urn:oid:2.5.4.42\",\n        ],\n        \"last_name\": [\n            \"urn:oid:2.5.4.4\",\n        ],\n        \"username\": [\n            \"http://schemas.auth0.com/nickname\",\n        ],\n    }\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.name = self.app.name or self.app.client_id or self.name\n\n    def get_login_url(self, request, **kwargs):\n        url = reverse(\"saml_login\", kwargs={\"organization_slug\": self.app.client_id})\n        if kwargs:\n            url = f\"{url}?{urlencode(kwargs)}\"\n        return url\n\n    def extract_extra_data(self, data):\n        return data.get_attributes()\n\n    def extract_uid(self, data):\n        \"\"\"https://docs.oasis-open.org/security/saml-subject-id-attr/v1.0/csprd01/saml-subject-id-attr-v1.0-csprd01.html\n\n        Quotes:\n\n        \"While the Attributes defined in this profile have as a goal the\n        explicit replacement of the <saml:NameID> element as a means of subject\n        identification, it is certainly possible to compose them with existing\n        NameID usage provided the same subject is being identified. This can\n        also serve as a migration strategy for existing applications.\"\n\n\n        \"SAML does not define an identifier that meets all of these\n        requirements well. It does standardize a kind of NameID termed\n        “persistent” that meets some of them in the particular case of so-called\n        “pairwise” identification, where an identifier varies by relying\n        party. It has seen minimal adoption outside of a few contexts, and fails\n        at the “compact” and “simple to handle” criteria above, on top of the\n        disadvantages inherent with all NameID usage.\"\n\n        Overall, our strategy is to prefer a uid resulting from explicit\n        attribute mappings, and only if there is no such uid fallback to the\n        NameID.\n        \"\"\"\n        uid = self._extract(data).get(\"uid\")\n        if uid is None:\n            uid = data.get_nameid()\n        return uid\n\n    def extract_common_fields(self, data):\n        ret = self._extract(data)\n        ret.pop(\"uid\", None)\n        return ret\n\n    def _extract(self, data):\n        provider_config = self.app.settings\n        raw_attributes = data.get_attributes()\n        attributes = {}\n        attribute_mapping = provider_config.get(\n            \"attribute_mapping\", self.default_attribute_mapping\n        )\n        # map configured provider attributes\n        for key, provider_keys in attribute_mapping.items():\n            if isinstance(provider_keys, str):\n                provider_keys = [provider_keys]\n            for provider_key in provider_keys:\n                attribute_list = raw_attributes.get(provider_key, None)\n                if attribute_list is not None and len(attribute_list) > 0:\n                    attributes[key] = attribute_list[0]\n                    break\n        email_verified = attributes.get(\"email_verified\")\n        if email_verified:\n            email_verified = email_verified.lower() in [\"true\", \"1\", \"t\", \"y\", \"yes\"]\n            attributes[\"email_verified\"] = email_verified\n\n        # If we did not find an email, check if the NameID contains the email.\n        if not attributes.get(\"email\") and (\n            data.get_nameid_format()\n            == \"urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress\"\n            # Alternatively, if `use_id_for_email` is true, then we always interpret the nameID as email\n            or provider_config.get(\"use_nameid_for_email\", False)\n        ):\n            attributes[\"email\"] = data.get_nameid()\n\n        return attributes\n\n    def redirect(self, request, process, next_url=None, data=None, **kwargs):\n        from allauth.socialaccount.providers.saml.utils import build_auth\n\n        auth = build_auth(request, self)\n        # If we pass `return_to=None` `auth.login` will use the URL of the\n        # current view.\n        redirect = auth.login(return_to=\"\")\n        self.stash_redirect_state(\n            request,\n            process,\n            next_url,\n            data,\n            state_id=auth.get_last_request_id(),\n            **kwargs,\n        )\n        return HttpResponseRedirect(redirect)\n\n\nprovider_classes = [SAMLProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/saml/urls.py",
    "content": "from django.urls import include, path, re_path\n\nfrom . import views\n\n\nurlpatterns = [\n    re_path(\n        r\"^saml/(?P<organization_slug>[^/]+)/\",\n        include(\n            [\n                path(\n                    \"acs/\",\n                    views.acs,\n                    name=\"saml_acs\",\n                ),\n                path(\n                    \"acs/finish/\",\n                    views.finish_acs,\n                    name=\"saml_finish_acs\",\n                ),\n                path(\n                    \"sls/\",\n                    views.sls,\n                    name=\"saml_sls\",\n                ),\n                path(\n                    \"metadata/\",\n                    views.metadata,\n                    name=\"saml_metadata\",\n                ),\n                path(\n                    \"login/\",\n                    views.login,\n                    name=\"saml_login\",\n                ),\n            ]\n        ),\n    )\n]\n"
  },
  {
    "path": "allauth/socialaccount/providers/saml/utils.py",
    "content": "from urllib.parse import urlparse\n\nfrom django.core.cache import cache\nfrom django.core.exceptions import ImproperlyConfigured\nfrom django.http import Http404\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nfrom onelogin.saml2.auth import OneLogin_Saml2_Auth\nfrom onelogin.saml2.constants import OneLogin_Saml2_Constants\nfrom onelogin.saml2.idp_metadata_parser import OneLogin_Saml2_IdPMetadataParser\n\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.models import SocialApp\nfrom allauth.socialaccount.providers.saml.provider import SAMLProvider\n\n\ndef get_app_or_404(request, organization_slug):\n    adapter = get_adapter()\n    try:\n        return adapter.get_app(\n            request, provider=SAMLProvider.id, client_id=organization_slug\n        )\n    except SocialApp.DoesNotExist:\n        raise Http404(f\"no SocialApp found with client_id={organization_slug}\")\n\n\ndef prepare_django_request(request) -> dict:\n    result = {\n        \"https\": \"on\" if request.is_secure() else \"off\",\n        \"http_host\": request.META[\"HTTP_HOST\"],\n        \"script_name\": request.META.get(\"SCRIPT_NAME\"),\n        \"path_info\": request.META[\"PATH_INFO\"],\n        \"get_data\": request.GET.copy(),\n        # 'lowercase_urlencoding': True,\n        \"post_data\": request.POST.copy(),\n    }\n    return result\n\n\ndef build_sp_config(request, provider_config, org) -> dict:\n    acs_url = request.build_absolute_uri(reverse(\"saml_acs\", args=[org]))\n    sls_url = request.build_absolute_uri(reverse(\"saml_sls\", args=[org]))\n    metadata_url = request.build_absolute_uri(reverse(\"saml_metadata\", args=[org]))\n    # SP entity ID generated with the following precedence:\n    # 1. Explicitly configured SP via the SocialApp.settings\n    # 2. Fallback to the SAML metadata urlpattern\n    _sp_config = provider_config.get(\"sp\", {})\n    sp_entity_id = _sp_config.get(\"entity_id\")\n    sp_config = {\n        \"entityId\": sp_entity_id or metadata_url,\n        \"assertionConsumerService\": {\n            \"url\": acs_url,\n            \"binding\": OneLogin_Saml2_Constants.BINDING_HTTP_POST,\n        },\n        \"singleLogoutService\": {\n            \"url\": sls_url,\n            \"binding\": OneLogin_Saml2_Constants.BINDING_HTTP_REDIRECT,\n        },\n    }\n    avd = provider_config.get(\"advanced\", {})\n    if avd.get(\"x509cert\") is not None:\n        sp_config[\"x509cert\"] = avd[\"x509cert\"]\n\n    if avd.get(\"x509cert_new\"):\n        sp_config[\"x509certNew\"] = avd[\"x509cert_new\"]\n\n    if avd.get(\"private_key\") is not None:\n        sp_config[\"privateKey\"] = avd[\"private_key\"]\n\n    if avd.get(\"name_id_format\") is not None:\n        sp_config[\"NameIDFormat\"] = avd[\"name_id_format\"]\n\n    return sp_config\n\n\ndef fetch_metadata_url_config(idp_config):\n    metadata_url = idp_config[\"metadata_url\"]\n    entity_id = idp_config[\"entity_id\"]\n    cache_key = f\"saml.metadata.{metadata_url}.{entity_id}\"\n    saml_config = cache.get(cache_key)\n    if saml_config is None:\n        saml_config = OneLogin_Saml2_IdPMetadataParser.parse_remote(\n            metadata_url,\n            entity_id=entity_id,\n            timeout=idp_config.get(\"metadata_request_timeout\", 10),\n        )\n        cache.set(\n            cache_key,\n            saml_config,\n            idp_config.get(\"metadata_cache_timeout\", 60 * 60 * 4),\n        )\n    return saml_config\n\n\ndef build_saml_config(request, provider_config, org) -> dict:\n    avd = provider_config.get(\"advanced\", {})\n    security_config = {\n        \"authnRequestsSigned\": avd.get(\"authn_request_signed\", False),\n        \"digestAlgorithm\": avd.get(\"digest_algorithm\", OneLogin_Saml2_Constants.SHA256),\n        \"logoutRequestSigned\": avd.get(\"logout_request_signed\", False),\n        \"logoutResponseSigned\": avd.get(\"logout_response_signed\", False),\n        \"requestedAuthnContext\": False,\n        \"signatureAlgorithm\": avd.get(\n            \"signature_algorithm\", OneLogin_Saml2_Constants.RSA_SHA256\n        ),\n        \"signMetadata\": avd.get(\"metadata_signed\", False),\n        \"wantAssertionsEncrypted\": avd.get(\"want_assertion_encrypted\", False),\n        \"wantAssertionsSigned\": avd.get(\"want_assertion_signed\", False),\n        \"wantMessagesSigned\": avd.get(\"want_message_signed\", False),\n        \"nameIdEncrypted\": avd.get(\"name_id_encrypted\", False),\n        \"wantNameIdEncrypted\": avd.get(\"want_name_id_encrypted\", False),\n        \"allowSingleLabelDomains\": avd.get(\"allow_single_label_domains\", False),\n        \"rejectDeprecatedAlgorithm\": avd.get(\"reject_deprecated_algorithm\", True),\n        \"wantNameId\": avd.get(\"want_name_id\", False),\n        \"wantAttributeStatement\": avd.get(\"want_attribute_statement\", True),\n        \"allowRepeatAttributeName\": avd.get(\"allow_repeat_attribute_name\", True),\n        \"metadataValidUntil\": avd.get(\"metadata_valid_until\", None),\n        \"metadataCacheDuration\": avd.get(\"metadata_cache_duration\", None),\n    }\n    saml_config = {\n        \"strict\": avd.get(\"strict\", True),\n        \"security\": security_config,\n    }\n\n    contact_person = provider_config.get(\"contact_person\")\n    if contact_person:\n        saml_config[\"contactPerson\"] = contact_person\n\n    organization = provider_config.get(\"organization\")\n    if organization:\n        saml_config[\"organization\"] = organization\n\n    idp = provider_config.get(\"idp\")\n    if idp is None:\n        raise ImproperlyConfigured(\"`idp` missing\")\n    metadata_url = idp.get(\"metadata_url\")\n    if metadata_url:\n        meta_config = fetch_metadata_url_config(idp)\n        saml_config[\"idp\"] = meta_config[\"idp\"]\n    else:\n        saml_config[\"idp\"] = {\n            \"entityId\": idp[\"entity_id\"],\n            \"x509cert\": idp[\"x509cert\"],\n            \"singleSignOnService\": {\"url\": idp[\"sso_url\"]},\n        }\n        slo_url = idp.get(\"slo_url\")\n        if slo_url:\n            saml_config[\"idp\"][\"singleLogoutService\"] = {\"url\": slo_url}\n\n    saml_config[\"sp\"] = build_sp_config(request, provider_config, org)\n    return saml_config\n\n\ndef encode_relay_state(state) -> str:\n    params = {\"state\": state}\n    return urlencode(params)\n\n\ndef decode_relay_state(relay_state):\n    \"\"\"According to the spec, RelayState need not be a URL, yet,\n    ``onelogin.saml2` exposes it as ``return_to -- The target URL the user\n    should be redirected to after login``. Also, for an IdP initiated login\n    sometimes a URL is used.\n    \"\"\"\n    next_url = None\n    if relay_state:\n        parts = urlparse(relay_state)\n        if parts.scheme or parts.netloc or (parts.path and parts.path.startswith(\"/\")):\n            if get_account_adapter().is_safe_url(relay_state):\n                next_url = relay_state\n    return next_url\n\n\ndef build_auth(request, provider):\n    req = prepare_django_request(request)\n    config = build_saml_config(request, provider.app.settings, provider.app.client_id)\n    auth = OneLogin_Saml2_Auth(req, config)\n    return auth\n"
  },
  {
    "path": "allauth/socialaccount/providers/saml/views.py",
    "content": "import binascii\nimport logging\nfrom http import HTTPStatus\n\nfrom django.http import HttpRequest, HttpResponse, HttpResponseRedirect, JsonResponse\nfrom django.urls import reverse\nfrom django.utils.decorators import method_decorator\nfrom django.views import View\nfrom django.views.decorators.csrf import csrf_exempt\n\nfrom onelogin.saml2.auth import OneLogin_Saml2_Settings\nfrom onelogin.saml2.errors import OneLogin_Saml2_Error\n\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.core.internal import httpkit\nfrom allauth.socialaccount.helpers import (\n    complete_social_login,\n    render_authentication_error,\n)\nfrom allauth.socialaccount.providers.base.constants import AuthError, AuthProcess\nfrom allauth.socialaccount.providers.base.views import BaseLoginView\nfrom allauth.socialaccount.sessions import LoginSession\n\nfrom .utils import build_auth, build_saml_config, decode_relay_state, get_app_or_404\n\n\nlogger = logging.getLogger(__name__)\n\n\nclass SAMLViewMixin:\n    def get_app(self, organization_slug):\n        app = get_app_or_404(self.request, organization_slug)\n        return app\n\n    def get_provider(self, organization_slug):\n        app = self.get_app(organization_slug)\n        return app.get_provider(self.request)\n\n\n@method_decorator(csrf_exempt, name=\"dispatch\")\n@method_decorator(login_not_required, name=\"dispatch\")\nclass ACSView(SAMLViewMixin, View):\n    def dispatch(self, request, organization_slug) -> HttpResponse:\n        url = reverse(\n            \"saml_finish_acs\",\n            kwargs={\"organization_slug\": organization_slug},\n        )\n        response = HttpResponseRedirect(url)\n        acs_session = LoginSession(request, \"saml_acs_session\", \"saml-acs-session\")\n        acs_session.store.update({\"request\": httpkit.serialize_request(request)})\n        acs_session.save(response)\n        return response\n\n\nacs = ACSView.as_view()\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass FinishACSView(SAMLViewMixin, View):\n    def dispatch(self, request, organization_slug) -> HttpResponse:\n        provider = self.get_provider(organization_slug)\n        acs_session = LoginSession(request, \"saml_acs_session\", \"saml-acs-session\")\n        acs_request = None\n        acs_request_data = acs_session.store.get(\"request\")\n        if acs_request_data:\n            acs_request = httpkit.deserialize_request(acs_request_data, HttpRequest())\n        acs_session.delete()\n        if not acs_request:\n            logger.error(\"Unable to finish login, SAML ACS session missing\")\n            return render_authentication_error(request, provider)\n\n        auth = build_auth(acs_request, provider)\n        error_reason = None\n        errors = []\n        try:\n            # We're doing the check for a valid `InResponeTo` ourselves later on\n            # (*) by checking if there is a matching state stashed.\n            auth.process_response(request_id=None)\n        except binascii.Error:\n            errors = [\"invalid_response\"]\n            error_reason = \"Invalid response\"\n        except OneLogin_Saml2_Error as e:\n            errors = [\"error\"]\n            error_reason = str(e)\n        if not errors:\n            errors = auth.get_errors()\n        if errors:\n            # e.g. ['invalid_response']\n            error_reason = auth.get_last_error_reason() or error_reason\n            logger.error(\n                \"Error processing SAML ACS response: %s: %s\"\n                % (\", \".join(errors), error_reason)\n            )\n            return render_authentication_error(\n                request,\n                provider,\n                extra_context={\n                    \"saml_errors\": errors,\n                    \"saml_last_error_reason\": error_reason,\n                },\n            )\n        if not auth.is_authenticated():\n            return render_authentication_error(\n                request, provider, error=AuthError.CANCELLED\n            )\n        login = provider.sociallogin_from_response(request, auth)\n        # (*) If we (the SP) initiated the login, there should be a matching\n        # state.\n        state_id = auth.get_last_response_in_response_to()\n        if state_id:\n            login.state = provider.unstash_redirect_state(request, state_id)\n        else:\n            # IdP initiated SSO\n            reject = provider.app.settings.get(\"advanced\", {}).get(\n                \"reject_idp_initiated_sso\", True\n            )\n            if reject:\n                logger.error(\"IdP initiated SSO rejected\")\n                return render_authentication_error(request, provider)\n            next_url = decode_relay_state(acs_request.POST.get(\"RelayState\"))\n            login.state[\"process\"] = AuthProcess.LOGIN\n            if next_url:\n                login.state[\"next\"] = next_url\n        return complete_social_login(request, login)\n\n\nfinish_acs = FinishACSView.as_view()\n\n\n@method_decorator(csrf_exempt, name=\"dispatch\")\n@method_decorator(login_not_required, name=\"dispatch\")\nclass SLSView(SAMLViewMixin, View):\n    def dispatch(self, request, organization_slug) -> HttpResponse:\n        provider = self.get_provider(organization_slug)\n        auth = build_auth(self.request, provider)\n        should_logout = request.user.is_authenticated\n        account_adapter = get_account_adapter(request)\n\n        def force_logout():\n            account_adapter.logout(request)\n\n        redirect_to = None\n        error_reason = None\n        try:\n            redirect_to = auth.process_slo(\n                delete_session_cb=force_logout, keep_local_session=not should_logout\n            )\n        except OneLogin_Saml2_Error as e:\n            error_reason = str(e)\n        errors = auth.get_errors()\n        if errors:\n            error_reason = auth.get_last_error_reason() or error_reason\n            logger.error(\n                \"Error processing SAML SLS response: %s: %s\"\n                % (\", \".join(errors), error_reason)\n            )\n            resp = HttpResponse(error_reason, content_type=\"text/plain\")\n            resp.status_code = HTTPStatus.BAD_REQUEST\n            return resp\n        if not redirect_to:\n            redirect_to = account_adapter.get_logout_redirect_url(request)\n        return HttpResponseRedirect(redirect_to)\n\n\nsls = SLSView.as_view()\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass MetadataView(SAMLViewMixin, View):\n    def dispatch(self, request, organization_slug) -> HttpResponse:\n        provider = self.get_provider(organization_slug)\n        config = build_saml_config(\n            self.request, provider.app.settings, organization_slug\n        )\n        saml_settings = OneLogin_Saml2_Settings(\n            settings=config, sp_validation_only=True\n        )\n        metadata = saml_settings.get_sp_metadata()\n        errors = saml_settings.validate_metadata(metadata)\n\n        if len(errors) > 0:\n            resp = JsonResponse({\"errors\": errors})\n            resp.status_code = HTTPStatus.INTERNAL_SERVER_ERROR\n            return resp\n\n        return HttpResponse(content=metadata, content_type=\"text/xml\")\n\n\nmetadata = MetadataView.as_view()\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass LoginView(SAMLViewMixin, BaseLoginView):\n    def get_provider(self):\n        app = self.get_app(self.kwargs[\"organization_slug\"])\n        return app.get_provider(self.request)\n\n\nlogin = LoginView.as_view()\n"
  },
  {
    "path": "allauth/socialaccount/providers/sharefile/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/sharefile/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.sharefile.views import ShareFileOAuth2Adapter\n\n\nclass ShareFileAccount(ProviderAccount):\n    pass\n\n\nclass ShareFileProvider(OAuth2Provider):\n    id = \"sharefile\"\n    name = \"ShareFile\"\n    account_class = ShareFileAccount\n    oauth2_adapter_class = ShareFileOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data.get(\"Id\", \"\"))\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"Email\", \"\"),\n            username=data.get(\"Username\", \"\"),\n            name=data.get(\"FullName\", \"\"),\n        )\n\n\nprovider_classes = [ShareFileProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/sharefile/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.sharefile.provider import ShareFileProvider\n\n\nurlpatterns = default_urlpatterns(ShareFileProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/sharefile/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass ShareFileOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"sharefile\"\n    settings = app_settings.PROVIDERS.get(provider_id, {})\n    subdomain = settings.get(\"SUBDOMAIN\", \"secure\")\n    apicp = settings.get(\"APICP\", \"sharefile.com\")\n\n    provider_default_url = settings.get(\"DEFAULT_URL\", \"https://secure.sharefile.com\")\n    provider_default_api_url = f\"https://{subdomain}.sf-api.com\"\n    provider_api_version = \"v3\"\n\n    access_token_url = f\"https://{subdomain}.{apicp}/oauth/token\"\n    refresh_token_url = f\"https://{subdomain}.{apicp}/oauth/token\"\n    authorize_url = f\"{provider_default_url}/oauth/authorize\"\n    profile_url = f\"{provider_default_api_url}/sf/{provider_api_version}/Users\"\n\n    def complete_login(self, request, app, token, response):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(ShareFileOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(ShareFileOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/shopify/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/shopify/provider.py",
    "content": "from typing import Any\n\nfrom django.conf import settings\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.shopify.views import ShopifyOAuth2Adapter\n\n\nclass ShopifyAccount(ProviderAccount):\n    def get_user_data(self):\n        return self.account.extra_data.get(\"shop\", {})\n\n\nclass ShopifyProvider(OAuth2Provider):\n    id = \"shopify\"\n    name = \"Shopify\"\n    account_class = ShopifyAccount\n    oauth2_adapter_class = ShopifyOAuth2Adapter\n\n    @property\n    def is_per_user(self):\n        grant_options = (\n            getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {})\n            .get(\"shopify\", {})\n            .get(\"AUTH_PARAMS\", {})\n            .get(\"grant_options[]\", \"\")\n        )\n        return grant_options.lower().strip() == \"per-user\"\n\n    def get_auth_params_from_request(self, request, action):\n        ret = super().get_auth_params_from_request(request, action)\n        shop = request.GET.get(\"shop\", None)\n        if shop:\n            ret.update({\"shop\": shop})\n        return ret\n\n    def get_default_scope(self):\n        return [\"read_orders\", \"read_products\"]\n\n    def extract_uid(self, data):\n        if self.is_per_user:\n            return str(data[\"associated_user\"][\"id\"])\n        else:\n            return str(data[\"shop\"][\"id\"])\n\n    def extract_common_fields(self, data):\n        if self.is_per_user:\n            return dict(\n                email=data[\"associated_user\"][\"email\"],\n                first_name=data[\"associated_user\"][\"first_name\"],\n                last_name=data[\"associated_user\"][\"last_name\"],\n            )\n        else:\n            # See: https://docs.shopify.com/api/shop\n            # Without online mode, User is only available with Shopify Plus,\n            # email is the only common field\n            return dict(email=data[\"shop\"][\"email\"])\n\n    def extract_email_addresses(self, data: dict[str, Any]) -> list[EmailAddress]:\n        ret = []\n        email = None\n        email_verified = False\n        if self.is_per_user:\n            if associated_user := data.get(\"associated_user\"):\n                email = associated_user.get(\"email\")\n                email_verified = associated_user.get(\"email_verified\", False)\n        else:\n            # The documentation of Shopify does not state anything about\n            # verified email addresses.\n            email = (data.get(\"shop\") or {}).get(\"email\")\n            email_verified = False\n        if email:\n            ret.append(\n                EmailAddress(\n                    email=email,\n                    verified=email_verified,\n                    primary=True,\n                )\n            )\n        return ret\n\n\nprovider_classes = [ShopifyProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/shopify/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.shopify.provider import ShopifyProvider\n\n\nurlpatterns = default_urlpatterns(ShopifyProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/shopify/views.py",
    "content": "import re\n\nfrom django.conf import settings\nfrom django.http import HttpResponse, HttpResponseBadRequest\n\nfrom allauth.core.exceptions import ImmediateHttpResponse\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass ShopifyOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"shopify\"\n    scope_delimiter = \",\"\n\n    def _shop_domain(self):\n        shop = self.request.GET.get(\"shop\", \"\")\n        if \".\" not in shop:\n            shop = f\"{shop}.myshopify.com\"\n        # Ensure the provided hostname parameter is a valid hostname,\n        # ends with myshopify.com, and does not contain characters\n        # other than letters (a-z), numbers (0-9), dots, and hyphens.\n        if not re.match(r\"^[a-z0-9-]+\\.myshopify\\.com$\", shop):\n            raise ImmediateHttpResponse(\n                HttpResponseBadRequest(\"Invalid `shop` parameter\")\n            )\n        return shop\n\n    def _shop_url(self, path):\n        shop = self._shop_domain()\n        return f\"https://{shop}{path}\"\n\n    @property\n    def access_token_url(self):\n        return self._shop_url(\"/admin/oauth/access_token\")\n\n    @property\n    def authorize_url(self):\n        return self._shop_url(\"/admin/oauth/authorize\")\n\n    @property\n    def profile_url(self):\n        return self._shop_url(\"/admin/shop.json\")\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"X-Shopify-Access-Token\": f\"{token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, headers=headers)\n            extra_data = response.json()\n        associated_user = kwargs[\"response\"].get(\"associated_user\")\n        if associated_user:\n            extra_data[\"associated_user\"] = associated_user\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\nclass ShopifyOAuth2LoginView(OAuth2LoginView):\n    def dispatch(self, request, *args, **kwargs):\n        is_embedded = (\n            getattr(settings, \"SOCIALACCOUNT_PROVIDERS\", {})\n            .get(\"shopify\", {})\n            .get(\"IS_EMBEDDED\", False)\n        )\n        if is_embedded:\n            # TODO: This bypasses LOGIN_ON_GET, but:\n            #\n            #     The Embedded App SDK (EASDK) and backwards compatibility layer\n            #     are being removed from Shopify on January 1, 2022.\n            #\n            # So this needs to be dropped/revisitted anyway.\n            response = super().dispatch(request, *args, **kwargs)\n            \"\"\"\n            Shopify embedded apps (that run within an iFrame) require a JS\n            (not server) redirect for starting the oauth2 process.\n\n            See Also:\n            https://help.shopify.com/api/sdks/embedded-app-sdk/getting-started#oauth\n            \"\"\"\n            js = (\n                '<!DOCTYPE html><html><head><script type=\"text/javascript\">'\n                f'window.top.location.href = \"{response.url}\";'\n                \"</script></head><body></body></html>\"\n            )\n            response = HttpResponse(content=js)\n            # Because this view will be within shopify's iframe\n            response.xframe_options_exempt = True\n            return response\n        return super().dispatch(request, *args, **kwargs)\n\n\noauth2_login = ShopifyOAuth2LoginView.adapter_view(ShopifyOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(ShopifyOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/slack/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/slack/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/slack/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.slack.views import SlackOAuth2Adapter\n\n\nclass SlackAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"user\", {}).get(\"image_192\")\n\n\nclass SlackProvider(OAuth2Provider):\n    id = \"slack\"\n    name = \"Slack\"\n    account_class = SlackAccount\n    oauth2_adapter_class = SlackOAuth2Adapter\n\n    def extract_uid(self, data):\n        team_id = data.get(\"https://slack.com/team_id\")\n        user_id = data.get(\"https://slack.com/user_id\")\n        if not (team_id and user_id):\n            team_id = data.get(\"team\").get(\"id\")\n            user_id = data.get(\"user\").get(\"id\")\n        return f\"{team_id!s}_{user_id!s}\"\n\n    def extract_common_fields(self, data):\n        user = data.get(\"user\", {})\n        return {\"name\": user.get(\"name\"), \"email\": user.get(\"email\", None)}\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"email\")\n        if email:\n            verified = data.get(\"email_verified\")\n            ret.append(EmailAddress(email=email, verified=verified, primary=True))\n        return ret\n\n    def get_default_scope(self):\n        return [\"openid\", \"profile\", \"email\"]\n\n\nprovider_classes = [SlackProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/slack/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.slack.provider import SlackProvider\n\n\nurlpatterns = default_urlpatterns(SlackProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/slack/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass SlackOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"slack\"\n\n    access_token_url = \"https://slack.com/api/openid.connect.token\"  # nosec\n    authorize_url = \"https://slack.com//openid/connect/authorize\"\n    identity_url = \"https://slack.com/api/openid.connect.userInfo\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        extra_data = self.get_data(token.token)\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n    def get_data(self, token):\n        # Verify the user first\n        headers = {\"Authorization\": f\"Bearer {token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.identity_url, headers=headers)\n            data = resp.json()\n            if not data.get(\"ok\"):\n                raise OAuth2Error()\n        return data\n\n\noauth2_login = OAuth2LoginView.adapter_view(SlackOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(SlackOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/snapchat/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/snapchat/constants.py",
    "content": "PROVIDER_ID = \"snapchat\"\n\n\nclass Scope:\n    EXTERNAL_ID = \"https://auth.snapchat.com/oauth2/api/user.external_id\"\n    DISPLAY_NAME = \"https://auth.snapchat.com/oauth2/api/user.display_name\"\n    BITMOJI = \"https://auth.snapchat.com/oauth2/api/user.bitmoji.avatar\"\n"
  },
  {
    "path": "allauth/socialaccount/providers/snapchat/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/snapchat/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.snapchat.constants import PROVIDER_ID, Scope\nfrom allauth.socialaccount.providers.snapchat.views import SnapchatOAuth2Adapter\n\n\nclass SnapchatAccount(ProviderAccount):\n    def get_user_data(self):\n        return self.account.extra_data.get(\"data\", {}).get(\"me\", {})\n\n\nclass SnapchatProvider(OAuth2Provider):\n    id = PROVIDER_ID\n    name = \"Snapchat\"\n    account_class = SnapchatAccount\n    oauth2_adapter_class = SnapchatOAuth2Adapter\n\n    def get_default_scope(self):\n        scope = [Scope.EXTERNAL_ID, Scope.DISPLAY_NAME]\n        return scope\n\n    def extract_uid(self, data):\n        return str(data.get(\"data\").get(\"me\").get(\"externalId\"))\n\n    def extract_common_fields(self, data):\n        user = data.get(\"data\", {}).get(\"me\")\n        return {\"name\": user.get(\"displayName\")}\n\n\nprovider_classes = [SnapchatProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/snapchat/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.snapchat.provider import SnapchatProvider\n\n\nurlpatterns = default_urlpatterns(SnapchatProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/snapchat/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\nfrom allauth.socialaccount.providers.snapchat.constants import PROVIDER_ID, Scope\n\n\nclass SnapchatOAuth2Adapter(OAuth2Adapter):\n    provider_id = PROVIDER_ID\n\n    access_token_url = \"https://accounts.snapchat.com/accounts/oauth2/token\"  # nosec\n    authorize_url = \"https://accounts.snapchat.com/accounts/oauth2/auth\"\n    identity_url = \"https://api.snapkit.com/v1/me\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        extra_data = self.get_data(token.token)\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n    def get_data(self, token):\n        settings = app_settings.PROVIDERS.get(self.provider_id, {})\n        provider_scope = settings.get(\n            \"SCOPE\",\n            \"['https://auth.snapchat.com/oauth2/api/user.external_id', 'https://auth.snapchat.com/oauth2/api/user.display_name']\",\n        )\n\n        hed = {\n            \"Authorization\": f\"Bearer {token}\",\n            \"Content-Type\": \"application/json;charset=UTF-8\",\n        }\n        if Scope.BITMOJI in provider_scope:\n            data = {\"query\": \"{ me { externalId displayName bitmoji { avatar id } } }\"}\n        else:\n            data = {\"query\": \"{ me { externalId displayName } }\"}\n\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.post(self.identity_url, headers=hed, json=data)\n            resp.raise_for_status()\n            data = resp.json()\n\n        if not data.get(\"data\"):\n            raise OAuth2Error()\n\n        return data\n\n\noauth2_login = OAuth2LoginView.adapter_view(SnapchatOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(SnapchatOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/soundcloud/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/soundcloud/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.soundcloud.views import SoundCloudOAuth2Adapter\n\n\nclass SoundCloudAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"permalink_url\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"avatar_url\")\n\n\nclass SoundCloudProvider(OAuth2Provider):\n    id = \"soundcloud\"\n    name = \"SoundCloud\"\n    account_class = SoundCloudAccount\n    oauth2_adapter_class = SoundCloudOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"urn\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            name=data.get(\"full_name\"),\n            username=data.get(\"username\"),\n            email=data.get(\"email\"),\n        )\n\n\nprovider_classes = [SoundCloudProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/soundcloud/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.soundcloud.provider import SoundCloudProvider\n\n\nurlpatterns = default_urlpatterns(SoundCloudProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/soundcloud/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass SoundCloudOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"soundcloud\"\n    access_token_url = \"https://api.soundcloud.com/oauth2/token\"  # nosec\n    authorize_url = \"https://soundcloud.com/connect\"\n    profile_url = \"https://api.soundcloud.com/me.json\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, params={\"oauth_token\": token.token})\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(SoundCloudOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(SoundCloudOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/spotify/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/spotify/provider.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.spotify.views import SpotifyOAuth2Adapter\n\n\nclass SpotifyAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"external_urls\").get(\"spotify\")\n\n    def get_avatar_url(self):\n        try:\n            return self.account.extra_data.get(\"images\")[0].get(\"url\")\n        except IndexError:\n            return None\n\n\nclass SpotifyOAuth2Provider(OAuth2Provider):\n    id = \"spotify\"\n    name = \"Spotify\"\n    account_class = SpotifyAccount\n    oauth2_adapter_class = SpotifyOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"id\"]\n\n    def extract_common_fields(self, data):\n        return dict(name=data.get(\"display_name\"), email=data.get(\"email\"))\n\n    def get_default_scope(self):\n        scope = []\n        if app_settings.QUERY_EMAIL:\n            scope.append(\"user-read-email\")\n        return scope\n\n\nprovider_classes = [SpotifyOAuth2Provider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/spotify/urls.py",
    "content": "from allauth.socialaccount.providers.oauth.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.spotify.provider import SpotifyOAuth2Provider\n\n\nurlpatterns = default_urlpatterns(SpotifyOAuth2Provider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/spotify/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass SpotifyOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"spotify\"\n    access_token_url = \"https://accounts.spotify.com/api/token\"  # nosec\n    authorize_url = \"https://accounts.spotify.com/authorize\"\n    profile_url = \"https://api.spotify.com/v1/me\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, params={\"access_token\": token.token})\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth_login = OAuth2LoginView.adapter_view(SpotifyOAuth2Adapter)\noauth_callback = OAuth2CallbackView.adapter_view(SpotifyOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/stackexchange/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/stackexchange/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.stackexchange.views import (\n    StackExchangeOAuth2Adapter,\n)\n\n\nclass StackExchangeAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"html_url\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"avatar_url\")\n\n\nclass StackExchangeProvider(OAuth2Provider):\n    id = \"stackexchange\"\n    name = \"Stack Exchange\"\n    account_class = StackExchangeAccount\n    oauth2_adapter_class = StackExchangeOAuth2Adapter\n\n    def get_site(self):\n        settings = self.get_settings()\n        return settings.get(\"SITE\", \"stackoverflow\")\n\n    def extract_uid(self, data):\n        # `user_id` varies if you use the same account for\n        # e.g. StackOverflow and ServerFault. Therefore, we pick\n        # `account_id`.\n        uid = str(data[\"account_id\"])\n        return uid\n\n    def extract_common_fields(self, data):\n        return dict(username=data.get(\"display_name\"))\n\n\nprovider_classes = [StackExchangeProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/stackexchange/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.stackexchange.provider import StackExchangeProvider\n\n\nurlpatterns = default_urlpatterns(StackExchangeProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/stackexchange/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass StackExchangeOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"stackexchange\"\n    access_token_url = \"https://stackexchange.com/oauth/access_token\"  # nosec\n    authorize_url = \"https://stackexchange.com/oauth\"\n    profile_url = \"https://api.stackexchange.com/2.1/me\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        provider = self.get_provider()\n        site = provider.get_site()\n        with get_adapter().get_requests_session() as sess:\n            params = {\"access_token\": token.token, \"key\": app.key, \"site\": site}\n            resp = sess.get(self.profile_url, params=params)\n            resp.raise_for_status()\n            extra_data = resp.json()[\"items\"][0]\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(StackExchangeOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(StackExchangeOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/steam/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/steam/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/steam/provider.py",
    "content": "from django.conf import settings\nfrom django.core.exceptions import ImproperlyConfigured\nfrom django.http import HttpResponseRedirect\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nfrom openid.consumer.discover import DiscoveryFailure\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.helpers import render_authentication_error\nfrom allauth.socialaccount.providers.openid.provider import (\n    OpenIDAccount,\n    OpenIDProvider,\n)\nfrom allauth.socialaccount.providers.openid.views import _openid_consumer\n\n\nif \"allauth.socialaccount.providers.openid\" not in settings.INSTALLED_APPS:\n    raise ImproperlyConfigured(\n        \"The steam provider requires 'allauth.socialaccount.providers.openid' to be installed\"\n    )\n\n\nSTEAM_OPENID_URL = \"https://steamcommunity.com/openid\"\n\n\nclass SteamAccount(OpenIDAccount):\n    def to_str(self):\n        dflt = super().to_str()\n        return self.account.extra_data.get(\"personaname\", dflt)\n\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"profileurl\")\n\n    def get_avatar_url(self):\n        return (\n            self.account.extra_data.get(\"avatarfull\")\n            or self.account.extra_data.get(\"avatarmedium\")\n            or self.account.extra_data.get(\"avatar\")\n        )\n\n\ndef extract_steam_id(url):\n    prefix = \"https://steamcommunity.com/openid/id/\"\n    if not url.startswith(prefix):\n        raise ValueError(url)\n    return url[len(prefix) :]\n\n\ndef request_steam_account_summary(api_key, steam_id):\n    api_base = \"https://api.steampowered.com/\"\n    method = \"ISteamUser/GetPlayerSummaries/v0002/\"\n    params = {\"key\": api_key, \"steamids\": steam_id}\n\n    with get_adapter().get_requests_session() as sess:\n        resp = sess.get(api_base + method, params=params)\n        resp.raise_for_status()\n        data = resp.json()\n\n    playerlist = data.get(\"response\", {}).get(\"players\", [])\n    return playerlist[0] if playerlist else {\"steamid\": steam_id}\n\n\nclass SteamOpenIDProvider(OpenIDProvider):\n    id = \"steam\"\n    name = \"Steam\"\n    account_class = SteamAccount\n    uses_apps = True\n    supports_redirect = True\n\n    def __init__(self, request, app=None):\n        if app is None:\n            app = get_adapter().get_app(request, self.id)\n        super().__init__(request, app=app)\n\n    def get_login_url(self, request, **kwargs):\n        url = reverse(\"steam_login\")\n        if kwargs:\n            url += f\"?{urlencode(kwargs)}\"\n        return url\n\n    def sociallogin_from_response(self, request, response):\n        steam_id = extract_steam_id(response.identity_url)\n        steam_api_key = self.app.secret\n        response._extra = request_steam_account_summary(steam_api_key, steam_id)\n        return super().sociallogin_from_response(request, response)\n\n    def extract_uid(self, response):\n        return response._extra[\"steamid\"]\n\n    def extract_extra_data(self, response):\n        return response._extra.copy()\n\n    def extract_common_fields(self, response):\n        full_name = response._extra.get(\"realname\", \"\").strip()\n        if full_name.count(\" \") == 1:\n            first_name, last_name = full_name.split()\n        else:\n            first_name, last_name = full_name, \"\"\n\n        username = response._extra.get(\"personaname\", \"\")\n\n        return {\n            \"username\": username or response._extra[\"steamid\"],\n            \"first_name\": first_name,\n            \"last_name\": last_name,\n            \"full_name\": full_name,\n        }\n\n    def get_realm(self, request):\n        return self.get_settings().get(\"REALM\", request.build_absolute_uri(\"/\"))\n\n    def redirect(self, request, process, next_url=None, data=None, **kwargs):\n        endpoint = STEAM_OPENID_URL\n        realm = self.get_realm(request)\n        try:\n            client = _openid_consumer(request, self, endpoint)\n            auth_request = client.begin(endpoint)\n        except (UnicodeDecodeError, DiscoveryFailure) as e:\n            return render_authentication_error(request, self, exception=e)\n\n        self.stash_redirect_state(request, process, next_url, data, **kwargs)\n\n        redirect_url = auth_request.redirectURL(\n            realm, request.build_absolute_uri(reverse(\"steam_callback\"))\n        )\n        return HttpResponseRedirect(redirect_url)\n\n\nprovider_classes = [SteamOpenIDProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/steam/urls.py",
    "content": "from django.urls import path\n\nfrom . import views\n\n\nurlpatterns = [\n    path(\"steam/login/\", views.steam_login, name=\"steam_login\"),\n    path(\"steam/callback/\", views.steam_callback, name=\"steam_callback\"),\n]\n"
  },
  {
    "path": "allauth/socialaccount/providers/steam/views.py",
    "content": "\"\"\"\nOpenID Adapter for Steam\n\nThe Steam login API is simple OpenID but requires extra API calls\nfor basic resources such as usernames.\n\nResources:\n\n* Steam Web API Documentation\n    https://steamcommunity.com/dev\n\n* Steam Partner API documentation\n    https://partner.steamgames.com/doc/features/auth#website\n\"\"\"\n\nfrom django.utils.decorators import method_decorator\n\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.socialaccount.providers.base.views import BaseLoginView\nfrom allauth.socialaccount.providers.openid.views import OpenIDCallbackView\nfrom allauth.socialaccount.providers.steam.provider import SteamOpenIDProvider\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass SteamOpenIDLoginView(BaseLoginView):\n    provider_id = SteamOpenIDProvider.id\n\n\nclass SteamOpenIDCallbackView(OpenIDCallbackView):\n    provider_class = SteamOpenIDProvider\n\n\nsteam_login = SteamOpenIDLoginView.as_view()\nsteam_callback = SteamOpenIDCallbackView.as_view()\n"
  },
  {
    "path": "allauth/socialaccount/providers/stocktwits/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/stocktwits/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.stocktwits.views import StocktwitsOAuth2Adapter\n\n\nclass StocktwitsAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"user\", {}).get(\"avatar_url_ssl\")\n\n    def get_user_data(self):\n        return self.account.extra_data.get(\"user\", {})\n\n\nclass StocktwitsProvider(OAuth2Provider):\n    id = \"stocktwits\"\n    name = \"Stocktwits\"\n    account_class = StocktwitsAccount\n    oauth2_adapter_class = StocktwitsOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"user\"][\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            full_name=data.get(\"user\", {}).get(\"name\"),\n        )\n\n\nprovider_classes = [StocktwitsProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/stocktwits/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.stocktwits.provider import StocktwitsProvider\n\n\nurlpatterns = default_urlpatterns(StocktwitsProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/stocktwits/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass StocktwitsOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"stocktwits\"\n    access_token_url = \"https://api.stocktwits.com/api/2/oauth/token\"  # nosec\n    authorize_url = \"https://api.stocktwits.com/api/2/oauth/authorize\"\n    profile_url = \"https://api.stocktwits.com/api/2/streams/user/{user}.json\"\n    scope_delimiter = \",\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        user_id = kwargs.get(\"response\").get(\"user_id\")\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url.format(user=user_id))\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(StocktwitsOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(StocktwitsOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/strava/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/strava/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.strava.views import StravaOAuth2Adapter\n\n\nclass StravaAccount(ProviderAccount):\n    def get_profile_url(self):\n        id = self.account.extra_data.get(\"id\")\n        if id:\n            return f\"https://www.strava.com/athletes/{id}\"\n        return None\n\n    def get_avatar_url(self):\n        avatar = self.account.extra_data.get(\"profile\")\n        if avatar and avatar != \"avatar/athlete/large.png\":\n            return avatar\n        return None\n\n\nclass StravaProvider(OAuth2Provider):\n    id = \"strava\"\n    name = \"Strava\"\n    account_class = StravaAccount\n    oauth2_adapter_class = StravaOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        extra_common = super().extract_common_fields(data)\n        firstname = data.get(\"firstname\")\n        lastname = data.get(\"lastname\")\n        name = \" \".join(part for part in (firstname, lastname) if part)\n        extra_common.update(\n            username=data.get(\"username\"),\n            email=data.get(\"email\"),\n            first_name=firstname,\n            last_name=lastname,\n            name=name.strip(),\n        )\n        return extra_common\n\n    def get_default_scope(self):\n        return [\"read,activity:read\"]\n\n\nprovider_classes = [StravaProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/strava/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.strava.provider import StravaProvider\n\n\nurlpatterns = default_urlpatterns(StravaProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/strava/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass StravaOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"strava\"\n    access_token_url = \"https://www.strava.com/oauth/token\"  # nosec\n    authorize_url = \"https://www.strava.com/oauth/authorize\"\n    profile_url = \"https://www.strava.com/api/v3/athlete\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(StravaOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(StravaOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/stripe/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/stripe/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.stripe.views import StripeOAuth2Adapter\n\n\nclass StripeAccount(ProviderAccount):\n    def to_str(self):\n        default = super().to_str()\n        email = self.account.extra_data.get(\"email\")\n        business = self.account.extra_data.get(\"business_name\")\n        if business:\n            return f\"{email or default} ({business})\"\n        else:\n            return email or default\n\n\nclass StripeProvider(OAuth2Provider):\n    id = \"stripe\"\n    name = \"Stripe\"\n    account_class = StripeAccount\n    oauth2_adapter_class = StripeOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"id\"]\n\n    def extract_common_fields(self, data):\n        return dict(name=data.get(\"display_name\"), email=data.get(\"email\"))\n\n    def get_default_scope(self):\n        return [\"read_only\"]\n\n\nprovider_classes = [StripeProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/stripe/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.stripe.provider import StripeProvider\n\n\nurlpatterns = default_urlpatterns(StripeProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/stripe/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass StripeOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"stripe\"\n    access_token_url = \"https://connect.stripe.com/oauth/token\"  # nosec\n    authorize_url = \"https://connect.stripe.com/oauth/authorize\"\n    profile_url = \"https://api.stripe.com/v1/accounts/%s\"\n\n    def complete_login(self, request, app, token, response, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            url = self.profile_url % response.get(\"stripe_user_id\")\n            resp = sess.get(url, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(StripeOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(StripeOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/telegram/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/telegram/provider.py",
    "content": "from django.http import HttpResponseRedirect\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nfrom allauth.socialaccount.providers.base import Provider, ProviderAccount\n\n\nclass TelegramAccount(ProviderAccount):\n    pass\n\n\nclass TelegramProvider(Provider):\n    id = \"telegram\"\n    name = \"Telegram\"\n    account_class = TelegramAccount\n    supports_redirect = True\n\n    def get_login_url(self, request, **kwargs):\n        url = reverse(\"telegram_login\")\n        if kwargs:\n            url = f\"{url}?{urlencode(kwargs)}\"\n        return url\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        ret = {}\n        if data.get(\"first_name\"):\n            ret[\"first_name\"] = data.get(\"first_name\")\n        if data.get(\"last_name\"):\n            ret[\"last_name\"] = data.get(\"last_name\")\n        if data.get(\"username\"):\n            ret[\"username\"] = data.get(\"username\")\n        return ret\n\n    def get_auth_date_validity(self):\n        auth_date_validity = 30\n        settings = self.get_settings()\n        if \"AUTH_PARAMS\" in settings:\n            auth_date_validity = settings.get(\"AUTH_PARAMS\").get(\n                \"auth_date_validity\", auth_date_validity\n            )\n        auth_date_validity = self.app.settings.get(\n            \"auth_date_validity\", auth_date_validity\n        )\n        return auth_date_validity\n\n    def redirect(self, request, process, next_url=None, data=None, **kwargs):\n        state = self.stash_redirect_state(request, process, next_url, data, **kwargs)\n        return_to = request.build_absolute_uri(\n            f\"{reverse('telegram_callback')}?{urlencode({'state': state})}\"\n        )\n        url = \"https://oauth.telegram.org/auth?\" + urlencode(\n            {\n                \"origin\": request.build_absolute_uri(\"/\"),\n                \"bot_id\": self.app.client_id,\n                \"request_access\": \"write\",\n                \"embed\": \"0\",\n                \"return_to\": return_to,\n            }\n        )\n        return HttpResponseRedirect(url)\n\n\nprovider_classes = [TelegramProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/telegram/static/telegram/js/telegram.js",
    "content": "/* global document, window */\n(function () {\n  'use strict'\n  const f = document.createElement('form')\n  f.method = 'POST'\n  f.action = ''\n\n  const fragment = window.location.hash.substr(1)\n  const fragmentParams = new URLSearchParams(fragment)\n  for (const param of fragmentParams) {\n    const d = document.createElement('input')\n    d.type = 'hidden'\n    d.name = param[0]\n    d.value = param[1]\n    f.appendChild(d)\n  }\n  document.body.appendChild(f)\n  f.submit()\n})()\n"
  },
  {
    "path": "allauth/socialaccount/providers/telegram/templates/telegram/callback.html",
    "content": "{% load static %}\n<html>\n    <body>\n        <script src=\"{% static 'telegram/js/telegram.js' %}\"></script>\n    </body>\n</html>\n"
  },
  {
    "path": "allauth/socialaccount/providers/telegram/urls.py",
    "content": "from django.urls import path\n\nfrom . import views\n\n\nurlpatterns = [\n    path(\"telegram/login/\", views.login, name=\"telegram_login\"),\n    path(\"telegram/login/callback/\", views.callback, name=\"telegram_callback\"),\n]\n"
  },
  {
    "path": "allauth/socialaccount/providers/telegram/views.py",
    "content": "import base64\nimport binascii\nimport hashlib\nimport hmac\nimport json\nimport time\n\nfrom django.shortcuts import render\nfrom django.utils.decorators import method_decorator\nfrom django.views import View\nfrom django.views.decorators.csrf import csrf_exempt\n\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.helpers import (\n    complete_social_login,\n    render_authentication_error,\n)\nfrom allauth.socialaccount.providers.base.views import BaseLoginView\nfrom allauth.socialaccount.providers.telegram.provider import TelegramProvider\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass LoginView(BaseLoginView):\n    provider_id = TelegramProvider.id\n\n\nlogin = LoginView.as_view()\n\n\n@method_decorator(csrf_exempt, name=\"dispatch\")\n@method_decorator(login_not_required, name=\"dispatch\")\nclass CallbackView(View):\n    def get(self, request):\n        return render(request, \"telegram/callback.html\")\n\n    def post(self, request):\n        adapter = get_adapter()\n        provider = adapter.get_provider(request, TelegramProvider.id)\n\n        state_id = request.GET.get(\"state\")\n        if not state_id:\n            return render_authentication_error(\n                request,\n                provider=provider,\n            )\n\n        try:\n            result = request.POST.get(\"tgAuthResult\")\n            padding = \"=\" * (4 - (len(result) % 4))\n            data = json.loads(base64.b64decode(result + padding))\n            if not isinstance(data, dict) or \"hash\" not in data:\n                raise ValueError(\"Invalid tgAuthResult\")\n        except (binascii.Error, json.JSONDecodeError, ValueError) as e:\n            return render_authentication_error(\n                request,\n                provider=provider,\n                exception=e,\n                extra_context={\"state_id\": state_id},\n            )\n        hash = data.pop(\"hash\")\n        payload = \"\\n\".join(sorted([f\"{k}={v}\" for k, v in data.items()]))\n        token = provider.app.secret\n        token_sha256 = hashlib.sha256(token.encode()).digest()\n        expected_hash = hmac.new(\n            token_sha256, payload.encode(), hashlib.sha256\n        ).hexdigest()\n        auth_date = int(data.pop(\"auth_date\"))\n        auth_date_validity = provider.get_auth_date_validity()\n        if hash != expected_hash or time.time() - auth_date > auth_date_validity:\n            return render_authentication_error(\n                request,\n                provider=provider,\n                extra_context={\"response\": data, \"state_id\": state_id},\n            )\n        login = provider.sociallogin_from_response(request, data)\n        login.state = provider.unstash_redirect_state(request, state_id)\n        return complete_social_login(request, login)\n\n\ncallback = CallbackView.as_view()\n"
  },
  {
    "path": "allauth/socialaccount/providers/tiktok/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/tiktok/client.py",
    "content": "from allauth.socialaccount.providers.oauth2.client import OAuth2Client\n\n\nclass TikTokOAuth2Client(OAuth2Client):\n    client_id_parameter = \"client_key\"\n"
  },
  {
    "path": "allauth/socialaccount/providers/tiktok/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.tiktok.scope import TikTokScope\nfrom allauth.socialaccount.providers.tiktok.views import TikTokOAuth2Adapter\n\n\nclass TikTokAccount(ProviderAccount):\n    def get_username(self):\n        return self.account.extra_data.get(\"username\")\n\n    def get_display_name(self):\n        return self.account.extra_data.get(\"display_name\")\n\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"profile_deep_link\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"avatar_url\")\n\n\nclass TikTokProvider(OAuth2Provider):\n    id = \"tiktok\"\n    name = \"TikTok\"\n    account_class = TikTokAccount\n    oauth2_adapter_class = TikTokOAuth2Adapter\n    pkce_enabled_default = False\n\n    def extract_uid(self, data):\n        return str(data[\"open_id\"])\n\n    def extract_common_fields(self, data):\n        # TikTok does not provide an email address\n        return {\n            \"username\": data.get(\"username\") or data.get(\"display_name\"),\n            \"name\": data.get(\"display_name\"),\n        }\n\n    def get_default_scope(self):\n        # Requires LoginKit and Scopes with user.info.basic and user.info.profile enabled\n        return [TikTokScope.user_info_basic.value, TikTokScope.user_info_profile.value]\n\n\nprovider_classes = [TikTokProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/tiktok/scope.py",
    "content": "from enum import Enum\n\n\nclass TikTokScope(Enum):\n    user_info_basic = \"user.info.basic\"\n    user_info_profile = \"user.info.profile\"\n"
  },
  {
    "path": "allauth/socialaccount/providers/tiktok/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.tiktok.provider import TikTokProvider\n\n\nurlpatterns = default_urlpatterns(TikTokProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/tiktok/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\nfrom allauth.socialaccount.providers.tiktok.client import TikTokOAuth2Client\nfrom allauth.socialaccount.providers.tiktok.scope import TikTokScope\n\n\nclass TikTokOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"tiktok\"\n    access_token_url = \"https://open.tiktokapis.com/v2/oauth/token/\"  # nosec\n    authorize_url = \"https://www.tiktok.com/v2/auth/authorize/\"\n    # https://developers.tiktok.com/doc/tiktok-api-v2-get-user-info/\n    profile_url = \"https://open.tiktokapis.com/v2/user/info/\"\n    client_class = TikTokOAuth2Client\n    scope_delimiter = \",\"\n\n    def get_query_fields(self):\n        fields = []\n        if TikTokScope.user_info_basic.value in self.get_provider().get_scope():\n            fields += [\"open_id\", \"display_name\", \"avatar_url\"]\n        if TikTokScope.user_info_profile.value in self.get_provider().get_scope():\n            fields += [\"username\", \"profile_deep_link\"]\n        return \",\".join(fields)\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\n            \"Authorization\": f\"Bearer {token.token}\",\n            \"Client-ID\": app.client_id,\n        }\n        with get_adapter().get_requests_session() as sess:\n            params = {\"fields\": self.get_query_fields()}\n            response = sess.get(self.profile_url, headers=headers, params=params)\n            response.raise_for_status()\n            data = response.json()\n\n        user_info = data.get(\"data\", {}).get(\"user\")\n        return self.get_provider().sociallogin_from_response(request, user_info)\n\n\noauth2_login = OAuth2LoginView.adapter_view(TikTokOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(TikTokOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/trainingpeaks/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/trainingpeaks/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.trainingpeaks.views import (\n    TrainingPeaksOAuth2Adapter,\n)\n\n\nclass TrainingPeaksAccount(ProviderAccount):\n    def get_profile_url(self):\n        return \"https://app.trainingpeaks.com\"\n\n    def get_avatar_url(self):\n        return None\n\n\nclass TrainingPeaksProvider(OAuth2Provider):\n    id = \"trainingpeaks\"\n    name = \"TrainingPeaks\"\n    account_class = TrainingPeaksAccount\n    oauth2_adapter_class = TrainingPeaksOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"Id\"])\n\n    def extract_common_fields(self, data):\n        extra_common = super().extract_common_fields(data)\n        firstname = data.get(\"FirstName\")\n        lastname = data.get(\"LastName\")\n        # fallback username as there is actually no Username in response\n        username = f\"{firstname.strip().lower()}.{lastname.strip().lower()}\"\n        name = \" \".join(part for part in (firstname, lastname) if part)\n        extra_common.update(\n            username=data.get(\"username\", username),\n            email=data.get(\"Email\"),\n            first_name=firstname,\n            last_name=lastname,\n            name=name.strip(),\n        )\n        return extra_common\n\n    def get_default_scope(self):\n        return [\"athlete:profile\"]\n\n\nprovider_classes = [TrainingPeaksProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/trainingpeaks/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.trainingpeaks.provider import TrainingPeaksProvider\n\n\nurlpatterns = default_urlpatterns(TrainingPeaksProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/trainingpeaks/views.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass TrainingPeaksOAuth2Adapter(OAuth2Adapter):\n    # https://github.com/TrainingPeaks/PartnersAPI/wiki/OAuth\n    provider_id = \"trainingpeaks\"\n\n    def get_settings(self):\n        \"\"\"Provider settings\"\"\"\n        return app_settings.PROVIDERS.get(self.provider_id, {})\n\n    def get_hostname(self):\n        \"\"\"Return hostname depending on sandbox setting\"\"\"\n        settings = self.get_settings()\n        if settings.get(\"USE_PRODUCTION\"):\n            return \"trainingpeaks.com\"\n        return \"sandbox.trainingpeaks.com\"\n\n    @property\n    def access_token_url(self):\n        return f\"https://oauth.{self.get_hostname()}/oauth/token\"\n\n    @property\n    def authorize_url(self):\n        return f\"https://oauth.{self.get_hostname()}/OAuth/Authorize\"\n\n    @property\n    def profile_url(self):\n        return f\"https://api.{self.get_hostname()}/v1/athlete/profile\"\n\n    @property\n    def api_hostname(self):\n        \"\"\"Return https://api.hostname.tld\"\"\"\n        return f\"https://api.{self.get_hostname()}\"\n\n    # https://oauth.sandbox.trainingpeaks.com/oauth/deauthorize\n\n    scope_delimiter = \" \"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, headers=headers)\n            response.raise_for_status()\n            extra_data = response.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(TrainingPeaksOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(TrainingPeaksOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/trello/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/trello/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth.provider import OAuthProvider\nfrom allauth.socialaccount.providers.trello.views import TrelloOAuthAdapter\n\n\nclass TrelloAccount(ProviderAccount):\n    def get_profile_url(self):\n        return None\n\n    def get_avatar_url(self):\n        return None\n\n\nclass TrelloProvider(OAuthProvider):\n    id = \"trello\"\n    name = \"Trello\"\n    account_class = TrelloAccount\n    oauth_adapter_class = TrelloOAuthAdapter\n\n    def get_default_scope(self):\n        return [\"read\"]\n\n    def extract_uid(self, data):\n        return data[\"id\"]\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            username=data.get(\"username\"),\n            name=data.get(\"name\"),\n        )\n\n    def get_auth_params_from_request(self, request, action):\n        data = super().get_auth_params_from_request(request, action)\n        data[\"type\"] = \"web_server\"\n        data[\"name\"] = self.app.name\n        # define here for how long it will be, this can be configured on the\n        # social app\n        data[\"expiration\"] = \"never\"\n        return data\n\n\nprovider_classes = [TrelloProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/trello/urls.py",
    "content": "from allauth.socialaccount.providers.oauth.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.trello.provider import TrelloProvider\n\n\nurlpatterns = default_urlpatterns(TrelloProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/trello/views.py",
    "content": "from django.utils.http import urlencode\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth.views import (\n    OAuthAdapter,\n    OAuthCallbackView,\n    OAuthLoginView,\n)\n\n\nclass TrelloOAuthAdapter(OAuthAdapter):\n    provider_id = \"trello\"\n    request_token_url = \"https://trello.com/1/OAuthGetRequestToken\"  # nosec\n    authorize_url = \"https://trello.com/1/OAuthAuthorizeToken\"\n    access_token_url = \"https://trello.com/1/OAuthGetAccessToken\"  # nosec\n\n    def complete_login(self, request, app, token, response):\n        # we need to get the member id and the other information\n        info_url = \"{base}?{query}\".format(\n            base=\"https://api.trello.com/1/members/me\",\n            query=urlencode({\"key\": app.key, \"token\": response.get(\"oauth_token\")}),\n        )\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(info_url)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth_login = OAuthLoginView.adapter_view(TrelloOAuthAdapter)\noauth_callback = OAuthCallbackView.adapter_view(TrelloOAuthAdapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/tumblr/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/tumblr/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth.provider import OAuthProvider\nfrom allauth.socialaccount.providers.tumblr.views import TumblrOAuthAdapter\n\n\nclass TumblrAccount(ProviderAccount):\n    def get_profile_url_(self):\n        return f\"https://{self.account.extra_data.get('name')}.tumblr.com/\"\n\n\nclass TumblrProvider(OAuthProvider):\n    id = \"tumblr\"\n    name = \"Tumblr\"\n    account_class = TumblrAccount\n    oauth_adapter_class = TumblrOAuthAdapter\n\n    def extract_uid(self, data):\n        return data[\"name\"]\n\n    def extract_common_fields(self, data):\n        return dict(\n            first_name=data.get(\"name\"),\n        )\n\n\nprovider_classes = [TumblrProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/tumblr/urls.py",
    "content": "from allauth.socialaccount.providers.oauth.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.tumblr.provider import TumblrProvider\n\n\nurlpatterns = default_urlpatterns(TumblrProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/tumblr/views.py",
    "content": "from allauth.socialaccount.providers.oauth.client import OAuth\nfrom allauth.socialaccount.providers.oauth.views import (\n    OAuthAdapter,\n    OAuthCallbackView,\n    OAuthLoginView,\n)\n\n\nclass TumblrAPI(OAuth):\n    url = \"https://api.tumblr.com/v2/user/info\"\n\n    def get_user_info(self):\n        data = self.query(self.url).json()\n        return data[\"response\"][\"user\"]\n\n\nclass TumblrOAuthAdapter(OAuthAdapter):\n    provider_id = \"tumblr\"\n    request_token_url = \"https://www.tumblr.com/oauth/request_token\"  # nosec\n    access_token_url = \"https://www.tumblr.com/oauth/access_token\"  # nosec\n    authorize_url = \"https://www.tumblr.com/oauth/authorize\"\n\n    def complete_login(self, request, app, token, response):\n        client = TumblrAPI(request, app.client_id, app.secret, self.request_token_url)\n        extra_data = client.get_user_info()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth_login = OAuthLoginView.adapter_view(TumblrOAuthAdapter)\noauth_callback = OAuthCallbackView.adapter_view(TumblrOAuthAdapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/tumblr_oauth2/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/tumblr_oauth2/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.tumblr_oauth2.views import TumblrOAuth2Adapter\n\n\nclass TumblrAccount(ProviderAccount):\n    def get_profile_url(self):\n        return f\"https://{self.account.extra_data.get('name')}.tumblr.com/\"\n\n\nclass TumblrOAuth2Provider(OAuth2Provider):\n    id = \"tumblr_oauth2\"\n    name = \"Tumblr\"\n    account_class = TumblrAccount\n    oauth2_adapter_class = TumblrOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"name\"]\n\n    def extract_common_fields(self, data):\n        return dict(\n            first_name=data.get(\"name\"),\n        )\n\n    def get_default_scope(self):\n        return [\"read\"]\n\n\nprovider_classes = [TumblrOAuth2Provider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/tumblr_oauth2/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.tumblr_oauth2.provider import TumblrOAuth2Provider\n\n\nurlpatterns = default_urlpatterns(TumblrOAuth2Provider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/tumblr_oauth2/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass TumblrOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"tumblr_oauth2\"\n    access_token_url = \"https://api.tumblr.com/v2/oauth2/token\"  # nosec: B105\n    authorize_url = \"https://www.tumblr.com/oauth2/authorize\"\n    profile_url = \"https://api.tumblr.com/v2/user/info\"\n\n    def complete_login(self, request, app, token, response):\n        extra_data = self.get_user_info(token)\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n    def get_user_info(self, token):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            return resp.json()[\"response\"][\"user\"]\n\n\noauth2_login = OAuth2LoginView.adapter_view(TumblrOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(TumblrOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/twentythreeandme/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/twentythreeandme/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.twentythreeandme.views import (\n    TwentyThreeAndMeOAuth2Adapter,\n)\n\n\nclass TwentyThreeAndMeAccount(ProviderAccount):\n    pass\n\n\nclass TwentyThreeAndMeProvider(OAuth2Provider):\n    id = \"twentythreeandme\"\n    slug = \"23andme\"\n    name = \"23andMe\"\n    account_class = TwentyThreeAndMeAccount\n    oauth2_adapter_class = TwentyThreeAndMeOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"id\"]\n\n    def get_default_scope(self):\n        scope = [\"basic\"]\n        return scope\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n        )\n\n\nprovider_classes = [TwentyThreeAndMeProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/twentythreeandme/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.twentythreeandme.provider import (\n    TwentyThreeAndMeProvider,\n)\n\n\nurlpatterns = default_urlpatterns(TwentyThreeAndMeProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/twentythreeandme/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass TwentyThreeAndMeOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"twentythreeandme\"\n    access_token_url = \"https://api.23andme.com/token\"  # nosec\n    authorize_url = \"https://api.23andme.com/authorize\"\n    profile_url = \"https://api.23andme.com/1/user/\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(TwentyThreeAndMeOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(TwentyThreeAndMeOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/twitch/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/twitch/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.twitch.views import TwitchOAuth2Adapter\n\n\nclass TwitchAccount(ProviderAccount):\n    def get_profile_url(self):\n        return f\"https://twitch.tv/{self.account.extra_data.get('login')}\"\n\n    def get_avatar_url(self):\n        # We're using `logo` as a failback for legacy profiles retrieved\n        # with the old https://api.twitch.tv/kraken/user endpoint.\n        logo = self.account.extra_data.get(\"logo\")\n        return self.account.extra_data.get(\"profile_image_url\", logo)\n\n    def to_str(self):\n        dflt = super().to_str()\n        return self.account.extra_data.get(\"login\", dflt)\n\n\nclass TwitchProvider(OAuth2Provider):\n    id = \"twitch\"\n    name = \"Twitch\"\n    account_class = TwitchAccount\n    oauth2_adapter_class = TwitchOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return {\n            \"username\": data.get(\"login\"),\n            \"name\": data.get(\"display_name\"),\n            \"email\": data.get(\"email\"),\n        }\n\n    def get_default_scope(self):\n        return [\"user:read:email\"]\n\n\nprovider_classes = [TwitchProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/twitch/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.twitch.provider import TwitchProvider\n\n\nurlpatterns = default_urlpatterns(TwitchProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/twitch/views.py",
    "content": "from http import HTTPStatus\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass TwitchOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"twitch\"\n    access_token_url = \"https://id.twitch.tv/oauth2/token\"  # nosec\n    authorize_url = \"https://id.twitch.tv/oauth2/authorize\"\n    profile_url = \"https://api.twitch.tv/helix/users\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\n            \"Authorization\": f\"Bearer {token.token}\",\n            \"Client-ID\": app.client_id,\n        }\n        with get_adapter().get_requests_session() as sess:\n            response = sess.get(self.profile_url, headers=headers)\n            data = response.json()\n            if response.status_code >= HTTPStatus.BAD_REQUEST:\n                error = data.get(\"error\", \"\")\n                message = data.get(\"message\", \"\")\n                raise OAuth2Error(f\"Twitch API Error: {error} ({message})\")\n\n        try:\n            user_info = data.get(\"data\", [])[0]\n        except IndexError:\n            raise OAuth2Error(f\"Invalid data from Twitch API: {data}\")\n\n        if \"id\" not in user_info:\n            raise OAuth2Error(f\"Invalid data from Twitch API: {user_info}\")\n\n        return self.get_provider().sociallogin_from_response(request, user_info)\n\n\noauth2_login = OAuth2LoginView.adapter_view(TwitchOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(TwitchOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/twitter/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/twitter/provider.py",
    "content": "from allauth.socialaccount.providers.base import AuthAction, ProviderAccount\nfrom allauth.socialaccount.providers.oauth.provider import OAuthProvider\nfrom allauth.socialaccount.providers.twitter.views import TwitterOAuthAdapter\n\n\nclass TwitterAccount(ProviderAccount):\n    def get_screen_name(self):\n        \"\"\"The screen name is the username of the Twitter account.\"\"\"\n        return self.account.extra_data.get(\"screen_name\")\n\n    def get_profile_url(self):\n        ret = None\n        screen_name = self.get_screen_name()\n        if screen_name:\n            ret = f\"https://x.com/{screen_name}\"\n        return ret\n\n    def get_avatar_url(self):\n        ret = None\n        profile_image_url = self.account.extra_data.get(\"profile_image_url\")\n        if profile_image_url:\n            # Hmm, hack to get our hands on the large image.  Not\n            # really documented, but seems to work.\n            ret = profile_image_url.replace(\"_normal\", \"\")\n        return ret\n\n    def to_str(self):\n        screen_name = self.get_screen_name()\n        return screen_name or super().to_str()\n\n\nclass TwitterProvider(OAuthProvider):\n    id = \"twitter\"\n    name = \"X\"\n    account_class = TwitterAccount\n    oauth_adapter_class = TwitterOAuthAdapter\n\n    def get_auth_url(self, request, action):\n        if action == AuthAction.REAUTHENTICATE:\n            url = \"https://api.x.com/oauth/authorize\"\n        else:\n            url = \"https://api.x.com/oauth/authenticate\"\n        return url\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            username=data.get(\"screen_name\"),\n            name=data.get(\"name\"),\n            email=data.get(\"email\"),\n        )\n\n\nprovider_classes = [TwitterProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/twitter/urls.py",
    "content": "from allauth.socialaccount.providers.oauth.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.twitter.provider import TwitterProvider\n\n\nurlpatterns = default_urlpatterns(TwitterProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/twitter/views.py",
    "content": "from allauth.socialaccount.app_settings import QUERY_EMAIL\nfrom allauth.socialaccount.providers.oauth.client import OAuth\nfrom allauth.socialaccount.providers.oauth.views import (\n    OAuthAdapter,\n    OAuthCallbackView,\n    OAuthLoginView,\n)\n\n\nclass TwitterAPI(OAuth):\n    \"\"\"\n    Verifying twitter credentials\n    \"\"\"\n\n    _base_url = \"https://api.x.com/1.1/account/verify_credentials.json\"\n    url = f\"{_base_url}?include_email=true\" if QUERY_EMAIL else _base_url\n\n    def get_user_info(self):\n        user = self.query(self.url).json()\n        return user\n\n\nclass TwitterOAuthAdapter(OAuthAdapter):\n    provider_id = \"twitter\"\n    request_token_url = \"https://api.x.com/oauth/request_token\"  # nosec\n    access_token_url = \"https://api.x.com/oauth/access_token\"  # nosec\n    # Issue #42 -- this one authenticates over and over again...\n    # authorize_url = 'https://api.twitter.com/oauth/authorize'\n    authorize_url = \"https://api.x.com/oauth/authenticate\"\n\n    def complete_login(self, request, app, token, response):\n        client = TwitterAPI(request, app.client_id, app.secret, self.request_token_url)\n        extra_data = client.get_user_info()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth_login = OAuthLoginView.adapter_view(TwitterOAuthAdapter)\noauth_callback = OAuthCallbackView.adapter_view(TwitterOAuthAdapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/twitter_oauth2/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/twitter_oauth2/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.twitter_oauth2.views import TwitterOAuth2Adapter\n\n\nclass TwitterOAuth2Account(ProviderAccount):\n    def get_username(self):\n        return self.account.extra_data.get(\"username\")\n\n    def get_profile_url(self):\n        username = self.get_username()\n        if username:\n            return f\"https://x.com/{username}\"\n        return None\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"profile_image_url\")\n\n\nclass TwitterOAuth2Provider(OAuth2Provider):\n    id = \"twitter_oauth2\"\n    name = \"X\"\n    account_class = TwitterOAuth2Account\n    oauth2_adapter_class = TwitterOAuth2Adapter\n    pkce_enabled_default = True\n\n    def extract_uid(self, data):\n        return data[\"id\"]\n\n    def extract_common_fields(self, data):\n        return dict(\n            name=data[\"name\"],\n            username=data[\"username\"],\n        )\n\n    def get_fields(self):\n        settings = self.get_settings()\n        default_fields = [\n            \"id\",\n            \"name\",\n            \"username\",\n            \"verified\",\n            \"profile_image_url\",\n            \"created_at\",\n        ]\n        return settings.get(\"FIELDS\", default_fields)\n\n    def get_default_scope(self):\n        return [\"users.read\", \"tweet.read\"]\n\n\nprovider_classes = [TwitterOAuth2Provider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/twitter_oauth2/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.twitter_oauth2.provider import (\n    TwitterOAuth2Provider,\n)\n\n\nurlpatterns = default_urlpatterns(TwitterOAuth2Provider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/twitter_oauth2/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass TwitterOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"twitter_oauth2\"\n    access_token_url = \"https://api.x.com/2/oauth2/token\"  # nosec\n    authorize_url = \"https://x.com/i/oauth2/authorize\"\n    profile_url = \"https://api.x.com/2/users/me\"\n    basic_auth = True\n\n    def complete_login(self, request, app, access_token, **kwargs):\n        extra_data = self.get_user_info(access_token)\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n    def get_user_info(self, token):\n        fields = self.get_provider().get_fields()\n        headers = {\n            **self.get_provider().get_settings().get(\"HEADERS\", {}),\n            \"Authorization\": f\"Bearer {token.token}\",\n        }\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(\n                url=self.profile_url,\n                params={\"user.fields\": \",\".join(fields)},\n                headers=headers,\n            )\n            resp.raise_for_status()\n            return resp.json()[\"data\"]\n\n\noauth2_login = OAuth2LoginView.adapter_view(TwitterOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(TwitterOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/untappd/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/untappd/client.py",
    "content": "from http import HTTPStatus\n\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Client, OAuth2Error\n\n\nclass UntappdOAuth2Client(OAuth2Client):\n    \"\"\"\n    Custom client because Untappd:\n        * uses redirect_url instead of redirect_uri\n        * nests access_token inside an extra 'response' object\n    \"\"\"\n\n    def get_access_token(self, code, pkce_code_verifier=None):\n        from allauth.socialaccount.providers.untappd.provider import UntappdProvider\n\n        data = {\n            \"client_id\": self.consumer_key,\n            \"redirect_url\": self.callback_url,\n            \"grant_type\": \"authorization_code\",\n            \"response_type\": \"code\",\n            \"client_secret\": self.consumer_secret,\n            \"code\": code,\n        }\n        params = None\n        self._strip_empty_keys(data)\n        url = self.access_token_url\n        if self.access_token_method == \"GET\":  # nosec\n            params = data\n            data = None\n        if data and pkce_code_verifier:\n            data[\"code_verifier\"] = pkce_code_verifier\n        # Allow custom User Agent to comply with Untappd API\n        settings = app_settings.PROVIDERS.get(UntappdProvider.id, {})\n        headers = {\"User-Agent\": settings.get(\"USER_AGENT\", \"django-allauth\")}\n        # TODO: Proper exception handling\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.request(\n                self.access_token_method,\n                url,\n                params=params,\n                data=data,\n                headers=headers,\n            )\n            access_token = None\n            if resp.status_code == HTTPStatus.OK:\n                access_token = resp.json()[\"response\"]\n            if not access_token or \"access_token\" not in access_token:\n                raise OAuth2Error(f\"Error retrieving access token: {resp.content}\")\n            return access_token\n"
  },
  {
    "path": "allauth/socialaccount/providers/untappd/provider.py",
    "content": "from django.urls import reverse\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.untappd.views import UntappdOAuth2Adapter\n\n\nclass UntappdAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"untappd_url\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"user_avatar\")\n\n    def get_user_data(self):\n        return self.account.extra_data.get(\"response\", {}).get(\"user\", {})\n\n\nclass UntappdProvider(OAuth2Provider):\n    id = \"untappd\"\n    name = \"Untappd\"\n    account_class = UntappdAccount\n    oauth2_adapter_class = UntappdOAuth2Adapter\n\n    def get_auth_params_from_request(self, request, action):\n        params = super().get_auth_params_from_request(request, action)\n        # Untappd uses redirect_url instead of redirect_uri\n        params[\"redirect_url\"] = request.build_absolute_uri(\n            reverse(f\"{self.id}_callback\")\n        )\n        return params\n\n    def extract_uid(self, data):\n        return str(data[\"response\"][\"user\"][\"uid\"])\n\n    def extract_common_fields(self, data):\n        user = data[\"response\"][\"user\"]\n        return dict(\n            username=user[\"user_name\"],\n            name=f\"{user['first_name']} {user['last_name']}\",\n        )\n\n    def extract_email_addresses(self, data):\n        ret = [\n            EmailAddress(\n                email=data[\"response\"][\"user\"][\"settings\"][\"email_address\"],\n                verified=True,\n                primary=True,\n            )\n        ]\n        return ret\n\n\nprovider_classes = [UntappdProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/untappd/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.untappd.provider import UntappdProvider\n\n\nurlpatterns = default_urlpatterns(UntappdProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/untappd/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\nfrom .client import UntappdOAuth2Client\n\n\nclass UntappdOAuth2Adapter(OAuth2Adapter):\n    client_class = UntappdOAuth2Client\n    provider_id = \"untappd\"\n    access_token_url = \"https://untappd.com/oauth/authorize/\"  # nosec\n    access_token_method = \"GET\"  # nosec\n    authorize_url = \"https://untappd.com/oauth/authenticate/\"\n    user_info_url = \"https://api.untappd.com/v4/user/info/\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.user_info_url, params={\"access_token\": token.token})\n            extra_data = resp.json()\n            # TODO: get and store the email from the user info json\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(UntappdOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(UntappdOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/vimeo/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/vimeo/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth.provider import OAuthProvider\nfrom allauth.socialaccount.providers.vimeo.views import VimeoOAuthAdapter\n\n\nclass VimeoAccount(ProviderAccount):\n    pass\n\n\nclass VimeoProvider(OAuthProvider):\n    id = \"vimeo\"\n    name = \"Vimeo\"\n    account_class = VimeoAccount\n    oauth_adapter_class = VimeoOAuthAdapter\n\n    def get_default_scope(self):\n        scope = []\n        return scope\n\n    def extract_uid(self, data):\n        return data[\"id\"]\n\n    def extract_common_fields(self, data):\n        return dict(name=data.get(\"display_name\"), username=data.get(\"username\"))\n\n\nprovider_classes = [VimeoProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/vimeo/urls.py",
    "content": "from allauth.socialaccount.providers.oauth.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.vimeo.provider import VimeoProvider\n\n\nurlpatterns = default_urlpatterns(VimeoProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/vimeo/views.py",
    "content": "from allauth.socialaccount.providers.oauth.client import OAuth\nfrom allauth.socialaccount.providers.oauth.views import (\n    OAuthAdapter,\n    OAuthCallbackView,\n    OAuthLoginView,\n)\n\n\nclass VimeoAPI(OAuth):\n    url = \"https://vimeo.com/api/rest/v2?method=vimeo.people.getInfo\"\n\n    def get_user_info(self):\n        url = self.url\n        data = self.query(url, params=dict(format=\"json\")).json()\n        return data[\"person\"]\n\n\nclass VimeoOAuthAdapter(OAuthAdapter):\n    provider_id = \"vimeo\"\n    request_token_url = \"https://vimeo.com/oauth/request_token\"  # nosec\n    access_token_url = \"https://vimeo.com/oauth/access_token\"  # nosec\n    authorize_url = \"https://vimeo.com/oauth/authorize\"\n\n    def complete_login(self, request, app, token, response):\n        client = VimeoAPI(request, app.client_id, app.secret, self.request_token_url)\n        extra_data = client.get_user_info()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth_login = OAuthLoginView.adapter_view(VimeoOAuthAdapter)\noauth_callback = OAuthCallbackView.adapter_view(VimeoOAuthAdapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/vimeo_oauth2/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/vimeo_oauth2/models.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/vimeo_oauth2/provider.py",
    "content": "\"\"\"\nProvider for Patreon\n\"\"\"\n\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.vimeo_oauth2.views import VimeoOAuth2Adapter\n\n\nclass VimeoOAuth2Account(ProviderAccount):\n    pass\n\n\nclass VimeoOAuth2Provider(OAuth2Provider):\n    id = \"vimeo_oauth2\"\n    name = \"Vimeo\"\n    account_class = VimeoOAuth2Account\n    oauth2_adapter_class = VimeoOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"public\", \"private\"]\n\n    def extract_uid(self, data):\n        return data.get(\"uri\").split(\"/\")[-1]\n\n    def extract_common_fields(self, data):\n        return {\n            \"fullname\": data.get(\"name\"),\n        }\n\n\nprovider_classes = [VimeoOAuth2Provider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/vimeo_oauth2/urls.py",
    "content": "\"\"\"URLs for Patreon Provider\"\"\"\n\nfrom allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.vimeo_oauth2.provider import VimeoOAuth2Provider\n\n\nurlpatterns = default_urlpatterns(VimeoOAuth2Provider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/vimeo_oauth2/views.py",
    "content": "\"\"\"\nViews for PatreonProvider\nhttps://www.patreon.com/platform/documentation/oauth\n\"\"\"\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass VimeoOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"vimeo_oauth2\"\n    access_token_url = \"https://api.vimeo.com/oauth/access_token\"  # nosec\n    authorize_url = \"https://api.vimeo.com/oauth/authorize\"\n    profile_url = \"https://api.vimeo.com/me/\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(VimeoOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(VimeoOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/vk/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/vk/provider.py",
    "content": "from allauth.socialaccount import app_settings\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.vk.views import VKOAuth2Adapter\n\n\nclass VKAccount(ProviderAccount):\n    def get_profile_url(self):\n        return f\"https://vk.ru/id{self.account.extra_data.get('id')}\"\n\n    def get_avatar_url(self):\n        ret = None\n        photo_big_url = self.account.extra_data.get(\"photo_big\")\n        photo_medium_url = self.account.extra_data.get(\"photo_medium\")\n        if photo_big_url:\n            return photo_big_url\n        elif photo_medium_url:\n            return photo_medium_url\n        else:\n            return ret\n\n\nclass VKProvider(OAuth2Provider):\n    id = \"vk\"\n    name = \"VK\"\n    account_class = VKAccount\n    oauth2_adapter_class = VKOAuth2Adapter\n    pkce_enabled_default = True\n\n    def get_default_scope(self):\n        scope = []\n        if app_settings.QUERY_EMAIL:\n            scope.append(\"email\")\n        return scope\n\n    def extract_uid(self, data):\n        return str(data[\"user_id\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"email\"),\n            last_name=data.get(\"last_name\"),\n            username=data.get(\"screen_name\"),\n            first_name=data.get(\"first_name\"),\n            phone=data.get(\"phone\"),\n        )\n\n\nprovider_classes = [VKProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/vk/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.vk.provider import VKProvider\n\n\nurlpatterns = default_urlpatterns(VKProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/vk/views.py",
    "content": "import uuid\nfrom requests import RequestException\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\nfrom allauth.utils import get_request_param\n\n\nclass VKOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"vk\"\n    access_token_url = \"https://id.vk.ru/oauth2/auth\"  # nosec\n    authorize_url = \"https://id.vk.ru/authorize\"\n    profile_url = \"https://id.vk.ru/oauth2/user_info\"\n\n    def get_access_token_data(self, request, app, client, pkce_code_verifier=None):\n        code = get_request_param(self.request, \"code\")\n        device_id = get_request_param(self.request, \"device_id\")\n        extra_data = {\n            # \"state\" isn't strictly necessary for now, but since VK ID documentation doesn't\n            # specify required vs optional parameters at all, we still add this (now optional)\n            # param to make the code less fragile for future, when they may start requiring it\n            \"state\": str(uuid.uuid4()),\n            \"device_id\": device_id,\n        }\n        data = client.get_access_token(\n            code, pkce_code_verifier=pkce_code_verifier, extra_data=extra_data\n        )\n        self.did_fetch_access_token = True\n        return data\n\n    def complete_login(self, request, app, token, **kwargs):\n        req_data = {\n            \"access_token\": token.token,\n            \"client_id\": app.client_id,\n        }\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.post(self.profile_url, data=req_data)\n            resp.raise_for_status()\n            resp_data = resp.json()\n        if \"error\" in resp_data or \"user\" not in resp_data:\n            raise RequestException(\n                \"Could not get basic data for user being authenticated\"\n            )\n        return self.get_provider().sociallogin_from_response(request, resp_data[\"user\"])\n\n\noauth2_login = OAuth2LoginView.adapter_view(VKOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(VKOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/wahoo/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/wahoo/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.wahoo.views import WahooOAuth2Adapter\n\n\nclass WahooAccount(ProviderAccount):\n    def get_profile_url(self):\n        return \"https://api.wahooligan.com/v1/user\"\n\n\nclass WahooProvider(OAuth2Provider):\n    id = \"wahoo\"\n    name = \"Wahoo\"\n    account_class = WahooAccount\n    oauth2_adapter_class = WahooOAuth2Adapter\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        extra_common = super().extract_common_fields(data)\n        extra_common.update(\n            # Additional properties we ignore: gender, created_at, updated_at\n            height=data.get(\"height\"),\n            weight=data.get(\"weight\"),\n            first=data.get(\"first\"),\n            last=data.get(\"last\"),\n            birth=data.get(\"birth\"),\n        )\n        return extra_common\n\n    def extract_email_addresses(self, data):\n        email = EmailAddress(\n            email=data.get(\"email\"),\n            primary=True,\n            verified=False,\n        )\n        return [email]\n\n    def get_default_scope(self):\n        scope = [\"user_read\"]\n        if app_settings.QUERY_EMAIL:\n            scope.append(\"email\")\n        return scope\n\n\nprovider_classes = [WahooProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/wahoo/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.wahoo.provider import WahooProvider\n\n\nurlpatterns = default_urlpatterns(WahooProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/wahoo/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass WahooOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"wahoo\"\n    access_token_url = \"https://api.wahooligan.com/oauth/token\"  # nosec\n    authorize_url = \"https://api.wahooligan.com/oauth/authorize\"\n    profile_url = \"https://api.wahooligan.com/v1/user\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(WahooOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(WahooOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/weibo/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/weibo/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount, ProviderException\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.weibo.views import WeiboOAuth2Adapter\n\n\nclass WeiboAccount(ProviderAccount):\n    def get_profile_url(self):\n        # profile_url = \"u/3195025850\"\n        return f\"https://www.weibo.com/{self.account.extra_data.get('profile_url')}\"\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"avatar_large\")\n\n\nclass WeiboProvider(OAuth2Provider):\n    id = \"weibo\"\n    name = \"Weibo\"\n    account_class = WeiboAccount\n    oauth2_adapter_class = WeiboOAuth2Adapter\n\n    def extract_uid(self, data):\n        ret = data.get(\"idstr\")\n        if not ret:\n            raise ProviderException(\"Missing 'idstr'\")\n        return ret\n\n    def extract_common_fields(self, data):\n        return dict(username=data.get(\"screen_name\"), name=data.get(\"name\"))\n\n\nprovider_classes = [WeiboProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/weibo/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.weibo.provider import WeiboProvider\n\n\nurlpatterns = default_urlpatterns(WeiboProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/weibo/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass WeiboOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"weibo\"\n    access_token_url = \"https://api.weibo.com/oauth2/access_token\"  # nosec\n    authorize_url = \"https://api.weibo.com/oauth2/authorize\"\n    profile_url = \"https://api.weibo.com/2/users/show.json\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        uid = kwargs.get(\"response\", {}).get(\"uid\")\n        with get_adapter().get_requests_session() as sess:\n            params = {\"access_token\": token.token, \"uid\": uid}\n            resp = sess.get(self.profile_url, params=params)\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(WeiboOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(WeiboOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/weixin/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/weixin/client.py",
    "content": "from collections import OrderedDict\nfrom http import HTTPStatus\n\nfrom django.utils.http import urlencode\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Client, OAuth2Error\n\n\nclass WeixinOAuth2Client(OAuth2Client):\n    def get_redirect_url(self, authorization_url, scope, extra_params):\n        scope = self.scope_delimiter.join(set(scope))\n        params = {\n            \"appid\": self.consumer_key,\n            \"redirect_uri\": self.callback_url,\n            \"scope\": scope,\n            \"response_type\": \"code\",\n        }\n        if self.state:\n            params[\"state\"] = self.state\n        params.update(extra_params)\n        sorted_params = OrderedDict()\n        for param in sorted(params):\n            sorted_params[param] = params[param]\n        return f\"{authorization_url}?{urlencode(sorted_params)}\"\n\n    def get_access_token(self, code, pkce_code_verifier=None):\n        data = {\n            \"appid\": self.consumer_key,\n            \"grant_type\": \"authorization_code\",\n            \"secret\": self.consumer_secret,\n            \"code\": code,\n        }\n        params = None\n        self._strip_empty_keys(data)\n        url = self.access_token_url\n        if self.access_token_method == \"GET\":  # nosec\n            params = data\n            data = None\n        if data and pkce_code_verifier:\n            data[\"code_verifier\"] = pkce_code_verifier\n        # TODO: Proper exception handling\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.request(self.access_token_method, url, params=params, data=data)\n            access_token = None\n            if resp.status_code == HTTPStatus.OK:\n                access_token = resp.json()\n            if not access_token or \"access_token\" not in access_token:\n                raise OAuth2Error(f\"Error retrieving access token: {resp.content}\")\n            return access_token\n"
  },
  {
    "path": "allauth/socialaccount/providers/weixin/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.weixin.views import WeixinOAuth2Adapter\n\n\nclass WeixinAccount(ProviderAccount):\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"headimgurl\")\n\n    def to_str(self):\n        return self.account.extra_data.get(\"nickname\", super().to_str())\n\n\nclass WeixinProvider(OAuth2Provider):\n    id = \"weixin\"\n    name = \"Weixin\"\n    account_class = WeixinAccount\n    oauth2_adapter_class = WeixinOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"openid\"]\n\n    def get_default_scope(self):\n        return [\"snsapi_login\"]\n\n    def extract_common_fields(self, data):\n        return dict(username=data.get(\"nickname\"), name=data.get(\"nickname\"))\n\n\nprovider_classes = [WeixinProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/weixin/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.weixin.provider import WeixinProvider\n\n\nurlpatterns = default_urlpatterns(WeixinProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/weixin/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\nfrom .client import WeixinOAuth2Client\n\n\nclass WeixinOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"weixin\"\n    access_token_url = \"https://api.weixin.qq.com/sns/oauth2/access_token\"  # nosec\n    profile_url = \"https://api.weixin.qq.com/sns/userinfo\"\n    client_class = WeixinOAuth2Client\n\n    @property\n    def authorize_url(self):\n        settings = self.get_provider().get_settings()\n        url = settings.get(\n            \"AUTHORIZE_URL\", \"https://open.weixin.qq.com/connect/qrconnect\"\n        )\n        return url\n\n    def complete_login(self, request, app, token, **kwargs):\n        openid = kwargs.get(\"response\", {}).get(\"openid\")\n        with get_adapter().get_requests_session() as sess:\n            params = {\"access_token\": token.token, \"openid\": openid}\n            resp = sess.get(self.profile_url, params=params)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        nickname = extra_data.get(\"nickname\")\n        if nickname:\n            extra_data[\"nickname\"] = nickname.encode(\"raw_unicode_escape\").decode(\n                \"utf-8\"\n            )\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(WeixinOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(WeixinOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/windowslive/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/windowslive/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.windowslive.views import WindowsLiveOAuth2Adapter\n\n\nclass WindowsLiveAccount(ProviderAccount):\n    def to_str(self):\n        email = self.account.extra_data.get(\"emails\", {}).get(\"preferred\")\n        if email:\n            return email\n        return super().to_str()\n\n\nclass WindowsLiveProvider(OAuth2Provider):\n    id = \"windowslive\"\n    name = \"Live\"\n    account_class = WindowsLiveAccount\n    oauth2_adapter_class = WindowsLiveOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"wl.basic\", \"wl.emails\"]\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def extract_common_fields(self, data):\n        try:\n            email = data.get(\"emails\").get(\"preferred\")\n        except AttributeError:\n            email = None\n\n        return dict(\n            email=email,\n            last_name=data.get(\"last_name\"),\n            first_name=data.get(\"first_name\"),\n        )\n\n\nprovider_classes = [WindowsLiveProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/windowslive/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.windowslive.provider import WindowsLiveProvider\n\n\nurlpatterns = default_urlpatterns(WindowsLiveProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/windowslive/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass WindowsLiveOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"windowslive\"\n    access_token_url = \"https://login.live.com/oauth20_token.srf\"  # nosec\n    authorize_url = \"https://login.live.com/oauth20_authorize.srf\"\n    profile_url = \"https://apis.live.net/v5.0/me\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        # example of what's returned (in python format):\n        # {'first_name': 'James', 'last_name': 'Smith',\n        #  'name': 'James Smith', 'locale': 'en_US', 'gender': None,\n        #  'emails': {'personal': None, 'account': 'jsmith@example.com',\n        #  'business': None, 'preferred': 'jsmith@example.com'},\n        #  'link': 'https://profile.live.com/',\n        #  'updated_time': '2014-02-07T00:35:27+0000',\n        #  'id': '83605e110af6ff98'}\n\n        with get_adapter().get_requests_session() as sess:\n            headers = {\"Authorization\": f\"Bearer {token.token}\"}\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(WindowsLiveOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(WindowsLiveOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/xing/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/xing/provider.py",
    "content": "from allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth.provider import OAuthProvider\nfrom allauth.socialaccount.providers.xing.views import XingOAuthAdapter\n\n\nclass XingAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"permalink\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"photo_urls\", {}).get(\"large\")\n\n    def to_str(self):\n        dflt = super().to_str()\n        return self.account.extra_data.get(\"active_email\") or dflt\n\n\nclass XingProvider(OAuthProvider):\n    id = \"xing\"\n    name = \"Xing\"\n    account_class = XingAccount\n    oauth_adapter_class = XingOAuthAdapter\n\n    def extract_uid(self, data):\n        return data[\"id\"]\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data.get(\"active_email\"),\n            username=data.get(\"page_name\"),\n            first_name=data.get(\"first_name\"),\n            last_name=data.get(\"last_name\"),\n        )\n\n\nprovider_classes = [XingProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/xing/urls.py",
    "content": "from allauth.socialaccount.providers.oauth.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.xing.provider import XingProvider\n\n\nurlpatterns = default_urlpatterns(XingProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/xing/views.py",
    "content": "from allauth.socialaccount.providers.oauth.client import OAuth\nfrom allauth.socialaccount.providers.oauth.views import (\n    OAuthAdapter,\n    OAuthCallbackView,\n    OAuthLoginView,\n)\n\n\nclass XingAPI(OAuth):\n    url = \"https://api.xing.com/v1/users/me.json\"\n\n    def get_user_info(self):\n        user = self.query(self.url).json()\n        return user\n\n\nclass XingOAuthAdapter(OAuthAdapter):\n    provider_id = \"xing\"\n    request_token_url = \"https://api.xing.com/v1/request_token\"  # nosec\n    access_token_url = \"https://api.xing.com/v1/access_token\"  # nosec\n    authorize_url = \"https://www.xing.com/v1/authorize\"\n\n    def complete_login(self, request, app, token, response):\n        client = XingAPI(request, app.client_id, app.secret, self.request_token_url)\n        extra_data = client.get_user_info()[\"users\"][0]\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth_login = OAuthLoginView.adapter_view(XingOAuthAdapter)\noauth_callback = OAuthCallbackView.adapter_view(XingOAuthAdapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/yahoo/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/yahoo/models.py",
    "content": "# Create your models here.\n"
  },
  {
    "path": "allauth/socialaccount/providers/yahoo/provider.py",
    "content": "from allauth.socialaccount.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.yahoo.views import YahooOAuth2Adapter\n\n\nclass YahooAccount(ProviderAccount):\n    pass\n\n\nclass YahooProvider(OAuth2Provider):\n    id = \"yahoo\"\n    name = \"Yahoo\"\n    account_class = YahooAccount\n    oauth2_adapter_class = YahooOAuth2Adapter\n\n    def get_default_scope(self):\n        \"\"\"\n        Doc on scopes available at\n        https://developer.yahoo.com/oauth2/guide/yahoo_scopes/\n        \"\"\"\n        return [\"profile\", \"email\"]\n\n    def extract_uid(self, data):\n        return data[\"sub\"]\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data[\"email\"],\n            last_name=data[\"family_name\"],\n            first_name=data[\"given_name\"],\n        )\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"email\")\n        if email and data.get(\"email_verified\"):\n            ret.append(EmailAddress(email=email, verified=True, primary=True))\n        return ret\n\n\nprovider_classes = [YahooProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/yahoo/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.yahoo.provider import YahooProvider\n\n\nurlpatterns = default_urlpatterns(YahooProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/yahoo/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass YahooOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"yahoo\"\n    access_token_url = \"https://api.login.yahoo.com/oauth2/get_token\"  # nosec\n    authorize_url = \"https://api.login.yahoo.com/oauth2/request_auth\"\n    profile_url = \"https://api.login.yahoo.com/openid/v1/userinfo\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(YahooOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(YahooOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/yandex/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/yandex/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.yandex.views import YandexOAuth2Adapter\n\n\nclass YandexAccount(ProviderAccount):\n    def to_str(self):\n        email = self.account.extra_data.get(\"default_email\")\n        if email:\n            return email\n        return super().to_str()\n\n\nclass YandexProvider(OAuth2Provider):\n    id = \"yandex\"\n    name = \"Yandex\"\n    account_class = YandexAccount\n    oauth2_adapter_class = YandexOAuth2Adapter\n\n    def get_default_scope(self):\n        scope = [\"login:info\"]\n        if app_settings.QUERY_EMAIL:\n            scope.append(\"login:email\")\n        return scope\n\n    def extract_uid(self, data):\n        return str(data[\"id\"])\n\n    def get_user_email(self, data):\n        email = data.get(\"default_email\")\n        if not email:\n            emails = data.get(\"emails\")\n            email = emails[0] if emails else \"\"\n        return email\n\n    def extract_common_fields(self, data):\n        email = self.get_user_email(data)\n        return dict(\n            email=email,\n            last_name=data.get(\"last_name\"),\n            username=data.get(\"display_name\"),\n            first_name=data.get(\"first_name\"),\n        )\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = self.get_user_email(data)\n        if email:\n            ret.append(EmailAddress(email=email, verified=True, primary=True))\n        return ret\n\n\nprovider_classes = [YandexProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/yandex/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.yandex.provider import YandexProvider\n\n\nurlpatterns = default_urlpatterns(YandexProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/yandex/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass YandexOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"yandex\"\n    access_token_url = \"https://oauth.yandex.ru/token\"  # nosec\n    authorize_url = \"https://oauth.yandex.com/authorize\"\n    profile_url = \"https://login.yandex.ru/info\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"OAuth {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            params = {\"format\": \"json\"}\n            resp = sess.get(self.profile_url, params=params, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(YandexOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(YandexOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/ynab/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/ynab/provider.py",
    "content": "from allauth.socialaccount.providers.base import AuthAction, ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.ynab.views import YNABOAuth2Adapter\n\n\nclass Scope:\n    ACCESS = \"read-only\"\n\n\nclass YNABAccount(ProviderAccount):\n    pass\n\n\nclass YNABProvider(OAuth2Provider):\n    id = \"ynab\"\n    name = \"YNAB\"\n    account_class = YNABAccount\n    oauth2_adapter_class = YNABOAuth2Adapter\n\n    def get_default_scope(self):\n        scope = [Scope.ACCESS]\n        return scope\n\n    def get_auth_params_from_request(self, request, action):\n        ret = super().get_auth_params_from_request(request, action)\n        if action == AuthAction.REAUTHENTICATE:\n            ret[\"prompt\"] = \"select_account consent\"\n        return ret\n\n    def extract_uid(self, data):\n        return str(data[\"data\"][\"user\"][\"id\"])\n\n\nprovider_classes = [YNABProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/ynab/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.ynab.provider import YNABProvider\n\n\nurlpatterns = default_urlpatterns(YNABProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/ynab/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass YNABOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"ynab\"\n    access_token_url = \"https://app.youneedabudget.com/oauth/token\"  # nosec\n    authorize_url = \"https://app.youneedabudget.com/oauth/authorize\"\n    profile_url = \"https://api.youneedabudget.com/v1/user\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(YNABOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(YNABOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/zoho/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/zoho/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.zoho.views import ZohoOAuth2Adapter\n\n\nclass ZohoAccount(ProviderAccount):\n    pass\n\n\nclass ZohoProvider(OAuth2Provider):\n    id = \"zoho\"\n    name = \"Zoho\"\n    account_class = ZohoAccount\n    oauth2_adapter_class = ZohoOAuth2Adapter\n\n    def get_default_scope(self):\n        return [\"aaaserver.profile.READ\"]\n\n    def extract_uid(self, data):\n        return str(data[\"ZUID\"])\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data[\"Email\"],\n            username=data[\"Display_Name\"],\n            first_name=data[\"First_Name\"],\n            last_name=data[\"Last_Name\"],\n        )\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"Email\")\n        if email:\n            ret.append(\n                EmailAddress(\n                    email=email,\n                    verified=False,\n                    primary=True,\n                )\n            )\n        return ret\n\n\nprovider_classes = [ZohoProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/zoho/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.zoho.provider import ZohoProvider\n\n\nurlpatterns = default_urlpatterns(ZohoProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/zoho/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass ZohoOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"zoho\"\n    access_token_url = \"https://accounts.zoho.com/oauth/v2/token\"  # nosec\n    authorize_url = \"https://accounts.zoho.com/oauth/v2/auth\"\n    profile_url = \"https://accounts.zoho.com/oauth/user/info\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(ZohoOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(ZohoOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/providers/zoom/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/providers/zoom/provider.py",
    "content": "from allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base import ProviderAccount\nfrom allauth.socialaccount.providers.oauth2.provider import OAuth2Provider\nfrom allauth.socialaccount.providers.zoom.views import ZoomOAuth2Adapter\n\n\nclass ZoomAccount(ProviderAccount):\n    def get_profile_url(self):\n        return self.account.extra_data.get(\"vanity_url\")\n\n    def get_avatar_url(self):\n        return self.account.extra_data.get(\"pic_url\")\n\n\nclass ZoomProvider(OAuth2Provider):\n    id = \"zoom\"\n    name = \"Zoom\"\n    account_class = ZoomAccount\n    oauth2_adapter_class = ZoomOAuth2Adapter\n\n    def extract_uid(self, data):\n        return data[\"id\"]\n\n    def extract_common_fields(self, data):\n        return dict(\n            email=data[\"email\"],\n            first_name=data[\"first_name\"],\n            last_name=data[\"last_name\"],\n        )\n\n    def extract_email_addresses(self, data):\n        ret = []\n        email = data.get(\"email\")\n        if email and data.get(\"verified\"):\n            ret.append(EmailAddress(email=email, verified=True, primary=True))\n        return ret\n\n\nprovider_classes = [ZoomProvider]\n"
  },
  {
    "path": "allauth/socialaccount/providers/zoom/urls.py",
    "content": "from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns\nfrom allauth.socialaccount.providers.zoom.provider import ZoomProvider\n\n\nurlpatterns = default_urlpatterns(ZoomProvider)\n"
  },
  {
    "path": "allauth/socialaccount/providers/zoom/views.py",
    "content": "from allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.providers.oauth2.views import (\n    OAuth2Adapter,\n    OAuth2CallbackView,\n    OAuth2LoginView,\n)\n\n\nclass ZoomOAuth2Adapter(OAuth2Adapter):\n    provider_id = \"zoom\"\n    access_token_url = \"https://zoom.us/oauth/token\"  # nosec\n    authorize_url = \"https://zoom.us/oauth/authorize\"\n    profile_url = \"https://api.zoom.us/v2/users/me\"\n\n    def complete_login(self, request, app, token, **kwargs):\n        headers = {\"Authorization\": f\"Bearer {token.token}\"}\n        with get_adapter().get_requests_session() as sess:\n            resp = sess.get(self.profile_url, headers=headers)\n            resp.raise_for_status()\n            extra_data = resp.json()\n        return self.get_provider().sociallogin_from_response(request, extra_data)\n\n\noauth2_login = OAuth2LoginView.adapter_view(ZoomOAuth2Adapter)\noauth2_callback = OAuth2CallbackView.adapter_view(ZoomOAuth2Adapter)\n"
  },
  {
    "path": "allauth/socialaccount/sessions.py",
    "content": "from importlib import import_module\nfrom urllib.parse import urlparse\n\nfrom django.conf import settings\nfrom django.utils.cache import patch_vary_headers\n\n\nengine = import_module(settings.SESSION_ENGINE)\nSessionStore = engine.SessionStore\n\n\nclass LoginSession:\n    \"\"\"Some providers sometimes POST their responses, which due to\n    CORS/Samesite-cookie rules means that this request cannot access the session\n    as its session cookie is unavailable.\n\n    We work around this by storing the response in a separate, temporary session\n    and redirecting to a different endpoint that can pick up the flow.\n    \"\"\"\n\n    def __init__(self, request, attribute_name, cookie_name):\n        \"\"\"\n        Prepares an provider specific session.\n        \"\"\"\n        self.request = request\n        self.attribute_name = attribute_name\n        self.cookie_name = cookie_name\n        self.store = getattr(request, attribute_name, None)\n        if self.store is None:\n            session_key = request.COOKIES.get(cookie_name)\n            self.store = SessionStore(session_key)\n            setattr(request, attribute_name, self.store)\n\n    def save(self, response):\n        \"\"\"\n        Save the session and set a cookie.\n        \"\"\"\n        patch_vary_headers(response, (\"Cookie\",))\n        self.store.save()\n        kwargs = {}\n        samesite = getattr(settings, \"SESSION_COOKIE_SAMESITE\", None)\n        if samesite:\n            kwargs[\"samesite\"] = samesite\n        response.set_cookie(\n            self.cookie_name,\n            self.store.session_key,\n            max_age=None,\n            expires=None,\n            domain=settings.SESSION_COOKIE_DOMAIN,\n            # The cookie is only needed on this endpoint\n            path=urlparse(response.url).path,\n            secure=settings.SESSION_COOKIE_SECURE,\n            httponly=None,\n            **kwargs,\n        )\n\n    def delete(self):\n        self.store.delete()\n"
  },
  {
    "path": "allauth/socialaccount/signals.py",
    "content": "from django.dispatch import Signal\n\n\n# Sent after a user successfully authenticates via a social provider,\n# but before the login is actually processed. This signal is emitted\n# for social logins, signups and when connecting additional social\n# accounts to an account.\n# Provides the arguments \"request\", \"sociallogin\"\npre_social_login = Signal()\n\n# Sent after a user connects a social account to a their local account.\n# Provides the arguments \"request\", \"sociallogin\"\nsocial_account_added = Signal()\n\n# Sent after a user connects an already existing social account to a\n# their local account. The social account will have an updated token and\n# refreshed extra_data.\n# Provides the arguments \"request\", \"sociallogin\"\nsocial_account_updated = Signal()\n\n# Sent after a user disconnects a social account from their local\n# account.\n# Provides the arguments \"request\", \"socialaccount\"\nsocial_account_removed = Signal()\n"
  },
  {
    "path": "allauth/socialaccount/templatetags/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/socialaccount/templatetags/socialaccount.py",
    "content": "from django import template\nfrom django.contrib.auth import REDIRECT_FIELD_NAME\nfrom django.utils.safestring import mark_safe\n\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.utils import get_request_param\n\n\nregister = template.Library()\n\n\n@register.simple_tag(takes_context=True)\ndef provider_login_url(context, provider, **params):\n    \"\"\"\n    {% provider_login_url \"facebook\" next=bla %}\n    {% provider_login_url \"openid\" openid=\"https://me.yahoo.com\" next=bla %}\n    \"\"\"\n    request = context.get(\"request\")\n    if isinstance(provider, str):\n        adapter = get_adapter()\n        provider = adapter.get_provider(request, provider)\n    query = dict(params)\n    auth_params = query.get(\"auth_params\", None)\n    scope = query.get(\"scope\", None)\n    process = query.get(\"process\", None)\n    if scope == \"\":\n        del query[\"scope\"]\n    if auth_params == \"\":\n        del query[\"auth_params\"]\n    if REDIRECT_FIELD_NAME not in query:\n        next = get_request_param(request, REDIRECT_FIELD_NAME)\n        if next:\n            query[REDIRECT_FIELD_NAME] = next\n        elif process == \"redirect\":\n            query[REDIRECT_FIELD_NAME] = request.get_full_path()\n    else:\n        if not query[REDIRECT_FIELD_NAME]:\n            del query[REDIRECT_FIELD_NAME]\n    # get the login url and append query as url parameters\n    return provider.get_login_url(request, **query)\n\n\n@register.simple_tag(takes_context=True)\ndef providers_media_js(context):\n    request = context[\"request\"]\n    providers = get_adapter().list_providers(request)\n    ret = \"\\n\".join(p.media_js(request) for p in providers)\n    return mark_safe(ret)  # nosec\n\n\n@register.simple_tag\ndef get_social_accounts(user):\n    \"\"\"\n    {% get_social_accounts user as accounts %}\n\n    Then:\n        {{accounts.twitter}} -- a list of connected Twitter accounts\n        {{accounts.twitter.0}} -- the first Twitter account\n        {% if accounts %} -- if there is at least one social account\n    \"\"\"\n    accounts = {}\n    for account in user.socialaccount_set.all().iterator():\n        providers = accounts.setdefault(account.provider, [])\n        providers.append(account)\n    return accounts\n\n\n@register.simple_tag(takes_context=True)\ndef get_providers(context):\n    \"\"\"\n    Returns a list of social authentication providers.\n\n    Usage: `{% get_providers as socialaccount_providers %}`.\n\n    Then within the template context, `socialaccount_providers` will hold\n    a list of social providers configured for the current site.\n    \"\"\"\n    request = context[\"request\"]\n    adapter = get_adapter()\n    providers = adapter.list_providers(request)\n    providers = [\n        provider\n        for provider in providers\n        if (not provider.uses_apps or not provider.app.settings.get(\"hidden\"))\n    ]\n    return sorted(providers, key=lambda p: p.name)\n"
  },
  {
    "path": "allauth/socialaccount/urls.py",
    "content": "from django.urls import path\n\nfrom . import views\n\n\nurlpatterns = [\n    path(\n        \"login/cancelled/\",\n        views.login_cancelled,\n        name=\"socialaccount_login_cancelled\",\n    ),\n    path(\"login/error/\", views.login_error, name=\"socialaccount_login_error\"),\n    path(\"signup/\", views.signup, name=\"socialaccount_signup\"),\n    path(\"\", views.connections, name=\"socialaccount_connections\"),\n]\n"
  },
  {
    "path": "allauth/socialaccount/views.py",
    "content": "from http import HTTPStatus\n\nfrom django.contrib.auth.decorators import login_required\nfrom django.contrib.sites.shortcuts import get_current_site\nfrom django.http import HttpResponse, HttpResponseRedirect\nfrom django.urls import reverse, reverse_lazy\nfrom django.utils.decorators import method_decorator\nfrom django.views.generic.base import TemplateView\nfrom django.views.generic.edit import FormView\n\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.socialaccount.forms import DisconnectForm, SignupForm\nfrom allauth.socialaccount.internal import flows\nfrom allauth.socialaccount.models import SocialAccount\n\nfrom ..account import app_settings as account_settings\nfrom ..account.views import (\n    AjaxCapableProcessFormViewMixin,\n    CloseableSignupMixin,\n    RedirectAuthenticatedUserMixin,\n)\nfrom ..utils import get_form_class\nfrom . import app_settings\nfrom .adapter import get_adapter\n\n\nclass SignupView(\n    RedirectAuthenticatedUserMixin,\n    CloseableSignupMixin,\n    AjaxCapableProcessFormViewMixin,\n    FormView,\n):\n    form_class = SignupForm\n    template_name = f\"socialaccount/signup.{account_settings.TEMPLATE_EXTENSION}\"\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"signup\", self.form_class)\n\n    @method_decorator(login_not_required)\n    def dispatch(self, request, *args, **kwargs) -> HttpResponse:\n        self.sociallogin = flows.signup.get_pending_signup(request)\n        if not self.sociallogin:\n            return HttpResponseRedirect(reverse(\"account_login\"))\n        return super().dispatch(request, *args, **kwargs)\n\n    def is_open(self) -> bool:\n        return get_adapter(self.request).is_open_for_signup(\n            self.request, self.sociallogin\n        )\n\n    def get_form_kwargs(self) -> dict:\n        ret = super().get_form_kwargs()\n        ret[\"sociallogin\"] = self.sociallogin\n        return ret\n\n    def form_valid(self, form) -> HttpResponse:\n        return flows.signup.signup_by_form(self.request, self.sociallogin, form)\n\n    def get_context_data(self, **kwargs):\n        ret = super().get_context_data(**kwargs)\n        ret.update(\n            dict(\n                site=get_current_site(self.request),\n                account=self.sociallogin.account,\n            )\n        )\n        return ret\n\n    def get_authenticated_redirect_url(self) -> str:\n        return reverse(\"socialaccount_connections\")\n\n\nsignup = SignupView.as_view()\n\n\n@method_decorator(login_not_required, name=\"dispatch\")\nclass LoginCancelledView(TemplateView):\n    template_name = (\n        f\"socialaccount/login_cancelled.{account_settings.TEMPLATE_EXTENSION}\"\n    )\n\n\nlogin_cancelled = LoginCancelledView.as_view()\n\n\nclass LoginErrorView(TemplateView):\n    template_name = (\n        f\"socialaccount/authentication_error.{account_settings.TEMPLATE_EXTENSION}\"\n    )\n\n    def get(self, request, *args, **kwargs) -> HttpResponse:\n        return self.render_to_response(\n            self.get_context_data(**kwargs),\n            status=HTTPStatus.UNAUTHORIZED,\n        )\n\n\nlogin_error = LoginErrorView.as_view()\n\n\n@method_decorator(login_required, name=\"dispatch\")\nclass ConnectionsView(AjaxCapableProcessFormViewMixin, FormView):\n    template_name = f\"socialaccount/connections.{account_settings.TEMPLATE_EXTENSION}\"\n    form_class = DisconnectForm\n    success_url = reverse_lazy(\"socialaccount_connections\")\n\n    def get_form_class(self):\n        return get_form_class(app_settings.FORMS, \"disconnect\", self.form_class)\n\n    def get_form_kwargs(self) -> dict:\n        kwargs = super().get_form_kwargs()\n        kwargs[\"request\"] = self.request\n        return kwargs\n\n    def form_valid(self, form) -> HttpResponse:\n        form.save()\n        return super().form_valid(form)\n\n    def get_ajax_data(self):\n        account_data = []\n        for account in SocialAccount.objects.filter(user=self.request.user):\n            provider_account = account.get_provider_account()\n            account_data.append(\n                {\n                    \"id\": account.pk,\n                    \"provider\": account.provider,\n                    \"name\": provider_account.to_str(),\n                }\n            )\n        return {\"socialaccounts\": account_data}\n\n\nconnections = ConnectionsView.as_view()\n"
  },
  {
    "path": "allauth/templates/account/account_inactive.html",
    "content": "{% extends \"allauth/layouts/entrance.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% translate \"Account Inactive\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% translate \"Account Inactive\" %}\n    {% endelement %}\n    {% element p %}\n        {% translate \"This account is inactive.\" %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/base_confirm_code.html",
    "content": "{% extends \"account/base_entrance.html\" %}\n{% load i18n %}\n{% load allauth account %}\n{% block content %}\n    {% setvar title_ %}\n        {% block title %}{% endblock %}\n    {% endsetvar %}\n    {% setvar action_url %}\n        {% block action_url %}{% endblock %}\n    {% endsetvar %}\n    {% setvar extra_tags %}\n        {% block extra_tags %}{% endblock %}\n    {% endsetvar %}\n    {% setvar form_tags %}\n        entrance,{{ extra_tags }}\n    {% endsetvar %}\n    {% setvar submit_button_tags %}\n        confirm,{{ extra_tags }}\n    {% endsetvar %}\n    {% setvar recipient %}\n        {% block recipient %}{% endblock %}\n    {% endsetvar %}\n    {% element h1 %}\n        {{ title_ }}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate %}We've sent a code to {{ recipient }}. The code expires shortly, so please enter it soon.{% endblocktranslate %}\n    {% endelement %}\n    {% element form form=verify_form method=\"post\" action=action_url tags=form_tags %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=verify_form unlabeled=True %}\n            {% endelement %}\n            {{ redirect_field }}\n        {% endslot %}\n        {% slot actions %}\n            {% element button_group %}\n                {% element button type=\"submit\" tags=submit_button_tags %}\n                    {% translate \"Confirm\" %}\n                {% endelement %}\n                {% if can_resend %}\n                    {% element button form=\"resend\" tags=\"outline,resend\" %}\n                        {% translate \"Request new code\" %}\n                    {% endelement %}\n                {% endif %}\n                {% if cancel_url %}\n                    {% element button href=cancel_url tags=\"outline,cancel\" %}\n                        {% translate \"Cancel\" %}\n                    {% endelement %}\n                {% else %}\n                    {% element button type=\"submit\" form=\"logout-from-stage\" tags=\"outline,cancel\" %}\n                        {% translate \"Cancel\" %}\n                    {% endelement %}\n                {% endif %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n    <form id=\"resend\" method=\"post\" action=\"{{ action_url }}\">\n        <input type=\"hidden\" name=\"action\" value=\"resend\">\n        {{ redirect_field }}\n        {% csrf_token %}\n    </form>\n    {% if not cancel_url %}\n        <form id=\"logout-from-stage\"\n              method=\"post\"\n              action=\"{% url 'account_logout' %}\">\n            <input type=\"hidden\" name=\"next\" value=\"{% url 'account_login' %}\">\n            {% csrf_token %}\n        </form>\n    {% endif %}\n    {% setvar summary_ %}\n        {% block change_title %}{% endblock %}\n    {% endsetvar %}\n    {% if can_change %}\n        {% element details open=change_form.errors %}\n            {% slot summary %}\n                {{ summary_ }}\n            {% endslot %}\n            {% slot body %}\n                {% element form form=change_form method=\"post\" action=action_url %}\n                    {% slot body %}\n                        {% csrf_token %}\n                        {% element fields form=change_form unlabeled=True %}\n                        {% endelement %}\n                        {{ redirect_field }}\n                    {% endslot %}\n                    {% slot actions %}\n                        {% element button name=\"action\" value=\"change\" type=\"submit\" %}\n                            Change\n                        {% endelement %}\n                    {% endslot %}\n                {% endelement %}\n            {% endslot %}\n        {% endelement %}\n    {% endif %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/base_entrance.html",
    "content": "{% extends \"allauth/layouts/entrance.html\" %}\n"
  },
  {
    "path": "allauth/templates/account/base_manage.html",
    "content": "{% extends \"allauth/layouts/manage.html\" %}\n"
  },
  {
    "path": "allauth/templates/account/base_manage_email.html",
    "content": "{% extends \"account/base_manage.html\" %}\n"
  },
  {
    "path": "allauth/templates/account/base_manage_password.html",
    "content": "{% extends \"account/base_manage.html\" %}\n"
  },
  {
    "path": "allauth/templates/account/base_manage_phone.html",
    "content": "{% extends \"account/base_manage.html\" %}\n"
  },
  {
    "path": "allauth/templates/account/base_reauthenticate.html",
    "content": "{% extends \"account/base_entrance.html\" %}\n{% load allauth %}\n{% load i18n %}\n{% block head_title %}\n    {% trans \"Confirm Access\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Confirm Access\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate %}Please reauthenticate to safeguard your account.{% endblocktranslate %}\n    {% endelement %}\n    {% block reauthenticate_content %}{% endblock %}\n    {% if reauthentication_alternatives %}\n        {% element hr %}\n        {% endelement %}\n        {% element h2 %}\n            {% translate \"Alternative options\" %}\n        {% endelement %}\n        {% element button_group %}\n            {% for alt in reauthentication_alternatives %}\n                {% element button href=alt.url tags=\"primary,outline\" %}\n                    {{ alt.description }}\n                {% endelement %}\n            {% endfor %}\n        {% endelement %}\n    {% endif %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/confirm_email_verification_code.html",
    "content": "{% extends \"account/base_confirm_code.html\" %}\n{% load i18n %}\n{% load allauth account %}\n{% block head_title %}\n    {% translate \"Email Verification\" %}\n{% endblock head_title %}\n{% block title %}\n    {% translate \"Enter Email Verification Code\" %}\n{% endblock %}\n{% block recipient %}<a href=\"mailto:{{ email }}\">{{ email }}</a>{% endblock %}\n{% block action_url %}\n    {% url 'account_email_verification_sent' %}\n{% endblock %}\n{% block extra_tags %}email,verification{% endblock %}\n{% block change_title %}\n    {% translate \"Use a different email address\" %}\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/account/confirm_login_code.html",
    "content": "{% extends \"account/base_confirm_code.html\" %}\n{% load i18n %}\n{% load allauth account %}\n{% block head_title %}\n    {% translate \"Sign In\" %}\n{% endblock head_title %}\n{% block title %}\n    {% translate \"Enter Sign-In Code\" %}\n{% endblock %}\n{% block recipient %}\n    {% if email %}\n        <a href=\"mailto:{{ email }}\">{{ email }}</a>\n    {% else %}\n        <a href=\"tel:{{ phone }}\">{{ phone }}</a>\n    {% endif %}\n{% endblock %}\n{% block action_url %}\n    {% url 'account_confirm_login_code' %}\n{% endblock %}\n{% block extra_tags %}login{% endblock %}\n"
  },
  {
    "path": "allauth/templates/account/confirm_password_reset_code.html",
    "content": "{% extends \"account/base_confirm_code.html\" %}\n{% load i18n %}\n{% load allauth account %}\n{% block head_title %}\n    {% translate \"Password Reset\" %}\n{% endblock head_title %}\n{% block title %}\n    {% translate \"Enter Password Reset Code\" %}\n{% endblock %}\n{% block recipient %}<a href=\"mailto:{{ email }}\">{{ email }}</a>{% endblock %}\n{% block action_url %}\n    {% url 'account_confirm_password_reset_code' %}\n{% endblock %}\n{% block extra_tags %}email,verification{% endblock %}\n"
  },
  {
    "path": "allauth/templates/account/confirm_phone_verification_code.html",
    "content": "{% extends \"account/base_confirm_code.html\" %}\n{% load i18n %}\n{% load allauth account %}\n{% block head_title %}\n    {% translate \"Phone Verification\" %}\n{% endblock head_title %}\n{% block title %}\n    {% translate \"Enter Phone Verification Code\" %}\n{% endblock %}\n{% block recipient %}<a href=\"tel:{{ phone }}\">{{ phone }}</a>{% endblock %}\n{% block action_url %}\n    {% url 'account_verify_phone' %}\n{% endblock %}\n{% block change_title %}\n    {% translate \"Use a different phone number\" %}\n{% endblock %}\n{% block extra_tags %}phone,verification{% endblock %}\n"
  },
  {
    "path": "allauth/templates/account/email/account_already_exists_message.txt",
    "content": "{% extends \"account/email/base_message.txt\" %}\n{% load i18n %}\n\n{% block content %}{% autoescape off %}{% blocktrans %}You are receiving this email because you or someone else tried to signup for an\naccount using email address:\n\n{{ email }}\n\nHowever, an account using that email address already exists.  In case you have\nforgotten about this, please use the password forgotten procedure to recover\nyour account:\n\n{{ password_reset_url }}{% endblocktrans %}{% endautoescape %}{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/email/account_already_exists_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Account Already Exists{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/account/email/base_message.txt",
    "content": "{% load i18n %}{% autoescape off %}{% blocktrans with site_name=current_site.name %}Hello from {{ site_name }}!{% endblocktrans %}\n\n{% block content %}{% endblock content %}\n\n{% blocktrans with site_name=current_site.name site_domain=current_site.domain %}Thank you for using {{ site_name }}!\n{{ site_domain }}{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/account/email/base_notification.txt",
    "content": "{% extends \"account/email/base_message.txt\" %}\n{% load account %}\n{% load i18n %}\n\n{% block content %}{% autoescape off %}{% blocktrans %}You are receiving this mail because the following change was made to your account:{% endblocktrans %}\n\n{% block notification_message %}\n{% endblock notification_message%}\n\n{% blocktrans %}If you do not recognize this change then please take proper security precautions immediately. The change to your account originates from:\n\n- IP address: {{ip}}\n- Browser: {{user_agent}}\n- Date: {{timestamp}}{% endblocktrans %}{% endautoescape %}{% endblock %}\n"
  },
  {
    "path": "allauth/templates/account/email/email_changed_message.txt",
    "content": "{% extends \"account/email/base_notification.txt\" %}\n{% load i18n %}\n\n{% block notification_message %}{% blocktrans %}Your email has been changed from {{ from_email }} to {{ to_email }}.{% endblocktrans %}{% endblock notification_message %}\n"
  },
  {
    "path": "allauth/templates/account/email/email_changed_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Email Changed{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/account/email/email_confirm_message.txt",
    "content": "{% extends \"account/email/base_notification.txt\" %}\n{% load i18n %}\n\n{% block notification_message %}{% blocktrans %}Your email has been confirmed.{% endblocktrans %}{% endblock notification_message %}\n"
  },
  {
    "path": "allauth/templates/account/email/email_confirm_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Email Confirmation{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/account/email/email_confirmation_message.txt",
    "content": "{% extends \"account/email/base_message.txt\" %}\n{% load account %}\n{% load i18n %}\n\n{% block content %}{% autoescape off %}{% user_display user as user_display %}{% blocktranslate with site_name=current_site.name site_domain=current_site.domain %}You're receiving this email because user {{ user_display }} has given your email address to register an account on {{ site_domain }}.{% endblocktranslate %}\n\n{% if code %}{% blocktranslate %}Your email verification code is listed below. Please enter it in your open browser window.{% endblocktranslate %}\n\n{{ code }}{% else %}{% blocktranslate %}To confirm this is correct, go to {{ activate_url }}{% endblocktranslate %}{% endif %}{% endautoescape %}{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/email/email_confirmation_signup_message.txt",
    "content": "{% include \"account/email/email_confirmation_message.txt\" %}\n"
  },
  {
    "path": "allauth/templates/account/email/email_confirmation_signup_subject.txt",
    "content": "{% include \"account/email/email_confirmation_subject.txt\" %}\n"
  },
  {
    "path": "allauth/templates/account/email/email_confirmation_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Please Confirm Your Email Address{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/account/email/email_deleted_message.txt",
    "content": "{% extends \"account/email/base_notification.txt\" %}\n{% load i18n %}\n\n{% block notification_message %}{% blocktrans %}Email address {{ deleted_email }} has been removed from your account.{% endblocktrans %}{% endblock notification_message %}\n"
  },
  {
    "path": "allauth/templates/account/email/email_deleted_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Email Removed{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/account/email/login_code_message.txt",
    "content": "{% extends \"account/email/base_message.txt\" %}\n{% load account %}\n{% load i18n %}\n\n{% block content %}{% autoescape off %}{% blocktranslate %}Your sign-in code is listed below. Please enter it in your open browser window.{% endblocktranslate %}{% endautoescape %}\n\n{{ code }}\n\n{% blocktranslate %}This mail can be safely ignored if you did not initiate this action.{% endblocktranslate %}{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/email/login_code_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Sign-In Code{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/account/email/password_changed_message.txt",
    "content": "{% extends \"account/email/base_notification.txt\" %}\n{% load i18n %}\n\n{% block notification_message %}{% blocktrans %}Your password has been changed.{% endblocktrans %}{% endblock notification_message %}\n"
  },
  {
    "path": "allauth/templates/account/email/password_changed_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Password Changed{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/account/email/password_reset_code_message.txt",
    "content": "{% extends \"account/email/base_message.txt\" %}\n{% load account %}\n{% load i18n %}\n\n{% block content %}{% autoescape off %}{% blocktranslate %}Your password reset code is listed below. Please enter it in your open browser window.{% endblocktranslate %}{% endautoescape %}\n\n{{ code }}\n\n{% blocktranslate %}This mail can be safely ignored if you did not initiate this action.{% endblocktranslate %}{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/email/password_reset_code_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Password Reset Code{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/account/email/password_reset_key_message.txt",
    "content": "{% extends \"account/email/base_message.txt\" %}\n{% load i18n %}\n\n{% block content %}{% autoescape off %}{% blocktrans %}You're receiving this email because you or someone else has requested a password reset for your user account.\nIt can be safely ignored if you did not request a password reset. Click the link below to reset your password.{% endblocktrans %}\n\n{{ password_reset_url }}{% if username %}\n\n{% blocktrans %}In case you forgot, your username is {{ username }}.{% endblocktrans %}{% endif %}{% endautoescape %}{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/email/password_reset_key_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Password Reset Email{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/account/email/password_reset_message.txt",
    "content": "{% extends \"account/email/base_notification.txt\" %}\n{% load i18n %}\n\n{% block notification_message %}{% blocktrans %}Your password has been reset.{% endblocktrans %}{% endblock notification_message %}\n"
  },
  {
    "path": "allauth/templates/account/email/password_reset_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Password Reset{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/account/email/password_set_message.txt",
    "content": "{% extends \"account/email/base_notification.txt\" %}\n{% load i18n %}\n\n{% block notification_message %}{% blocktrans %}Your password has been set.{% endblocktrans %}{% endblock notification_message %}\n"
  },
  {
    "path": "allauth/templates/account/email/password_set_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Password Set{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/account/email/unknown_account_message.txt",
    "content": "{% extends \"account/email/base_message.txt\" %}\n{% load i18n %}\n\n{% block content %}{% autoescape off %}{% blocktranslate %}You are receiving this email because you, or someone else, tried to access an account with email {{ email }}. However, we do not have any record of such an account in our database.{% endblocktranslate %}\n\n{% blocktranslate %}This mail can be safely ignored if you did not initiate this action.{% endblocktranslate %}\n\n{% blocktranslate %}If it was you, you can sign up for an account using the link below.{% endblocktranslate %}\n\n{{ signup_url }}{% endautoescape %}{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/email/unknown_account_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Unknown Account{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/account/email.html",
    "content": "{% extends \"account/base_manage_email.html\" %}\n{% load static allauth i18n %}\n{% block head_title %}\n    {% trans \"Email Addresses\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Email Addresses\" %}\n    {% endelement %}\n    {% if emailaddresses %}\n        {% element p %}\n            {% trans 'The following email addresses are associated with your account:' %}\n        {% endelement %}\n        {% url 'account_email' as email_url %}\n        {% element form form=form action=email_url method=\"post\" tags=\"email,list\" %}\n            {% slot body %}\n                {% csrf_token %}\n                {% for radio in emailaddress_radios %}\n                    {% with emailaddress=radio.emailaddress %}\n                        {% element field type=\"radio\" checked=radio.checked name=\"email\" value=emailaddress.email id=radio.id %}\n                            {% slot label %}\n                                {{ emailaddress.email }}\n                                {% if emailaddress.verified %}\n                                    {% element badge tags=\"success,email,verified\" %}\n                                        {% translate \"Verified\" %}\n                                    {% endelement %}\n                                {% else %}\n                                    {% element badge tags=\"warning,email,unverified\" %}\n                                        {% translate \"Unverified\" %}\n                                    {% endelement %}\n                                {% endif %}\n                                {% if emailaddress.primary %}\n                                    {% element badge tags=\"email,primary\" %}\n                                        {% translate \"Primary\" %}\n                                    {% endelement %}\n                                {% endif %}\n                            {% endslot %}\n                        {% endelement %}\n                    {% endwith %}\n                {% endfor %}\n            {% endslot %}\n            {% slot actions %}\n                {% element button type=\"submit\" name=\"action_primary\" %}\n                    {% trans 'Make Primary' %}\n                {% endelement %}\n                {% element button tags=\"secondary\" type=\"submit\" name=\"action_send\" %}\n                    {% trans 'Re-send Verification' %}\n                {% endelement %}\n                {% element button tags=\"danger,delete\" type=\"submit\" name=\"action_remove\" %}\n                    {% trans 'Remove' %}\n                {% endelement %}\n            {% endslot %}\n        {% endelement %}\n    {% else %}\n        {% include \"account/snippets/warn_no_email.html\" %}\n    {% endif %}\n    {% if can_add_email %}\n        {% element h2 %}\n            {% trans \"Add Email Address\" %}\n        {% endelement %}\n        {% url 'account_email' as action_url %}\n        {% element form form=form method=\"post\" action=action_url tags=\"email,add\" %}\n            {% slot body %}\n                {% csrf_token %}\n                {% element fields form=form %}\n                {% endelement %}\n            {% endslot %}\n            {% slot actions %}\n                {% element button name=\"action_add\" type=\"submit\" %}\n                    {% trans \"Add Email\" %}\n                {% endelement %}\n            {% endslot %}\n        {% endelement %}\n    {% endif %}\n{% endblock content %}\n{% block extra_body %}\n    <script src=\"{% static 'account/js/account.js' %}\"></script>\n    <script src=\"{% static 'account/js/onload.js' %}\"></script>\n    <script data-allauth-onload=\"allauth.account.forms.manageEmailForm\" type=\"application/json\">{\n    \"i18n\": {\"confirmDelete\": \"{% trans 'Do you really want to remove the selected email address?' %}\"}\n}\n    </script>\n{% endblock extra_body %}\n"
  },
  {
    "path": "allauth/templates/account/email_change.html",
    "content": "{% extends \"account/base_manage_email.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Email Address\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Email Address\" %}\n    {% endelement %}\n    {% if not emailaddresses %}\n        {% include \"account/snippets/warn_no_email.html\" %}\n    {% endif %}\n    {% url 'account_email' as action_url %}\n    {% element form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {% if current_emailaddress %}\n                {% element field id=\"current_email\" disabled=True type=\"email\" value=current_emailaddress.email %}\n                    {% slot label %}\n                        {% translate \"Current email\" %}:\n                    {% endslot %}\n                {% endelement %}\n            {% endif %}\n            {% if new_emailaddress %}\n                {% element field id=\"new_email\" value=new_emailaddress.email disabled=True type=\"email\" %}\n                    {% slot label %}\n                        {% if not current_emailaddress %}\n                            {% translate \"Current email\" %}:\n                        {% else %}\n                            {% translate \"Changing to\" %}:\n                        {% endif %}\n                    {% endslot %}\n                    {% slot help_text %}\n                        {% blocktranslate %}Your email address is still pending verification.{% endblocktranslate %}\n                        {% element button form=\"pending-email\" type=\"submit\" name=\"action_send\" tags=\"minor,secondary\" %}\n                            {% trans 'Re-send Verification' %}\n                        {% endelement %}\n                        {% if current_emailaddress %}\n                            {% element button form=\"pending-email\" type=\"submit\" name=\"action_remove\" tags=\"danger,minor\" %}\n                                {% trans 'Cancel Change' %}\n                            {% endelement %}\n                        {% endif %}\n                    {% endslot %}\n                {% endelement %}\n            {% endif %}\n            {% element field id=form.email.auto_id name=\"email\" value=form.email.value errors=form.email.errors type=\"email\" %}\n                {% slot label %}\n                    {% translate \"Change to\" %}:\n                {% endslot %}\n            {% endelement %}\n        {% endslot %}\n        {% slot actions %}\n            {% element button name=\"action_add\" type=\"submit\" %}\n                {% trans \"Change Email\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n    {% if new_emailaddress %}\n        <form style=\"display: none\"\n              id=\"pending-email\"\n              method=\"post\"\n              action=\"{% url 'account_email' %}\">\n            {% csrf_token %}\n            <input type=\"hidden\" name=\"email\" value=\"{{ new_emailaddress.email }}\">\n        </form>\n    {% endif %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/email_confirm.html",
    "content": "{% extends \"account/base_entrance.html\" %}\n{% load i18n %}\n{% load account %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Confirm Email Address\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Confirm Email Address\" %}\n    {% endelement %}\n    {% if confirmation %}\n        {% user_display confirmation.email_address.user as user_display %}\n        {% if can_confirm %}\n            {% element p %}\n                {% blocktrans with confirmation.email_address.email as email %}Please confirm that <a href=\"mailto:{{ email }}\">{{ email }}</a> is an email address for user {{ user_display }}.{% endblocktrans %}\n            {% endelement %}\n            {% url 'account_confirm_email' confirmation.key as action_url %}\n            {% element form method=\"post\" action=action_url %}\n                {% slot actions %}\n                    {% csrf_token %}\n                    {{ redirect_field }}\n                    {% element button type=\"submit\" %}\n                        {% trans 'Confirm' %}\n                    {% endelement %}\n                {% endslot %}\n            {% endelement %}\n        {% else %}\n            {% element p %}\n                {% blocktrans %}Unable to confirm {{ email }} because it is already confirmed by a different account.{% endblocktrans %}\n            {% endelement %}\n        {% endif %}\n    {% else %}\n        {% url 'account_email' as email_url %}\n        {% element p %}\n            {% blocktrans %}This email confirmation link expired or is invalid. Please <a href=\"{{ email_url }}\">issue a new email confirmation request</a>.{% endblocktrans %}\n        {% endelement %}\n    {% endif %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/login.html",
    "content": "{% extends \"account/base_entrance.html\" %}\n{% load i18n %}\n{% load allauth account %}\n{% block head_title %}\n    {% trans \"Sign In\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Sign In\" %}\n    {% endelement %}\n    {% if not SOCIALACCOUNT_ONLY %}\n        {% setvar link %}\n            <a href=\"{{ signup_url }}\">\n            {% endsetvar %}\n            {% setvar end_link %}\n            </a>\n        {% endsetvar %}\n        {% element p %}\n            {% blocktranslate %}If you have not created an account yet, then please {{ link }}sign up{{ end_link }} first.{% endblocktranslate %}\n        {% endelement %}\n        {% url 'account_login' as login_url %}\n        {% element form form=form method=\"post\" action=login_url tags=\"entrance,login\" %}\n            {% slot body %}\n                {% csrf_token %}\n                {% element fields form=form unlabeled=True %}\n                {% endelement %}\n                {{ redirect_field }}\n            {% endslot %}\n            {% slot actions %}\n                {% element button type=\"submit\" tags=\"prominent,login\" %}\n                    {% trans \"Sign In\" %}\n                {% endelement %}\n            {% endslot %}\n        {% endelement %}\n    {% endif %}\n    {% if LOGIN_BY_CODE_ENABLED or PASSKEY_LOGIN_ENABLED %}\n        {% element hr %}\n        {% endelement %}\n        {% element button_group vertical=True %}\n            {% if PASSKEY_LOGIN_ENABLED %}\n                {% element button type=\"submit\" form=\"mfa_login\" id=\"passkey_login\" tags=\"prominent,login,outline,primary\" %}\n                    {% trans \"Sign in with a passkey\" %}\n                {% endelement %}\n            {% endif %}\n            {% if LOGIN_BY_CODE_ENABLED %}\n                {% element button href=request_login_code_url tags=\"prominent,login,outline,primary\" %}\n                    {% trans \"Send me a sign-in code\" %}\n                {% endelement %}\n            {% endif %}\n        {% endelement %}\n    {% endif %}\n    {% if SOCIALACCOUNT_ENABLED %}\n        {% include \"socialaccount/snippets/login.html\" with page_layout=\"entrance\" %}\n    {% endif %}\n{% endblock content %}\n{% block extra_body %}\n    {{ block.super }}\n    {% if PASSKEY_LOGIN_ENABLED %}\n        {% include \"mfa/webauthn/snippets/login_script.html\" with button_id=\"passkey_login\" %}\n    {% endif %}\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/account/logout.html",
    "content": "{% extends \"account/base_manage.html\" %}\n{% load allauth i18n %}\n{% block head_title %}\n    {% trans \"Sign Out\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Sign Out\" %}\n    {% endelement %}\n    {% element p %}\n        {% trans 'Are you sure you want to sign out?' %}\n    {% endelement %}\n    {% url 'account_logout' as action_url %}\n    {% element form method=\"post\" action=action_url no_visible_fields=True %}\n        {% slot body %}\n            {% csrf_token %}\n            {{ redirect_field }}\n        {% endslot %}\n        {% slot actions %}\n            {% element button type=\"submit\" %}\n                {% trans 'Sign Out' %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/messages/cannot_delete_primary_email.txt",
    "content": "{% load i18n %}\n{% blocktrans %}You cannot remove your primary email address ({{email}}).{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/account/messages/email_confirmation_failed.txt",
    "content": "{% load i18n %}\n{% blocktrans %}Unable to confirm {{email}} because it is already confirmed by a different account.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/account/messages/email_confirmation_sent.txt",
    "content": "{% load i18n %}\n{% blocktrans %}Confirmation email sent to {{email}}.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/account/messages/email_confirmed.txt",
    "content": "{% load i18n %}\n{% blocktrans %}You have confirmed {{email}}.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/account/messages/email_deleted.txt",
    "content": "{% load i18n %}\n{% blocktrans %}Removed email address {{email}}.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/account/messages/logged_in.txt",
    "content": "{% load account %}\n{% load i18n %}\n{% user_display user as name %}\n{% blocktrans %}Successfully signed in as {{name}}.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/account/messages/logged_out.txt",
    "content": "{% load i18n %}\n{% blocktrans %}You have signed out.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/account/messages/login_code_sent.txt",
    "content": "{% load i18n %}\n{% blocktrans %}A sign-in code has been sent to {{recipient}}.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/account/messages/password_changed.txt",
    "content": "{% load i18n %}\n{% blocktrans %}Password successfully changed.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/account/messages/password_set.txt",
    "content": "{% load i18n %}\n{% blocktrans %}Password successfully set.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/account/messages/phone_verification_sent.txt",
    "content": "{% load i18n %}\n{% blocktrans %}A verification code has been sent to {{phone}}.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/account/messages/phone_verified.txt",
    "content": "{% load i18n %}\n{% blocktrans %}You have verified phone number {{phone}}.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/account/messages/primary_email_set.txt",
    "content": "{% load i18n %}\n{% blocktrans %}Primary email address set.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/account/messages/unverified_primary_email.txt",
    "content": "{% load i18n %}\n{% blocktrans %}Your primary email address must be verified.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/account/password_change.html",
    "content": "{% extends \"account/base_manage_password.html\" %}\n{% load allauth i18n %}\n{% block head_title %}\n    {% trans \"Change Password\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Change Password\" %}\n    {% endelement %}\n    {% url 'account_change_password' as action_url %}\n    {% element form form=form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {{ redirect_field }}\n            {% element fields form=form %}\n            {% endelement %}\n        {% endslot %}\n        {% slot actions %}\n            {% element button type=\"submit\" %}\n                {% trans \"Change Password\" %}\n            {% endelement %}\n            <a href=\"{% url 'account_reset_password' %}\">{% trans \"Forgot Password?\" %}</a>\n        {% endslot %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/password_reset.html",
    "content": "{% extends \"account/base_entrance.html\" %}\n{% load i18n allauth account %}\n{% block head_title %}\n    {% trans \"Password Reset\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Password Reset\" %}\n    {% endelement %}\n    {% if user.is_authenticated %}\n        {% include \"account/snippets/already_logged_in.html\" %}\n    {% endif %}\n    {% element p %}\n        {% trans \"Forgotten your password? Enter your email address below, and we'll send you an email allowing you to reset it.\" %}\n    {% endelement %}\n    {% url 'account_reset_password' as reset_url %}\n    {% element form form=form method=\"post\" action=reset_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=form %}\n            {% endelement %}\n            {{ redirect_field }}\n        {% endslot %}\n        {% slot actions %}\n            {% element button type=\"submit\" %}\n                {% trans 'Reset My Password' %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n    {% element p %}\n        {% blocktrans %}Please contact us if you have any trouble resetting your password.{% endblocktrans %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/password_reset_done.html",
    "content": "{% extends \"account/base_entrance.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% load account %}\n{% block head_title %}\n    {% trans \"Password Reset\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Password Reset\" %}\n    {% endelement %}\n    {% if user.is_authenticated %}\n        {% include \"account/snippets/already_logged_in.html\" %}\n    {% endif %}\n    {% element p %}\n        {% blocktrans %}We have sent you an email. If you have not received it please check your spam folder. Otherwise contact us if you do not receive it in a few minutes.{% endblocktrans %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/password_reset_from_key.html",
    "content": "{% extends \"account/base_entrance.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Change Password\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% if token_fail %}\n            {% trans \"Bad Token\" %}\n        {% else %}\n            {% trans \"Change Password\" %}\n        {% endif %}\n    {% endelement %}\n    {% if token_fail %}\n        {% url 'account_reset_password' as passwd_reset_url %}\n        {% element p %}\n            {% blocktrans %}The password reset link was invalid, possibly because it has already been used.  Please request a <a href=\"{{ passwd_reset_url }}\">new password reset</a>.{% endblocktrans %}\n        {% endelement %}\n    {% else %}\n        {% element form method=\"post\" action=action_url %}\n            {% slot body %}\n                {% csrf_token %}\n                {{ redirect_field }}\n                {% element fields form=form %}\n                {% endelement %}\n            {% endslot %}\n            {% slot actions %}\n                {% element button type=\"submit\" name=\"action\" %}\n                    {% trans 'Change Password' %}\n                {% endelement %}\n                {% element button type=\"submit\" form=\"logout-from-stage\" tags=\"link,cancel\" %}\n                    {% translate \"Cancel\" %}\n                {% endelement %}\n            {% endslot %}\n        {% endelement %}\n    {% endif %}\n    {% if not cancel_url %}\n        <form id=\"logout-from-stage\"\n              method=\"post\"\n              action=\"{% url 'account_logout' %}\">\n            <input type=\"hidden\" name=\"next\" value=\"{% url 'account_login' %}\">\n            {% csrf_token %}\n        </form>\n    {% endif %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/password_reset_from_key_done.html",
    "content": "{% extends \"account/base_entrance.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Change Password\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Change Password\" %}\n    {% endelement %}\n    {% element p %}\n        {% trans 'Your password is now changed.' %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/password_set.html",
    "content": "{% extends \"account/base_manage_password.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Set Password\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Set Password\" %}\n    {% endelement %}\n    {% url 'account_set_password' as action_url %}\n    {% element form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {{ redirect_field }}\n            {% element fields form=form %}\n            {% endelement %}\n        {% endslot %}\n        {% slot actions %}\n            {% element button type=\"submit\" name=\"action\" %}\n                {% trans 'Set Password' %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/phone_change.html",
    "content": "{% extends \"account/base_manage_phone.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Change Phone\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Change Phone\" %}\n    {% endelement %}\n    {% url 'account_change_phone' as action_url %}\n    {% element form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {% if phone %}\n                {% element field id=\"current_phone\" disabled=True type=\"tel\" value=phone %}\n                    {% slot label %}\n                        {% translate \"Current phone\" %}:\n                    {% endslot %}\n                    {% if not phone_verified %}\n                        {% slot help_text %}\n                            {% blocktranslate %}Your phone number is still pending verification.{% endblocktranslate %}\n                            {% element button form=\"verify-phone\" type=\"submit\" tags=\"minor,secondary\" %}\n                                {% trans 'Re-send Verification' %}\n                            {% endelement %}\n                        {% endslot %}\n                    {% endif %}\n                {% endelement %}\n            {% endif %}\n            {% element field id=form.phone.auto_id name=\"phone\" value=form.phone.value errors=form.phone.errors type=\"tel\" %}\n                {% slot label %}\n                    {% translate \"Change to\" %}:\n                {% endslot %}\n            {% endelement %}\n        {% endslot %}\n        {% slot actions %}\n            {% element button name=\"action_add\" type=\"submit\" %}\n                {% translate \"Change Phone\" context \"action\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n    {% if not phone_verified %}\n        <form style=\"display: none\"\n              id=\"verify-phone\"\n              method=\"post\"\n              action=\"{{ action_url }}\">\n            {% csrf_token %}\n            <input type=\"hidden\" name=\"action\" value=\"verify\">\n        </form>\n    {% endif %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/reauthenticate.html",
    "content": "{% extends \"account/base_reauthenticate.html\" %}\n{% load allauth %}\n{% load i18n %}\n{% block reauthenticate_content %}\n    {% element p %}\n        {% blocktranslate %}Enter your password:{% endblocktranslate %}\n    {% endelement %}\n    {% url 'account_reauthenticate' as action_url %}\n    {% element form form=form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=form unlabeled=True %}\n            {% endelement %}\n            {{ redirect_field }}\n        {% endslot %}\n        {% slot actions %}\n            {% element button type=\"submit\" tags=\"primary,reauthenticate\" %}\n                {% trans \"Confirm\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/account/request_login_code.html",
    "content": "{% extends \"account/base_entrance.html\" %}\n{% load i18n %}\n{% load allauth account %}\n{% block head_title %}\n    {% translate \"Sign In\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% translate \"Send me a sign-in code\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate %}You will receive a special code for a password-free sign-in.{% endblocktranslate %}\n    {% endelement %}\n    {% url 'account_request_login_code' as login_url %}\n    {% element form form=form method=\"post\" action=login_url tags=\"entrance,login\" %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=form unlabeled=True %}\n            {% endelement %}\n            {{ redirect_field }}\n        {% endslot %}\n        {% slot actions %}\n            {% element button type=\"submit\" tags=\"prominent,login\" %}\n                {% translate \"Request Code\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n    {% url 'account_login' as login_url %}\n    {% element button href=login_url tags=\"link\" %}\n        {% translate \"Other sign-in options\" %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/signup.html",
    "content": "{% extends \"account/base_entrance.html\" %}\n{% load allauth i18n %}\n{% block head_title %}\n    {% trans \"Signup\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Sign Up\" %}\n    {% endelement %}\n    {% setvar link %}\n        <a href=\"{{ login_url }}\">\n        {% endsetvar %}\n        {% setvar end_link %}\n        </a>\n    {% endsetvar %}\n    {% element p %}\n        {% blocktranslate %}Already have an account? Then please {{ link }}sign in{{ end_link }}.{% endblocktranslate %}\n    {% endelement %}\n    {% if not SOCIALACCOUNT_ONLY %}\n        {% url 'account_signup' as action_url %}\n        {% element form form=form method=\"post\" action=action_url tags=\"entrance,signup\" %}\n            {% slot body %}\n                {% csrf_token %}\n                {% element fields form=form unlabeled=True %}\n                {% endelement %}\n                {{ redirect_field }}\n            {% endslot %}\n            {% slot actions %}\n                {% element button tags=\"prominent,signup\" type=\"submit\" %}\n                    {% trans \"Sign Up\" %}\n                {% endelement %}\n            {% endslot %}\n        {% endelement %}\n    {% endif %}\n    {% if PASSKEY_SIGNUP_ENABLED %}\n        {% element hr %}\n        {% endelement %}\n        {% element button href=signup_by_passkey_url tags=\"prominent,signup,outline,primary\" %}\n            {% trans \"Sign up using a passkey\" %}\n        {% endelement %}\n    {% endif %}\n    {% if SOCIALACCOUNT_ENABLED %}\n        {% include \"socialaccount/snippets/login.html\" with page_layout=\"entrance\" %}\n    {% endif %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/signup_by_passkey.html",
    "content": "{% extends \"account/base_entrance.html\" %}\n{% load allauth i18n %}\n{% block head_title %}\n    {% trans \"Signup\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Passkey Sign Up\" %}\n    {% endelement %}\n    {% setvar link %}\n        <a href=\"{{ login_url }}\">\n        {% endsetvar %}\n        {% setvar end_link %}\n        </a>\n    {% endsetvar %}\n    {% element p %}\n        {% blocktranslate %}Already have an account? Then please {{ link }}sign in{{ end_link }}.{% endblocktranslate %}\n    {% endelement %}\n    {% url 'account_signup_by_passkey' as action_url %}\n    {% element form form=form method=\"post\" action=action_url tags=\"entrance,signup\" %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=form unlabeled=True %}\n            {% endelement %}\n            {{ redirect_field }}\n        {% endslot %}\n        {% slot actions %}\n            {% element button tags=\"prominent,signup\" type=\"submit\" %}\n                {% trans \"Sign Up\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n    {% element hr %}\n    {% endelement %}\n    {% element button href=signup_url tags=\"prominent,signup,outline,primary\" %}\n        {% trans \"Other options\" %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/signup_closed.html",
    "content": "{% extends \"account/base_entrance.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Sign Up Closed\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Sign Up Closed\" %}\n    {% endelement %}\n    {% element p %}\n        {% trans \"We are sorry, but the sign up is currently closed.\" %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/snippets/already_logged_in.html",
    "content": "{% load i18n %}\n{% load account %}\n{% load allauth %}\n{% user_display user as user_display %}\n{% element alert %}\n    {% slot message %}\n        <strong>{% blocktranslate %}Note{% endblocktranslate %}:</strong> {% blocktranslate %}You are already logged in as {{ user_display }}.{% endblocktranslate %}\n    {% endslot %}\n{% endelement %}\n"
  },
  {
    "path": "allauth/templates/account/snippets/warn_no_email.html",
    "content": "{% load i18n allauth %}\n{% element p %}\n    <strong>{% trans 'Warning:' %}</strong> {% trans \"You currently do not have any email address set up. You should really add an email address so you can receive notifications, reset your password, etc.\" %}\n{% endelement %}\n"
  },
  {
    "path": "allauth/templates/account/verification_sent.html",
    "content": "{% extends \"account/base_entrance.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Verify Your Email Address\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Verify Your Email Address\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktrans %}We have sent an email to you for verification. Follow the link provided to finalize the signup process. If you do not see the verification email in your main inbox, check your spam folder. Please contact us if you do not receive the verification email within a few minutes.{% endblocktrans %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/account/verified_email_required.html",
    "content": "{% extends \"account/base_manage.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Verify Your Email Address\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Verify Your Email Address\" %}\n    {% endelement %}\n    {% url 'account_email' as email_url %}\n    {% element p %}\n        {% blocktrans %}This part of the site requires us to verify that\nyou are who you claim to be. For this purpose, we require that you\nverify ownership of your email address. {% endblocktrans %}\n    {% endelement %}\n    {% element p %}\n        {% blocktrans %}We have sent an email to you for\nverification. Please click on the link inside that email. If you do not see the verification email in your main inbox, check your spam folder. Otherwise\ncontact us if you do not receive it within a few minutes.{% endblocktrans %}\n    {% endelement %}\n    {% element p %}\n        {% blocktrans %}<strong>Note:</strong> you can still <a href=\"{{ email_url }}\">change your email address</a>.{% endblocktrans %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/allauth/elements/alert.html",
    "content": "{% load allauth %}\n<p>\n    {% slot message %}\n    {% endslot %}\n</p>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/badge.html",
    "content": "{% load allauth %}\n<strong {% if attrs.title %}title=\"{{ attrs.title }}\"{% endif %}>\n    {% slot %}\n    {% endslot %}\n</strong>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/button.html",
    "content": "{% load allauth %}\n{% comment %} djlint:off {% endcomment %}\n<{% if attrs.href %}a href=\"{{ attrs.href }}\"{% else %}button{% endif %}\n{% if attrs.form %}form=\"{{ attrs.form }}\"{% endif %}\n{% if attrs.id %}id=\"{{ attrs.id }}\"{% endif %}\n{% if attrs.name %}name=\"{{ attrs.name }}\"{% endif %}\n{% if attrs.value %}value=\"{{ attrs.value }}\"{% endif %}\n{% if attrs.type %}type=\"{{ attrs.type }}\"{% endif %}\n>\n{% slot %}\n{% endslot %}\n</{% if attrs.href %}a{% else %}button{% endif %}>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/button_group.html",
    "content": "{% load allauth %}\n<div>\n    {% slot %}\n    {% endslot %}\n</div>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/details.html",
    "content": "{% load allauth %}\n<details {% if attrs.open %}open{% endif %}>\n    <summary>\n        {% slot summary %}\n        {% endslot %}\n    </summary>\n    {% slot body %}\n    {% endslot %}\n</details>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/field.html",
    "content": "{% load allauth %}\n{{ attrs.errors }}\n<p>\n    {% if attrs.type == \"textarea\" %}\n        <label for=\"{{ attrs.id }}\">\n            {% slot label %}\n            {% endslot %}\n        </label>\n        <textarea {% if attrs.required %}required{% endif %}\n                  {% if attrs.rows %}rows=\"{{ attrs.rows }}\"{% endif %}\n                  {% if attrs.disabled %}disabled{% endif %}\n                  {% if attrs.readonly %}readonly{% endif %}\n                  {% if attrs.checked %}checked{% endif %}\n                  {% if attrs.name %}name=\"{{ attrs.name }}\"{% endif %}\n                  {% if attrs.id %}id=\"{{ attrs.id }}\"{% endif %}\n                  {% if attrs.placeholder %}placeholder=\"{{ attrs.placeholder }}\"{% endif %}>{% slot value %}{% endslot %}</textarea>\n    {% else %}\n        {% if attrs.type != \"checkbox\" and attrs.type != \"radio\" %}\n            <label for=\"{{ attrs.id }}\">\n                {% slot label %}\n                {% endslot %}\n            </label>\n        {% endif %}\n        <input {% if attrs.required %}required{% endif %}\n               {% if attrs.disabled %}disabled{% endif %}\n               {% if attrs.readonly %}readonly{% endif %}\n               {% if attrs.checked %}checked{% endif %}\n               {% if attrs.name %}name=\"{{ attrs.name }}\"{% endif %}\n               {% if attrs.id %}id=\"{{ attrs.id }}\"{% endif %}\n               {% if attrs.placeholder %}placeholder=\"{{ attrs.placeholder }}\"{% endif %}\n               {% if attrs.autocomplete %}autocomplete=\"{{ attrs.autocomplete }}\"{% endif %}\n               {% if attrs.value is not None %}value=\"{{ attrs.value }}\"{% endif %}\n               type=\"{{ attrs.type }}\">\n        {% if attrs.type == \"checkbox\" or attrs.type == \"radio\" %}\n            <label for=\"{{ attrs.id }}\">\n                {% slot label %}\n                {% endslot %}\n            </label>\n        {% endif %}\n    {% endif %}\n    {% if slots.help_text %}\n        <span>\n            {% slot help_text %}\n            {% endslot %}\n        </span>\n    {% endif %}\n</p>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/fields.html",
    "content": "{{ attrs.form.as_p }}\n"
  },
  {
    "path": "allauth/templates/allauth/elements/form.html",
    "content": "{% load allauth %}\n<form method=\"{{ attrs.method }}\"\n      {% if attrs.action %}action=\"{{ attrs.action }}\"{% endif %}>\n    {% slot body %}\n    {% endslot %}\n    {% slot actions %}\n    {% endslot %}\n</form>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/h1.html",
    "content": "{% comment %} djlint:off {% endcomment %}{% load allauth %}<h1>{% slot %}{% endslot %}</h1>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/h2.html",
    "content": "{% comment %} djlint:off {% endcomment %}{% load allauth %}<h2>{% slot %}{% endslot %}</h2>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/hr.html",
    "content": "<hr>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/img.html",
    "content": "<img src=\"{{ attrs.src }}\"\n     {% if attrs.alt %}alt=\"{{ attrs.alt }}\"{% endif %}>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/p.html",
    "content": "{% comment %} djlint:off {% endcomment %}{% load allauth %}<p>{% slot %}{% endslot %}</p>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/panel.html",
    "content": "{% load allauth %}\n<section>\n    <h2>\n        {% slot title %}\n        {% endslot %}\n    </h2>\n    {% slot body %}\n    {% endslot %}\n    {% if slots.actions %}\n        <ul>\n            {% for action in slots.actions %}<li>{{ action }}</li>{% endfor %}\n        </ul>\n    {% endif %}\n</section>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/provider.html",
    "content": "<li>\n    <a title=\"{{ attrs.name }}\" href=\"{{ attrs.href }}\">{{ attrs.name }}</a>\n</li>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/provider_list.html",
    "content": "{% load allauth %}\n<ul>\n    {% slot %}\n    {% endslot %}\n</ul>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/table.html",
    "content": "{% load allauth %}\n<table>\n    {% slot %}\n    {% endslot %}\n</table>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/tbody.html",
    "content": "{% load allauth %}\n<tbody>\n    {% slot %}\n    {% endslot %}\n</tbody>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/td.html",
    "content": "{% load allauth %}\n<td {% if attrs.align %}align=\"{{ attrs.align }}\"{% endif %}>\n    {% slot %}\n    {% endslot %}\n</td>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/th.html",
    "content": "{% load allauth %}\n<th>\n    {% slot %}\n    {% endslot %}\n</th>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/thead.html",
    "content": "{% load allauth %}\n<thead>\n    {% slot %}\n    {% endslot %}\n</thead>\n"
  },
  {
    "path": "allauth/templates/allauth/elements/tr.html",
    "content": "{% load allauth %}\n<tr>\n    {% slot %}\n    {% endslot %}\n</tr>\n"
  },
  {
    "path": "allauth/templates/allauth/layouts/base.html",
    "content": "{% load i18n %}\n<!DOCTYPE html>\n<html>\n    <head>\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n        <title>\n            {% block head_title %}\n            {% endblock head_title %}\n        </title>\n        {% block extra_head %}\n        {% endblock extra_head %}\n    </head>\n    <body>\n        {% block body %}\n            {% if messages %}\n                <div>\n                    <strong>{% trans \"Messages:\" %}</strong>\n                    <ul>\n                        {% for message in messages %}<li>{{ message }}</li>{% endfor %}\n                    </ul>\n                </div>\n            {% endif %}\n            <div>\n                <strong>{% trans \"Menu:\" %}</strong>\n                <ul>\n                    {% if user.is_authenticated %}\n                        {% url 'account_email' as email_url_ %}\n                        {% if email_url_ %}\n                            <li>\n                                <a href=\"{{ email_url_ }}\">{% trans \"Change Email\" %}</a>\n                            </li>\n                        {% endif %}\n                        {% url 'account_change_password' as change_password_url_ %}\n                        {% if change_password_url_ %}\n                            <li>\n                                <a href=\"{{ change_password_url_ }}\">{% trans \"Change Password\" %}</a>\n                            </li>\n                        {% endif %}\n                        {% url 'socialaccount_connections' as connections_url_ %}\n                        {% if connections_url_ %}\n                            <li>\n                                <a href=\"{{ connections_url_ }}\">{% trans \"Account Connections\" %}</a>\n                            </li>\n                        {% endif %}\n                        {% url 'mfa_index' as mfa_url_ %}\n                        {% if mfa_url_ %}\n                            <li>\n                                <a href=\"{{ mfa_url_ }}\">{% trans \"Two-Factor Authentication\" %}</a>\n                            </li>\n                        {% endif %}\n                        {% url 'usersessions_list' as usersessions_list_url_ %}\n                        {% if usersessions_list_url_ %}\n                            <li>\n                                <a href=\"{{ usersessions_list_url_ }}\">{% trans \"Sessions\" %}</a>\n                            </li>\n                        {% endif %}\n                        {% url 'account_logout' as logout_url_ %}\n                        {% if logout_url_ %}\n                            <li>\n                                <a href=\"{{ logout_url_ }}\">{% trans \"Sign Out\" %}</a>\n                            </li>\n                        {% endif %}\n                    {% else %}\n                        {% url 'account_login' as login_url_ %}\n                        {% if login_url_ %}\n                            <li>\n                                <a href=\"{{ login_url_ }}\">{% trans \"Sign In\" %}</a>\n                            </li>\n                        {% endif %}\n                        {% url 'account_signup' as signup_url_ %}\n                        {% if signup_url_ %}\n                            <li>\n                                <a href=\"{{ signup_url_ }}\">{% trans \"Sign Up\" %}</a>\n                            </li>\n                        {% endif %}\n                    {% endif %}\n                </ul>\n            </div>\n            {% block content %}\n            {% endblock content %}\n        {% endblock body %}\n        {% block extra_body %}\n        {% endblock extra_body %}\n    </body>\n</html>\n"
  },
  {
    "path": "allauth/templates/allauth/layouts/entrance.html",
    "content": "{% extends \"allauth/layouts/base.html\" %}\n{% block content %}{% endblock %}\n"
  },
  {
    "path": "allauth/templates/allauth/layouts/manage.html",
    "content": "{% extends \"allauth/layouts/base.html\" %}\n{% block content %}{% endblock %}\n"
  },
  {
    "path": "allauth/templates/idp/oidc/authorization_form.html",
    "content": "{% extends \"idp/oidc/base.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Authorize\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Authorize\" %} {{ client.name }}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate with client_name=client.name site_name=site.name %}{{ client_name }} wants to access your {{ site_name }} account.{% endblocktranslate %}\n    {% endelement %}\n    {% url 'idp:openid_connect:authorize' as authorize_url %}\n    {% element form method=\"post\" action=authorize_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {{ form }}\n        {% endslot %}\n        {% slot actions %}\n            {% element button_group %}\n                {% element button name=\"action\" value=\"grant\" type=\"submit\" tags=\"primary,consent\" %}\n                    {% translate \"Authorize\" %}\n                {% endelement %}\n                {% element button name=\"action\" value=\"cancel\" type=\"submit\" tags=\"outline,consent\" %}\n                    {% translate \"Cancel\" %}\n                {% endelement %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/idp/oidc/base.html",
    "content": "{% extends \"allauth/layouts/entrance.html\" %}\n"
  },
  {
    "path": "allauth/templates/idp/oidc/device_authorization_code_form.html",
    "content": "{% extends \"idp/oidc/base.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Authorize\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Enter Device Code\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate %}Enter the code displayed on your device.{% endblocktranslate %}\n    {% endelement %}\n    {% element form method=\"get\" action=authorization_url %}\n        {% slot body %}\n            {% element fields form=form unlabeled=True %}\n            {% endelement %}\n        {% endslot %}\n        {% slot actions %}\n            {% element button type=\"submit\" tags=\"primary\" %}\n                {% translate \"Continue\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/idp/oidc/device_authorization_confirm_form.html",
    "content": "{% extends \"idp/oidc/base.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Authorize\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Confirm Device\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate with client_name=client.name %}Please confirm the code shown on your {{ client_name }} to authorize this device.{% endblocktranslate %}\n    {% endelement %}\n    {% element field type=\"text\" value=user_code disabled=True %}\n        {% slot label %}\n            {% translate \"Code\" %}\n        {% endslot %}\n    {% endelement %}\n    {% element form method=\"post\" action=authorization_url %}\n        {% slot body %}\n            {{ form }}\n        {% endslot %}\n        {% slot actions %}\n            {% element button_group %}\n                {% element button name=\"action\" value=\"confirm\" type=\"submit\" tags=\"primary,consent\" %}\n                    {% translate \"Confirm\" %}\n                {% endelement %}\n                {% element button name=\"action\" value=\"deny\" type=\"submit\" tags=\"outline,consent\" %}\n                    {% translate \"Deny\" %}\n                {% endelement %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/idp/oidc/device_authorization_confirmed.html",
    "content": "{% extends \"idp/oidc/base.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Authorize\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Device Authorized\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate with client_name=client.name %}You successfully authorized your {{ client_name }} device.{% endblocktranslate %}\n    {% endelement %}\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/idp/oidc/device_authorization_denied.html",
    "content": "{% extends \"idp/oidc/base.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Authorize\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Device Denied\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate with client_name=client.name %}Authorization for your {{ client_name }} device has been denied.{% endblocktranslate %}\n    {% endelement %}\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/idp/oidc/error.html",
    "content": "{% extends \"idp/oidc/base.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Error\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Error\" %}\n    {% endelement %}\n    {% if error_form %}\n        {{ error_form.errors }}\n    {% else %}\n        {% element p %}\n            {{ error.description }}\n        {% endelement %}\n    {% endif %}\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/idp/oidc/logout.html",
    "content": "{% extends \"idp/oidc/base.html\" %}\n{% load allauth i18n %}\n{% block head_title %}\n    {% trans \"Sign Out\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Sign Out\" %}\n    {% endelement %}\n    {% element p %}\n        {% trans 'Are you sure you want to sign out?' %}\n    {% endelement %}\n    {% url 'idp:oidc:logout' as action_url %}\n    {% element form method=\"post\" action=action_url no_visible_fields=True %}\n        {% slot body %}\n            {% csrf_token %}\n            {{ form }}\n        {% endslot %}\n        {% slot actions %}\n            {% element button name=\"action\" value=\"logout\" type=\"submit\" %}\n                {% trans 'Sign Out' %}\n            {% endelement %}\n            {% element button name=\"action\" value=\"stay\" tags=\"secondary\" type=\"submit\" %}\n                {% trans 'Stay Signed In' %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/mfa/authenticate.html",
    "content": "{% extends \"mfa/base_entrance.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% load allauth static %}\n{% block head_title %}\n    {% trans \"Sign In\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Two-Factor Authentication\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate %}Your account is protected by two-factor authentication. Please enter an authenticator code:{% endblocktranslate %}\n    {% endelement %}\n    {% url 'mfa_authenticate' as action_url %}\n    {% element form form=form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=form unlabeled=True %}\n            {% endelement %}\n        {% endslot %}\n        {% slot actions %}\n            {% element button type=\"submit\" tags=\"primary,mfa,login\" %}\n                {% trans \"Sign In\" %}\n            {% endelement %}\n            {% if \"webauthn\" not in MFA_SUPPORTED_TYPES %}\n                {% element button type=\"submit\" form=\"logout-from-stage\" tags=\"link,mfa,cancel\" %}\n                    {% trans \"Cancel\" %}\n                {% endelement %}\n            {% endif %}\n        {% endslot %}\n    {% endelement %}\n    {% if \"webauthn\" in MFA_SUPPORTED_TYPES %}\n        {% element hr %}\n        {% endelement %}\n        {% element h2 %}\n            {% translate \"Alternative options\" %}\n        {% endelement %}\n        {% element button_group vertical=True %}\n            {% element button form=\"webauthn_form\" id=\"mfa_webauthn_authenticate\" type=\"button\" tags=\"outline,primary\" %}\n                {% trans \"Use a security key\" %}\n            {% endelement %}\n            {% element button type=\"submit\" form=\"logout-from-stage\" tags=\"outline,primary,mfa,cancel\" %}\n                {% trans \"Cancel\" %}\n            {% endelement %}\n        {% endelement %}\n        {% if \"webauthn\" in MFA_SUPPORTED_TYPES %}\n            {% element form id=\"webauthn_form\" form=webauthn_form method=\"post\" action=action_url no_visible_fields=True %}\n                {% slot body %}\n                    {% csrf_token %}\n                    {% element fields form=webauthn_form %}\n                    {% endelement %}\n                {% endslot %}\n            {% endelement %}\n            {{ js_data|json_script:\"js_data\" }}\n            {% include \"mfa/webauthn/snippets/scripts.html\" %}\n            <script data-allauth-onload=\"allauth.webauthn.forms.authenticateForm\" type=\"application/json\">{\n    \"ids\": {\n        \"authenticate\": \"mfa_webauthn_authenticate\",\n        \"credential\": \"{{ webauthn_form.credential.auto_id }}\",\n        \"data\": \"js_data\"\n    }\n}\n            </script>\n        {% endif %}\n    {% endif %}\n    <form id=\"logout-from-stage\"\n          method=\"post\"\n          action=\"{% url 'account_logout' %}\">\n        <input type=\"hidden\" name=\"next\" value=\"{% url 'account_login' %}\">\n        {% csrf_token %}\n    </form>\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/mfa/base_entrance.html",
    "content": "{% extends \"allauth/layouts/entrance.html\" %}\n"
  },
  {
    "path": "allauth/templates/mfa/base_manage.html",
    "content": "{% extends \"allauth/layouts/manage.html\" %}\n"
  },
  {
    "path": "allauth/templates/mfa/email/recovery_codes_generated_message.txt",
    "content": "{% extends \"account/email/base_notification.txt\" %}\n{% load i18n %}\n\n{% block notification_message %}{% blocktrans %}A new set of Two-Factor Authentication recovery codes has been generated.{% endblocktrans %}{% endblock notification_message %}\n"
  },
  {
    "path": "allauth/templates/mfa/email/recovery_codes_generated_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}New Recovery Codes Generated{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/mfa/email/totp_activated_message.txt",
    "content": "{% extends \"account/email/base_notification.txt\" %}\n{% load i18n %}\n\n{% block notification_message %}{% blocktrans %}Authenticator app activated.{% endblocktrans %}{% endblock notification_message %}\n"
  },
  {
    "path": "allauth/templates/mfa/email/totp_activated_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Authenticator App Activated{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/mfa/email/totp_deactivated_message.txt",
    "content": "{% extends \"account/email/base_notification.txt\" %}\n{% load i18n %}\n\n{% block notification_message %}{% blocktrans %}Authenticator app deactivated.{% endblocktrans %}{% endblock notification_message %}\n"
  },
  {
    "path": "allauth/templates/mfa/email/totp_deactivated_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Authenticator App Deactivated{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/mfa/email/webauthn_added_message.txt",
    "content": "{% extends \"account/email/base_notification.txt\" %}\n{% load i18n %}\n\n{% block notification_message %}{% blocktrans %}A new security key has been added.{% endblocktrans %}{% endblock notification_message %}\n"
  },
  {
    "path": "allauth/templates/mfa/email/webauthn_added_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Security Key Added{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/mfa/email/webauthn_removed_message.txt",
    "content": "{% extends \"account/email/base_notification.txt\" %}\n{% load i18n %}\n\n{% block notification_message %}{% blocktrans %}A security key has been removed.{% endblocktrans %}{% endblock notification_message %}\n"
  },
  {
    "path": "allauth/templates/mfa/email/webauthn_removed_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Security Key Removed{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/mfa/index.html",
    "content": "{% extends \"mfa/base_manage.html\" %}\n{% load allauth %}\n{% load i18n %}\n{% block head_title %}\n    {% trans \"Two-Factor Authentication\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 tags=\"mfa,index\" %}\n        {% trans \"Two-Factor Authentication\" %}\n    {% endelement %}\n    {% if \"totp\" in MFA_SUPPORTED_TYPES %}\n        {% element panel %}\n            {% slot title %}\n                {% translate \"Authenticator App\" %}\n            {% endslot %}\n            {% slot body %}\n                {% if authenticators.totp %}\n                    {% element p %}\n                        {% translate \"Authentication using an authenticator app is active.\" %}\n                    {% endelement %}\n                {% else %}\n                    {% element p %}\n                        {% translate \"An authenticator app is not active.\" %}\n                    {% endelement %}\n                {% endif %}\n            {% endslot %}\n            {% slot actions %}\n                {% url 'mfa_deactivate_totp' as deactivate_url %}\n                {% url 'mfa_activate_totp' as activate_url %}\n                {% if authenticators.totp %}\n                    {% element button href=deactivate_url tags=\"danger,delete,panel\" %}\n                        {% translate \"Deactivate\" %}\n                    {% endelement %}\n                {% else %}\n                    {% element button href=activate_url tags=\"panel\" %}\n                        {% translate \"Activate\" %}\n                    {% endelement %}\n                {% endif %}\n            {% endslot %}\n        {% endelement %}\n    {% endif %}\n    {% if \"webauthn\" in MFA_SUPPORTED_TYPES %}\n        {% element panel %}\n            {% slot title %}\n                {% translate \"Security Keys\" %}\n            {% endslot %}\n            {% slot body %}\n                {% if authenticators.webauthn|length %}\n                    {% element p %}\n                        {% blocktranslate count count=authenticators.webauthn|length %}You have added {{ count }} security key.{% plural %}You have added {{ count }} security keys.{% endblocktranslate %}\n                    {% endelement %}\n                {% else %}\n                    {% element p %}\n                        {% translate \"No security keys have been added.\" %}\n                    {% endelement %}\n                {% endif %}\n            {% endslot %}\n            {% slot actions %}\n                {% if authenticators.webauthn|length %}\n                    {% url 'mfa_list_webauthn' as webauthn_list_url %}\n                    {% element button href=webauthn_list_url %}\n                        {% translate \"Manage\" %}\n                    {% endelement %}\n                {% else %}\n                    {% url 'mfa_add_webauthn' as webauthn_add_url %}\n                    {% element button href=webauthn_add_url %}\n                        {% translate \"Add\" %}\n                    {% endelement %}\n                {% endif %}\n            {% endslot %}\n        {% endelement %}\n    {% endif %}\n    {% if \"recovery_codes\" in MFA_SUPPORTED_TYPES %}\n        {% with total_count=authenticators.recovery_codes.generate_codes|length unused_count=authenticators.recovery_codes.get_unused_codes|length %}\n            {% element panel %}\n                {% slot title %}\n                    {% translate \"Recovery Codes\" %}\n                {% endslot %}\n                {% slot body %}\n                    {% if authenticators.recovery_codes %}\n                        {% element p %}\n                            {% blocktranslate count unused_count=unused_count %}There is {{ unused_count }} out of {{ total_count }} recovery codes available.{% plural %}There are {{ unused_count }} out of {{ total_count }} recovery codes available.{% endblocktranslate %}\n                        {% endelement %}\n                    {% else %}\n                        {% element p %}\n                            {% translate \"No recovery codes set up.\" %}\n                        {% endelement %}\n                    {% endif %}\n                {% endslot %}\n                {% if is_mfa_enabled %}\n                    {% if authenticators.recovery_codes %}\n                        {% if unused_count > 0 %}\n                            {% slot actions %}\n                                {% url 'mfa_view_recovery_codes' as view_url %}\n                                {% element button href=view_url tags=\"panel\" %}\n                                    {% translate \"View\" %}\n                                {% endelement %}\n                            {% endslot %}\n                            {% slot actions %}\n                                {% url 'mfa_download_recovery_codes' as download_url %}\n                                {% element button href=download_url tags=\"secondary,panel\" %}\n                                    {% translate \"Download\" %}\n                                {% endelement %}\n                            {% endslot %}\n                        {% endif %}\n                    {% endif %}\n                    {% slot actions %}\n                        {% url 'mfa_generate_recovery_codes' as generate_url %}\n                        {% element button href=generate_url tags=\"secondary,panel\" %}\n                            {% translate \"Generate\" %}\n                        {% endelement %}\n                    {% endslot %}\n                {% endif %}\n            {% endelement %}\n        {% endwith %}\n    {% endif %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/mfa/messages/recovery_codes_generated.txt",
    "content": "{% load i18n %}\n{% blocktrans %}A new set of recovery codes has been generated.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/mfa/messages/totp_activated.txt",
    "content": "{% load i18n %}\n{% blocktrans %}Authenticator app activated.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/mfa/messages/totp_deactivated.txt",
    "content": "{% load i18n %}\n{% blocktrans %}Authenticator app deactivated.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/mfa/messages/webauthn_added.txt",
    "content": "{% load i18n %}\n{% blocktrans %}Security key added.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/mfa/messages/webauthn_removed.txt",
    "content": "{% load i18n %}\n{% blocktrans %}Security key removed.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/mfa/reauthenticate.html",
    "content": "{% extends \"account/base_reauthenticate.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block reauthenticate_content %}\n    {% element p %}\n        {% blocktranslate %}Enter an authenticator code:{% endblocktranslate %}\n    {% endelement %}\n    {% url 'mfa_reauthenticate' as action_url %}\n    {% element form form=form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=form unlabeled=True %}\n            {% endelement %}\n            {{ redirect_field }}\n        {% endslot %}\n        {% slot actions %}\n            {% element button type=\"submit\" tags=\"primary,mfa,login\" %}\n                {% trans \"Confirm\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/mfa/recovery_codes/base.html",
    "content": "{% extends \"mfa/base_manage.html\" %}\n{% load i18n %}\n{% block head_title %}\n    {% trans \"Recovery Codes\" %}\n{% endblock head_title %}\n"
  },
  {
    "path": "allauth/templates/mfa/recovery_codes/download.txt",
    "content": "{% for code in unused_codes %}{{ code }}\n{% endfor %}\n"
  },
  {
    "path": "allauth/templates/mfa/recovery_codes/generate.html",
    "content": "{% extends \"mfa/recovery_codes/base.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block content %}\n    {% element h1 %}\n        {% translate \"Recovery Codes\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate %}You are about to generate a new set of recovery codes for your account.{% endblocktranslate %}\n        {% if unused_code_count %}\n            {% blocktranslate %}This action will invalidate your existing codes.{% endblocktranslate %}\n        {% endif %}\n        {% blocktranslate %}Are you sure?{% endblocktranslate %}\n    {% endelement %}\n    {% url 'mfa_generate_recovery_codes' as action_url %}\n    {% element form method=\"post\" action=action_url no_visible_fields=True %}\n        {% slot body %}\n            {% csrf_token %}\n            {{ form.as_p }}\n        {% endslot %}\n        {% slot actions %}\n            {% setvar tags %}\n                {% if unused_code_count %}\n                    danger\n                {% else %}\n                {% endif %}\n            {% endsetvar %}\n            {% element button type=\"submit\" tags=tags %}\n                {% trans \"Generate\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/mfa/recovery_codes/index.html",
    "content": "{% extends \"mfa/recovery_codes/base.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block content %}\n    {% element h1 %}\n        {% translate \"Recovery Codes\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate count unused_count=unused_codes|length %}There is {{ unused_count }} out of {{ total_count }} recovery codes available.{% plural %}There are {{ unused_count }} out of {{ total_count }} recovery codes available.{% endblocktranslate %}\n    {% endelement %}\n    {% element field id=\"recovery_codes\" type=\"textarea\" disabled=True rows=unused_codes|length readonly=True %}\n        {% slot label %}\n            {% translate \"Unused codes\" %}\n        {% endslot %}\n        {% comment %} djlint:off {% endcomment %}\n    {% slot value %}{% for code in unused_codes %}{% if forloop.counter0 %}\n{% endif %}{{ code }}{% endfor %}{% endslot %}\n{% comment %} djlint:on {% endcomment %}\n{% endelement %}\n{% if unused_codes %}\n{% url 'mfa_download_recovery_codes' as download_url %}\n{% element button href=download_url %}\n{% translate \"Download codes\" %}\n{% endelement %}\n{% endif %}\n{% url 'mfa_generate_recovery_codes' as generate_url %}\n{% element button href=generate_url %}\n{% translate \"Generate new codes\" %}\n{% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/mfa/totp/activate_form.html",
    "content": "{% extends \"mfa/totp/base.html\" %}\n{% load allauth i18n %}\n{% block head_title %}\n    {% translate \"Activate Authenticator App\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% translate \"Activate Authenticator App\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate %}To protect your account with two-factor authentication, scan the QR code below with your authenticator app. Then, input the verification code generated by the app below.{% endblocktranslate %}\n    {% endelement %}\n    {% url 'mfa_activate_totp' as action_url %}\n    {% element form form=form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% element img src=totp_svg_data_uri alt=form.secret tags=\"mfa,totp,qr\" %}\n            {% endelement %}\n            {% csrf_token %}\n            {% element field id=\"authenticator_secret\" type=\"text\" value=form.secret disabled=True %}\n                {% slot label %}\n                    {% translate \"Authenticator secret\" %}\n                {% endslot %}\n                {% slot help_text %}\n                    {% translate \"You can store this secret and use it to reinstall your authenticator app at a later time.\" %}\n                {% endslot %}\n            {% endelement %}\n            {% element fields form=form %}\n            {% endelement %}\n        {% endslot %}\n        {% slot actions %}\n            {% element button type=\"submit\" %}\n                {% trans \"Activate\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/mfa/totp/base.html",
    "content": "{% extends \"mfa/base_manage.html\" %}\n{% load i18n %}\n{% block head_title %}\n    {% trans \"Authenticator App\" %}\n{% endblock head_title %}\n"
  },
  {
    "path": "allauth/templates/mfa/totp/deactivate_form.html",
    "content": "{% extends \"mfa/totp/base.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Deactivate Authenticator App\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Deactivate Authenticator App\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate %}You are about to deactivate authenticator app based authentication. Are you sure?{% endblocktranslate %}\n    {% endelement %}\n    {% url 'mfa_deactivate_totp' as action_url %}\n    {% element form form=form method=\"post\" action=action_url no_visible_fields=True %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=form %}\n                {{ form.as_p }}\n            {% endelement %}\n        {% endslot %}\n        {% slot actions %}\n            {% element button tags=\"danger,delete\" type=\"submit\" %}\n                {% trans \"Deactivate\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/mfa/trust.html",
    "content": "{% extends \"mfa/base_entrance.html\" %}\n{% load i18n allauth static %}\n{% block head_title %}\n    {% trans \"Trust this Browser?\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Trust this Browser?\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate %}If you choose to trust this browser, you will not be asked for a verification code the next time you sign in.{% endblocktranslate %}\n    {% endelement %}\n    {% url 'mfa_trust' as action_url %}\n    {% element form form=form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=form unlabeled=True %}\n            {% endelement %}\n        {% endslot %}\n        {% slot actions %}\n            {% element button_group %}\n                {% element button name=\"action\" value=\"trust\" type=\"submit\" tags=\"primary,mfa,trust\" %}\n                    {% blocktranslate with period=trust_until|timeuntil:trust_from %}Trust for {{ period }}{% endblocktranslate %}\n                {% endelement %}\n                {% element button name=\"action\" value=\"skip\" type=\"submit\" tags=\"outline,mfa,trust\" %}\n                    {% trans \"Don't Trust\" %}\n                {% endelement %}\n                {% element button type=\"submit\" form=\"logout-from-stage\" tags=\"outline,mfa,trust,cancel\" %}\n                    {% trans \"Cancel\" %}\n                {% endelement %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n    <form id=\"logout-from-stage\"\n          method=\"post\"\n          action=\"{% url 'account_logout' %}\">\n        <input type=\"hidden\" name=\"next\" value=\"{% url 'account_login' %}\">\n        {% csrf_token %}\n    </form>\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/mfa/webauthn/add_form.html",
    "content": "{% extends \"mfa/webauthn/base.html\" %}\n{% load i18n %}\n{% load static %}\n{% load allauth %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Add Security Key\" %}\n    {% endelement %}\n    {% url 'mfa_add_webauthn' as action_url %}\n    {% element form form=form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=form %}\n            {% endelement %}\n        {% endslot %}\n        {% slot actions %}\n            {% element button id=\"mfa_webauthn_add\" type=\"button\" %}\n                {% trans \"Add\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n    {% include \"mfa/webauthn/snippets/scripts.html\" %}\n    {{ js_data|json_script:\"js_data\" }}\n    <script data-allauth-onload=\"allauth.webauthn.forms.addForm\" type=\"application/json\">{\n    \"ids\": {\n        \"add\": \"mfa_webauthn_add\",\n        \"passwordless\": \"{{ form.passwordless.auto_id }}\",\n        \"credential\": \"{{ form.credential.auto_id }}\",\n        \"data\": \"js_data\"\n    }\n}\n    </script>\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/mfa/webauthn/authenticator_confirm_delete.html",
    "content": "{% extends \"mfa/webauthn/base.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Remove Security Key\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate %}Are you sure you want to remove this security key?{% endblocktranslate %}\n    {% endelement %}\n    {% url 'mfa_remove_webauthn' pk=authenticator.pk as action_url %}\n    {% element form method=\"post\" action=action_url no_visible_fields=True %}\n        {% slot actions %}\n            {% csrf_token %}\n            {% element button tags=\"danger\" type=\"submit\" %}\n                {% translate \"Remove\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/mfa/webauthn/authenticator_list.html",
    "content": "{% extends \"mfa/webauthn/base.html\" %}\n{% load i18n %}\n{% load static %}\n{% load allauth %}\n{% load humanize %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Security Keys\" %}\n    {% endelement %}\n    {% if authenticators|length == 0 %}\n        {% element p %}\n            {% blocktranslate %}No security keys have been added.{% endblocktranslate %}\n        {% endelement %}\n    {% else %}\n        {% element table %}\n            {% element thead %}\n                {% element th %}\n                    {% translate \"Key\" %}\n                {% endelement %}\n                {% element th %}\n                    {% translate \"Usage\" %}\n                {% endelement %}\n                {% element th %}\n                {% endelement %}\n            {% endelement %}\n            {% element tbody %}\n                {% for authenticator in authenticators %}\n                    {% element tr %}\n                        {% element td %}\n                            {{ authenticator }}\n                            {% if authenticator.wrap.is_passwordless is True %}\n                                {% element badge tags=\"mfa,key,primary\" %}\n                                    {% translate \"Passkey\" %}\n                                {% endelement %}\n                            {% elif authenticator.wrap.is_passwordless is False %}\n                                {% element badge tags=\"mfa,key,secondary\" %}\n                                    {% translate \"Security key\" %}\n                                {% endelement %}\n                            {% else %}\n                                {% element badge title=_(\"This key does not indicate whether it is a passkey.\") tags=\"mfa,key,warning\" %}\n                                    {% translate \"Unspecified\" %}\n                                {% endelement %}\n                            {% endif %}\n                        {% endelement %}\n                        {% element td %}\n                            {% blocktranslate with created_at=authenticator.created_at|date:\"SHORT_DATE_FORMAT\" %}Added on {{ created_at }}{% endblocktranslate %}.\n                            {% if authenticator.last_used_at %}\n                                {% blocktranslate with last_used=authenticator.last_used_at|naturaltime %}Last used {{ last_used }}{% endblocktranslate %}\n                            {% else %}\n                                Not used.\n                            {% endif %}\n                        {% endelement %}\n                        {% element td align=\"right\" %}\n                            {% url 'mfa_edit_webauthn' pk=authenticator.pk as edit_url %}\n                            {% element button tags=\"mfa,authenticator,edit,tool\" href=edit_url %}\n                                {% translate \"Edit\" %}\n                            {% endelement %}\n                            {% url 'mfa_remove_webauthn' pk=authenticator.pk as remove_url %}\n                            {% element button tags=\"mfa,authenticator,danger,delete,tool\" href=remove_url %}\n                                {% translate \"Remove\" %}\n                            {% endelement %}\n                        {% endelement %}\n                    {% endelement %}\n                {% endfor %}\n            {% endelement %}\n        {% endelement %}\n    {% endif %}\n    {% url 'mfa_add_webauthn' as add_url %}\n    {% element button href=add_url %}\n        {% translate \"Add\" %}\n    {% endelement %}\n</li>\n</ul>\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/mfa/webauthn/base.html",
    "content": "{% extends \"mfa/base_manage.html\" %}\n{% load i18n %}\n{% block head_title %}\n    {% trans \"Security Keys\" %}\n{% endblock head_title %}\n"
  },
  {
    "path": "allauth/templates/mfa/webauthn/edit_form.html",
    "content": "{% extends \"mfa/webauthn/base.html\" %}\n{% load i18n %}\n{% load static %}\n{% load allauth %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Edit Security Key\" %}\n    {% endelement %}\n    {% url 'mfa_edit_webauthn' as action_url %}\n    {% element form form=form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=form %}\n            {% endelement %}\n        {% endslot %}\n        {% slot actions %}\n            {% element button id=\"mfa_webauthn_edit\" type=\"submit\" %}\n                {% trans \"Save\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/mfa/webauthn/reauthenticate.html",
    "content": "{% extends \"account/base_reauthenticate.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block reauthenticate_content %}\n    {% url 'mfa_reauthenticate_webauthn' as action_url %}\n    {% element form form=form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=form unlabeled=True %}\n            {% endelement %}\n            {{ redirect_field }}\n        {% endslot %}\n        {% slot actions %}\n            {% element button id=\"mfa_webauthn_reauthenticate\" type=\"submit\" tags=\"primary,mfa,login\" %}\n                {% trans \"Use a security key\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n    {{ js_data|json_script:\"js_data\" }}\n    {% include \"mfa/webauthn/snippets/scripts.html\" %}\n    <script data-allauth-onload=\"allauth.webauthn.forms.authenticateForm\" type=\"application/json\">{\n    \"ids\": {\n        \"authenticate\": \"mfa_webauthn_reauthenticate\",\n        \"credential\": \"{{ form.credential.auto_id }}\",\n        \"data\": \"js_data\"\n    }\n}\n    </script>\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/mfa/webauthn/signup_form.html",
    "content": "{% extends \"account/base_entrance.html\" %}\n{% load i18n %}\n{% load static %}\n{% load allauth %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Create Passkey\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktranslate %}You are about to create a passkey for your account. As you can add additional keys later on, you can use a descriptive name to tell the keys apart.{% endblocktranslate %}\n    {% endelement %}\n    {% url 'mfa_signup_webauthn' as action_url %}\n    {% element form form=form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=form %}\n            {% endelement %}\n        {% endslot %}\n        {% slot actions %}\n            {% element button id=\"mfa_webauthn_signup\" type=\"button\" %}\n                {% trans \"Create\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n    {% element button type=\"submit\" form=\"logout-from-stage\" tags=\"link,cancel\" %}\n        {% translate \"Cancel\" %}\n    {% endelement %}\n    <form id=\"logout-from-stage\"\n          method=\"post\"\n          action=\"{% url 'account_logout' %}\">\n        <input type=\"hidden\" name=\"next\" value=\"{% url 'account_login' %}\">\n        {% csrf_token %}\n    </form>\n    {% include \"mfa/webauthn/snippets/scripts.html\" %}\n    {{ js_data|json_script:\"js_data\" }}\n    <script data-allauth-onload=\"allauth.webauthn.forms.signupForm\" type=\"application/json\">{\n    \"ids\": {\n        \"signup\": \"mfa_webauthn_signup\",\n        \"credential\": \"{{ form.credential.auto_id }}\",\n        \"data\": \"js_data\"\n    }\n}\n    </script>\n{% endblock %}\n"
  },
  {
    "path": "allauth/templates/mfa/webauthn/snippets/login_script.html",
    "content": "{% include \"mfa/webauthn/snippets/scripts.html\" %}\n<form id=\"mfa_login\" action=\"{% url 'mfa_login_webauthn' %}\" method=\"post\">\n    {% csrf_token %}\n    {{ redirect_field }}\n    <input type=\"hidden\" name=\"credential\" id=\"mfa_credential\">\n</form>\n<script data-allauth-onload=\"allauth.webauthn.forms.loginForm\" type=\"application/json\">{\n    \"ids\": {\n        \"login\": \"passkey_login\",\n        \"credential\": \"mfa_credential\"\n    }\n}\n</script>\n"
  },
  {
    "path": "allauth/templates/mfa/webauthn/snippets/scripts.html",
    "content": "{% load i18n static %}\n<noscript>{% translate \"This functionality requires JavaScript.\" %}\"</noscript>\n<script src=\"{% static 'mfa/js/webauthn-json.js' %}\"></script>\n<script src=\"{% static 'mfa/js/webauthn.js' %}\"></script>\n<script src=\"{% static 'account/js/onload.js' %}\"></script>\n"
  },
  {
    "path": "allauth/templates/openid/base.html",
    "content": "{% extends \"socialaccount/base_entrance.html\" %}\n"
  },
  {
    "path": "allauth/templates/openid/login.html",
    "content": "{% extends \"openid/base.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    OpenID {% translate \"Sign In\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        OpenID {% trans 'Sign In' %}\n    {% endelement %}\n    {% url 'openid_login' as action_url %}\n    {% element form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=form unlabeled=True %}\n            {% endelement %}\n        {% endslot %}\n        {% slot actions %}\n            {% element button type=\"submit\" %}\n                {% translate \"Sign In\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/authentication_error.html",
    "content": "{% extends \"socialaccount/base_entrance.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Third-Party Login Failure\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Third-Party Login Failure\" %}\n    {% endelement %}\n    {% element p %}\n        {% trans \"An error occurred while attempting to login via your third-party account.\" %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/base_entrance.html",
    "content": "{% extends \"allauth/layouts/entrance.html\" %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/base_manage.html",
    "content": "{% extends \"allauth/layouts/manage.html\" %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/connections.html",
    "content": "{% extends \"socialaccount/base_manage.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Account Connections\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Account Connections\" %}\n    {% endelement %}\n    {% if form.accounts %}\n        {% element p %}\n            {% blocktrans %}You can sign in to your account using any of the following third-party accounts:{% endblocktrans %}\n        {% endelement %}\n        {% url 'socialaccount_connections' as action_url %}\n        {% element form form=form method=\"post\" action=action_url %}\n            {% slot body %}\n                {% csrf_token %}\n                {% for acc in form.fields.account.choices %}\n                    {% with account=acc.0.instance.get_provider_account %}\n                        {% setvar radio_id %}\n                            id_account_{{ account.account.pk }}\n                        {% endsetvar %}\n                        {% setvar tags %}\n                            socialaccount,{{ account.account.provider }}\n                        {% endsetvar %}\n                        {% element field id=radio_id type=\"radio\" name=\"account\" value=account.account.pk %}\n                            {% slot label %}\n                                {{ account }}\n                                {% element badge tags=tags %}\n                                    {{ account.get_brand.name }}\n                                {% endelement %}\n                            {% endslot %}\n                        {% endelement %}\n                    {% endwith %}\n                {% endfor %}\n            {% endslot %}\n            {% slot actions %}\n                {% element button tags=\"delete,danger\" type=\"submit\" %}\n                    {% trans 'Remove' %}\n                {% endelement %}\n            {% endslot %}\n        {% endelement %}\n    {% else %}\n        {% element p %}\n            {% trans 'You currently have no third-party accounts connected to this account.' %}\n        {% endelement %}\n    {% endif %}\n    {% element h2 %}\n        {% trans 'Add a Third-Party Account' %}\n    {% endelement %}\n    {% include \"socialaccount/snippets/provider_list.html\" with process=\"connect\" %}\n    {% include \"socialaccount/snippets/login_extra.html\" %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/email/account_connected_message.txt",
    "content": "{% extends \"account/email/base_notification.txt\" %}\n{% load i18n %}\n\n{% block notification_message %}{% blocktrans %}A third-party account from {{ provider }} has been connected to your account.{% endblocktrans %}{% endblock notification_message %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/email/account_connected_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Third-Party Account Connected{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/email/account_disconnected_message.txt",
    "content": "{% extends \"account/email/base_notification.txt\" %}\n{% load i18n %}\n\n{% block notification_message %}{% blocktrans %}A third-party account from {{ provider }} has been disconnected from your account.{% endblocktrans %}{% endblock notification_message %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/email/account_disconnected_subject.txt",
    "content": "{% load i18n %}\n{% autoescape off %}\n{% blocktrans %}Third-Party Account Disconnected{% endblocktrans %}\n{% endautoescape %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/login.html",
    "content": "{% extends \"socialaccount/base_entrance.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Sign In\" %}\n{% endblock head_title %}\n{% block content %}\n    {% if process == \"connect\" %}\n        {% element h1 %}\n            {% blocktrans with provider.name as provider %}Connect {{ provider }}{% endblocktrans %}\n        {% endelement %}\n        {% element p %}\n            {% blocktrans with provider.name as provider %}You are about to connect a new third-party account from {{ provider }}.{% endblocktrans %}\n        {% endelement %}\n    {% else %}\n        {% element h1 %}\n            {% blocktrans with provider.name as provider %}Sign In Via {{ provider }}{% endblocktrans %}\n        {% endelement %}\n        {% element p %}\n            {% blocktrans with provider.name as provider %}You are about to sign in using a third-party account from {{ provider }}.{% endblocktrans %}\n        {% endelement %}\n    {% endif %}\n    {% element form method=\"post\" no_visible_fields=True %}\n        {% slot actions %}\n            {% csrf_token %}\n            {% element button type=\"submit\" %}\n                {% trans \"Continue\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/login_cancelled.html",
    "content": "{% extends \"socialaccount/base_entrance.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Login Cancelled\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Login Cancelled\" %}\n    {% endelement %}\n    {% url 'account_login' as login_url %}\n    {% element p %}\n        {% blocktrans %}You decided to cancel logging in to our site using one of your existing accounts. If this was a mistake, please proceed to <a href=\"{{login_url}}\">sign in</a>.{% endblocktrans %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/login_redirect.html",
    "content": "<!DOCTYPE html>\n<html>\n    {% load i18n allauth %}\n    <head>\n        <title>{% translate \"Sign In\" %} | {{ provider }}</title>\n        <meta http-equiv=\"refresh\" content=\"0;URL='{{ redirect_to }}'\" />\n    </head>\n    <body>\n        {% element p %}\n            <a href=\"{{ redirect_to }}\">{% translate \"Continue\" %}</a>\n        {% endelement %}\n    </body>\n</html>\n"
  },
  {
    "path": "allauth/templates/socialaccount/messages/account_connected.txt",
    "content": "{% load i18n %}\n{% blocktrans %}The third-party account has been connected.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/messages/account_connected_other.txt",
    "content": "{% load i18n %}\n{% blocktrans %}The third-party account is already connected to a different account.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/messages/account_connected_updated.txt",
    "content": "{% extends \"socialaccount/messages/account_connected.txt\" %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/messages/account_disconnected.txt",
    "content": "{% load i18n %}\n{% blocktrans %}The third-party account has been disconnected.{% endblocktrans %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/signup.html",
    "content": "{% extends \"socialaccount/base_entrance.html\" %}\n{% load i18n %}\n{% load allauth %}\n{% block head_title %}\n    {% trans \"Signup\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        {% trans \"Sign Up\" %}\n    {% endelement %}\n    {% element p %}\n        {% blocktrans with provider_name=account.get_provider.name site_name=site.name %}You are about to use your {{provider_name}} account to login to\n{{site_name}}. As a final step, please complete the following form:{% endblocktrans %}\n    {% endelement %}\n    {% url 'socialaccount_signup' as action_url %}\n    {% element form form=form method=\"post\" action=action_url %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element fields form=form unlabeled=True %}\n            {% endelement %}\n            {{ redirect_field }}\n        {% endslot %}\n        {% slot actions %}\n            {% element button type=\"submit\" %}\n                {% trans \"Sign Up\" %}\n            {% endelement %}\n        {% endslot %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/snippets/login.html",
    "content": "{% load i18n %}\n{% load allauth %}\n{% load socialaccount %}\n{% get_providers as socialaccount_providers %}\n{% if socialaccount_providers %}\n    {% if not SOCIALACCOUNT_ONLY %}\n        {% element hr %}\n        {% endelement %}\n        {% element h2 %}\n            {% translate \"Or use a third-party\" %}\n        {% endelement %}\n    {% endif %}\n    {% include \"socialaccount/snippets/provider_list.html\" with process=\"login\" %}\n    {% include \"socialaccount/snippets/login_extra.html\" %}\n{% endif %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/snippets/login_extra.html",
    "content": "{% load socialaccount %}\n{% providers_media_js %}\n"
  },
  {
    "path": "allauth/templates/socialaccount/snippets/provider_list.html",
    "content": "{% load allauth socialaccount %}\n{% get_providers as socialaccount_providers %}\n{% if socialaccount_providers %}\n    {% element provider_list %}\n        {% for provider in socialaccount_providers %}\n            {% if provider.id == \"openid\" %}\n                {% for brand in provider.get_brands %}\n                    {% provider_login_url provider openid=brand.openid_url process=process as href %}\n                    {% element provider name=brand.name provider_id=provider.id href=href %}\n                    {% endelement %}\n                {% endfor %}\n            {% endif %}\n            {% provider_login_url provider process=process scope=scope auth_params=auth_params as href %}\n            {% element provider name=provider.name provider_id=provider.id href=href %}\n            {% endelement %}\n        {% endfor %}\n    {% endelement %}\n{% endif %}\n"
  },
  {
    "path": "allauth/templates/usersessions/base_manage.html",
    "content": "{% extends \"allauth/layouts/manage.html\" %}\n"
  },
  {
    "path": "allauth/templates/usersessions/messages/sessions_logged_out.txt",
    "content": "{% load i18n %}\n{% blocktranslate %}Signed out of all other sessions.{% endblocktranslate %}\n"
  },
  {
    "path": "allauth/templates/usersessions/usersession_list.html",
    "content": "{% extends \"usersessions/base_manage.html\" %}\n{% load allauth %}\n{% load i18n %}\n{% load humanize %}\n{% block head_title %}\n    {% trans \"Sessions\" %}\n{% endblock head_title %}\n{% block content %}\n    {% element h1 tags=\"usersessions,list\" %}\n        {% trans \"Sessions\" %}\n    {% endelement %}\n    {% if session_count > 1 %}\n        {% url 'usersessions_list' as action_url %}\n    {% else %}\n        {% url 'account_logout' as action_url %}\n    {% endif %}\n    {% element form action=action_url method=\"post\" tags=\"sessions\" no_visible_fields=True %}\n        {% slot body %}\n            {% csrf_token %}\n            {% element table tags=\"sessions\" %}\n                {% element thead %}\n                    {% element tr %}\n                        {% element th %}\n                            {% translate \"Started At\" %}\n                        {% endelement %}\n                        {% element th %}\n                            {% translate \"IP Address\" %}\n                        {% endelement %}\n                        {% element th %}\n                            {% translate \"Browser\" %}\n                        {% endelement %}\n                        {% if show_last_seen_at %}\n                            {% element th %}\n                                {% translate \"Last seen at\" %}\n                            {% endelement %}\n                        {% endif %}\n                    {% endelement %}\n                {% endelement %}\n                {% element tbody %}\n                    {% for session in sessions %}\n                        {% element tr %}\n                            {% element td %}\n                                <span title=\"{{ session.created_at }}\">{{ session.created_at|naturaltime }}</span>\n                            {% endelement %}\n                            {% element td %}\n                                {{ session.ip }}\n                            {% endelement %}\n                            {% element td %}\n                                {{ session.user_agent }}\n                            {% endelement %}\n                            {% if show_last_seen_at %}\n                                {% element td %}\n                                    <span title=\"{{ session.last_seen_at }}\">{{ session.last_seen_at|naturaltime }}</span>\n                                {% endelement %}\n                            {% endif %}\n                            {% element td %}\n                                {% if session.is_current %}\n                                    {% element badge tags=\"session,current\" %}\n                                        {% translate \"Current\" %}\n                                    {% endelement %}\n                                {% else %}\n                                {% endif %}\n                            {% endelement %}\n                        {% endelement %}\n                    {% endfor %}\n                {% endelement %}\n            {% endelement %}\n        {% endslot %}\n        {% slot actions %}\n            {% if session_count > 1 %}\n                {% element button type=\"submit\" %}\n                    {% translate \"Sign Out Other Sessions\" %}\n                {% endelement %}\n            {% else %}\n                {% element button type=\"submit\" %}\n                    {% translate \"Sign Out\" %}\n                {% endelement %}\n            {% endif %}\n        {% endslot %}\n    {% endelement %}\n{% endblock content %}\n"
  },
  {
    "path": "allauth/templatetags/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/templatetags/allauth.py",
    "content": "from django import template\nfrom django.template.base import FilterExpression, kwarg_re\nfrom django.template.loader import render_to_string\nfrom django.template.loader_tags import ExtendsNode\nfrom django.utils.safestring import mark_safe\n\n\nSLOTS_CONTEXT_KEY = \"slots_context\"\nLAYOUT_CONTEXT_KEY = \"layout_context\"\n\n\ndef parse_tag(token, parser):\n    bits = token.split_contents()\n    tag_name = bits.pop(0)\n    args = []\n    kwargs = {}\n    for bit in bits:\n        # Is this a kwarg or an arg?\n        match = kwarg_re.match(bit)\n        kwarg_format = match and match.group(1)\n        if kwarg_format:\n            key, value = match.groups()\n            kwargs[key] = FilterExpression(value, parser)\n        else:\n            args.append(FilterExpression(bit, parser))\n\n    return (tag_name, args, kwargs)\n\n\nregister = template.Library()\n\n\n@register.tag(name=\"slot\")\ndef do_slot(parser, token):\n    nodelist = parser.parse((\"endslot\",))\n    bits = token.split_contents()\n    bits.pop(0)\n    slot_name = bits.pop(0) if bits else \"default\"\n    parser.delete_first_token()\n    return SlotNode(slot_name, nodelist)\n\n\nclass SlotNode(template.Node):\n    def __init__(self, name, nodelist):\n        self.name = name\n        self.nodelist = nodelist\n\n    def render(self, context):\n        slots = context.render_context.get(SLOTS_CONTEXT_KEY)\n        with context.push():\n            if slots is None:\n                if self.name in context[\"slots\"]:\n                    return \"\".join(context[\"slots\"][self.name])\n                return self.nodelist.render(context)\n            else:\n                result = self.nodelist.render(context)\n                slot_list = slots.setdefault(self.name, [])\n                slot_list.append(result)\n                return \"\"\n\n\n@register.tag(name=\"element\")\ndef do_element(parser, token):\n    nodelist = parser.parse((\"endelement\",))\n    tag_name, args, kwargs = parse_tag(token, parser)\n    usage = f'{{% {tag_name} \"element\" argument=value %}} ... {{% end{tag_name} %}}'\n    if len(args) > 1:\n        raise template.TemplateSyntaxError(f\"Usage: {usage}\")\n\n    parser.delete_first_token()\n    return ElementNode(nodelist, args[0], kwargs)\n\n\nclass ElementNode(template.Node):\n    def __init__(self, nodelist, element, kwargs):\n        self.element = element\n        self.kwargs = kwargs\n        self.nodelist = nodelist\n\n    def render(self, context):\n        from allauth.account.app_settings import TEMPLATE_EXTENSION\n\n        slots = {}\n        extends_context = context.render_context.get(ExtendsNode.context_key)\n        layout = None\n        if extends_context:\n            # Extract layout from the {% extends %} tags\n            for ec in extends_context:\n                prefix = \"allauth/layouts/\"\n                if ec.template_name.startswith(prefix):\n                    layout = ec.template_name[len(prefix) :].replace(\".html\", \"\")\n                    break\n        if not layout:\n            # In case we're in a {% element %} element, the extends context is\n            # not there.\n            layout = context.render_context.get(LAYOUT_CONTEXT_KEY)\n        if not layout:\n            # Or, similarly, for {% include %} we also lose the extends context.\n            layout = context.get(\"page_layout\")\n        template_names = []\n        if layout:\n            template_names.append(f\"allauth/elements/{self.element}__{layout}.html\")\n        template_names.append(f\"allauth/elements/{self.element}.html\")\n        with context.render_context.push(\n            **{SLOTS_CONTEXT_KEY: slots, LAYOUT_CONTEXT_KEY: layout}\n        ):\n            slots[\"default\"] = [self.nodelist.render(context)]\n            attrs = {}\n            for k, v in self.kwargs.items():\n                attrs[k] = v.resolve(context)\n            tags = attrs.get(\"tags\")\n            if tags:\n                attrs[\"tags\"] = [tag.strip() for tag in tags.split(\",\")]\n            with context.push(\n                slots=slots,\n                attrs=attrs,\n                origin=self.origin.template_name.replace(f\".{TEMPLATE_EXTENSION}\", \"\"),\n            ) as element_context:\n                return render_to_string(\n                    template_names, element_context.context.flatten()\n                )\n\n\n@register.tag(name=\"setvar\")\ndef do_setvar(parser, token):\n    nodelist = parser.parse((\"endsetvar\",))\n    bits = token.split_contents()\n    if len(bits) != 2:\n        tag_name = bits[0]\n        usage = f'{{% {tag_name} \"setvar\" var %}} ... {{% end{tag_name} %}}'\n        raise template.TemplateSyntaxError(f\"Usage: {usage}\")\n    parser.delete_first_token()\n    return SetVarNode(nodelist, bits[1])\n\n\nclass SetVarNode(template.Node):\n    def __init__(self, nodelist, var):\n        self.nodelist = nodelist\n        self.var = var\n\n    def render(self, context):\n        context[self.var] = mark_safe(self.nodelist.render(context).strip())  # nosec\n        return \"\"\n"
  },
  {
    "path": "allauth/urls.py",
    "content": "from importlib import import_module\n\nfrom django.urls import URLPattern, URLResolver, include, path\nfrom django.views.generic.base import RedirectView\n\nfrom allauth.socialaccount import providers\n\nfrom . import app_settings\n\n\ndef build_provider_urlpatterns() -> list[URLPattern | URLResolver]:\n    # Provider urlpatterns, as separate attribute (for reusability).\n    provider_urlpatterns: list[URLPattern | URLResolver] = []\n    provider_classes = providers.registry.get_class_list()\n\n    # We need to move the OpenID Connect provider to the end. The reason is that\n    # matches URLs that the builtin providers also match.\n    #\n    # NOTE: Only needed if OPENID_CONNECT_URL_PREFIX is blank.\n    provider_classes = [\n        cls for cls in provider_classes if cls.id != \"openid_connect\"\n    ] + [cls for cls in provider_classes if cls.id == \"openid_connect\"]\n    for provider_class in provider_classes:\n        prov_mod = import_module(f\"{provider_class.get_package()}.urls\")\n        prov_urlpatterns = getattr(prov_mod, \"urlpatterns\", None)\n        if prov_urlpatterns:\n            provider_urlpatterns += prov_urlpatterns\n    return provider_urlpatterns\n\n\nurlpatterns: list[URLPattern | URLResolver] = []\nif not app_settings.HEADLESS_ONLY:\n    urlpatterns += [path(\"\", include(\"allauth.account.urls\"))]\n    if app_settings.MFA_ENABLED:\n        urlpatterns += [path(\"2fa/\", include(\"allauth.mfa.urls\"))]\n\nif app_settings.SOCIALACCOUNT_ENABLED and not app_settings.HEADLESS_ONLY:\n    urlpatterns += [path(\"3rdparty/\", include(\"allauth.socialaccount.urls\"))]\n\n    # DEPRECATED! -- deal with legacy URLs\n    urlpatterns += [\n        path(\n            \"social/login/cancelled/\",\n            RedirectView.as_view(\n                pattern_name=\"socialaccount_login_cancelled\", permanent=True\n            ),\n        ),\n        path(\n            \"social/login/error/\",\n            RedirectView.as_view(\n                pattern_name=\"socialaccount_login_error\", permanent=True\n            ),\n        ),\n        path(\n            \"social/signup/\",\n            RedirectView.as_view(pattern_name=\"socialaccount_signup\", permanent=True),\n        ),\n        path(\n            \"social/connections/\",\n            RedirectView.as_view(\n                pattern_name=\"socialaccount_connections\", permanent=True\n            ),\n        ),\n    ]\n    # (end DEPRECATED)\n\nif app_settings.SOCIALACCOUNT_ENABLED:\n    urlpatterns += build_provider_urlpatterns()\n\nif app_settings.USERSESSIONS_ENABLED and not app_settings.HEADLESS_ONLY:\n    urlpatterns += [path(\"sessions/\", include(\"allauth.usersessions.urls\"))]\n"
  },
  {
    "path": "allauth/usersessions/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/usersessions/adapter.py",
    "content": "from allauth.core.internal.adapter import BaseAdapter\nfrom allauth.usersessions import app_settings\nfrom allauth.utils import import_attribute\n\n\nclass DefaultUserSessionsAdapter(BaseAdapter):\n    \"\"\"The adapter class allows you to override various functionality of the\n    ``allauth.usersessions`` app.  To do so, point\n    ``settings.USERSESSIONS_ADAPTER`` to your own class that derives from\n    ``DefaultUserSessionsAdapter`` and override the behavior by altering the\n    implementation of the methods according to your own needs.\n    \"\"\"\n\n    def end_sessions(self, sessions) -> None:\n        for session in sessions:\n            session.end()\n\n\ndef get_adapter() -> DefaultUserSessionsAdapter:\n    return import_attribute(app_settings.ADAPTER)()\n"
  },
  {
    "path": "allauth/usersessions/admin.py",
    "content": "from django.contrib import admin\n\nfrom allauth.usersessions.models import UserSession\n\n\n@admin.register(UserSession)\nclass UserSessionAdmin(admin.ModelAdmin):\n    raw_id_fields = (\"user\",)\n    list_display = (\"user\", \"created_at\", \"last_seen_at\", \"ip\", \"user_agent\")\n    search_fields = [\n        \"user__pk\",\n        \"user__username\",\n        \"ip\",\n    ]\n"
  },
  {
    "path": "allauth/usersessions/app_settings.py",
    "content": "class AppSettings:\n    def __init__(self, prefix: str) -> None:\n        self.prefix = prefix\n\n    def _setting(self, name: str, dflt):\n        from allauth.utils import get_setting\n\n        return get_setting(self.prefix + name, dflt)\n\n    @property\n    def ADAPTER(self) -> str:\n        return self._setting(\n            \"ADAPTER\", \"allauth.usersessions.adapter.DefaultUserSessionsAdapter\"\n        )\n\n    @property\n    def TRACK_ACTIVITY(self) -> bool:\n        \"\"\"Whether or not sessions are to be actively tracked. When tracking is\n        enabled, the last seen IP address and last seen timestamp will be kept\n        track of.\n        \"\"\"\n        return self._setting(\"TRACK_ACTIVITY\", False)\n\n\n_app_settings = AppSettings(\"USERSESSIONS_\")\n\n\ndef __getattr__(name):\n    # See https://peps.python.org/pep-0562/\n    return getattr(_app_settings, name)\n"
  },
  {
    "path": "allauth/usersessions/apps.py",
    "content": "from django.apps import AppConfig\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth import app_settings\n\n\nclass UserSessionsConfig(AppConfig):\n    name = \"allauth.usersessions\"\n    verbose_name = _(\"User Sessions\")\n    default_auto_field = (\n        app_settings.DEFAULT_AUTO_FIELD or \"django.db.models.BigAutoField\"\n    )\n\n    def ready(self):\n        from allauth.account.signals import (\n            password_changed,\n            password_set,\n            user_logged_in,\n        )\n        from allauth.usersessions import signals\n\n        user_logged_in.connect(receiver=signals.on_user_logged_in)\n        for sig in [password_set, password_changed]:\n            sig.connect(receiver=signals.on_password_changed)\n"
  },
  {
    "path": "allauth/usersessions/forms.py",
    "content": "from django import forms\n\nfrom allauth.usersessions.internal import flows\n\n\nclass ManageUserSessionsForm(forms.Form):\n    def __init__(self, *args, **kwargs) -> None:\n        self.request = kwargs.pop(\"request\")\n        super().__init__(*args, **kwargs)\n\n    def save(self, request) -> None:\n        flows.sessions.end_other_sessions(request, request.user)\n"
  },
  {
    "path": "allauth/usersessions/internal/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/usersessions/internal/flows/__init__.py",
    "content": "from allauth.usersessions.internal.flows import sessions\n\n\n__all__ = [\"sessions\"]\n"
  },
  {
    "path": "allauth/usersessions/internal/flows/sessions.py",
    "content": "from allauth.account.internal import flows\nfrom allauth.usersessions.adapter import get_adapter\nfrom allauth.usersessions.models import UserSession\n\n\ndef end_other_sessions(request, user):\n    sessions_to_end = []\n    for session in UserSession.objects.filter(user=user):\n        if session.is_current():\n            continue\n        sessions_to_end.append(session)\n    end_sessions(request, sessions_to_end)\n\n\ndef end_sessions(request, sessions):\n    has_current = any([session.is_current() for session in sessions])\n    get_adapter().end_sessions(sessions)\n    if has_current:\n        flows.logout.logout(request)\n"
  },
  {
    "path": "allauth/usersessions/middleware.py",
    "content": "from allauth.usersessions import app_settings\nfrom allauth.usersessions.models import UserSession\n\n\nclass UserSessionsMiddleware:\n    def __init__(self, get_response):\n        self.get_response = get_response\n\n    def __call__(self, request):\n        if (\n            app_settings.TRACK_ACTIVITY\n            and hasattr(request, \"session\")\n            and request.session.session_key\n            and hasattr(request, \"user\")\n            and request.user.is_authenticated\n        ):\n            UserSession.objects.create_from_request(request)\n        response = self.get_response(request)\n        return response\n"
  },
  {
    "path": "allauth/usersessions/migrations/0001_initial.py",
    "content": "# Generated by Django 4.2.6 on 2023-12-05 11:44\n\nimport django.db.models.deletion\nimport django.utils.timezone\nfrom django.conf import settings\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n    initial = True\n\n    dependencies = [\n        migrations.swappable_dependency(settings.AUTH_USER_MODEL),\n    ]\n\n    operations = [\n        migrations.CreateModel(\n            name=\"UserSession\",\n            fields=[\n                (\n                    \"id\",\n                    models.BigAutoField(\n                        auto_created=True,\n                        primary_key=True,\n                        serialize=False,\n                        verbose_name=\"ID\",\n                    ),\n                ),\n                (\"created_at\", models.DateTimeField(default=django.utils.timezone.now)),\n                (\"ip\", models.GenericIPAddressField()),\n                (\n                    \"last_seen_at\",\n                    models.DateTimeField(default=django.utils.timezone.now),\n                ),\n                (\n                    \"session_key\",\n                    models.CharField(\n                        editable=False,\n                        max_length=40,\n                        unique=True,\n                        verbose_name=\"session key\",\n                    ),\n                ),\n                (\"user_agent\", models.CharField(max_length=200)),\n                (\"data\", models.JSONField(default=dict)),\n                (\n                    \"user\",\n                    models.ForeignKey(\n                        on_delete=django.db.models.deletion.CASCADE,\n                        to=settings.AUTH_USER_MODEL,\n                    ),\n                ),\n            ],\n        ),\n    ]\n"
  },
  {
    "path": "allauth/usersessions/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "allauth/usersessions/models.py",
    "content": "from importlib import import_module\n\nfrom django.conf import settings\nfrom django.core.exceptions import ImproperlyConfigured\nfrom django.db import models, transaction\nfrom django.http import HttpRequest\nfrom django.utils import timezone\nfrom django.utils.translation import gettext_lazy as _\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.account.adapter import get_adapter\nfrom allauth.core import context\nfrom allauth.core.internal.httpkit import HTTP_USER_AGENT_MAX_LENGTH\nfrom allauth.core.internal.sessionkit import get_session_user\n\n\nif not allauth_settings.USERSESSIONS_ENABLED:\n    raise ImproperlyConfigured(\n        \"allauth.usersessions not installed, yet its models are imported.\"\n    )\n\n\nclass UserSessionManager(models.Manager):\n    def purge_and_list(self, user) -> list[\"UserSession\"]:\n        ret = []\n        sessions = UserSession.objects.filter(user=user)\n        for session in sessions.iterator():\n            if not session.purge():\n                ret.append(session)\n        return ret\n\n    def create_from_request(self, request: HttpRequest):\n        if not request.user.is_authenticated:\n            raise ValueError()\n        if not request.session.session_key:\n            request.session.save()\n        ua = request.META.get(\"HTTP_USER_AGENT\", \"\")[\n            0 : UserSession._meta.get_field(\"user_agent\").max_length\n        ]\n\n        defaults = dict(\n            user=request.user,\n            ip=get_adapter().get_client_ip(request),\n            user_agent=ua,\n        )\n\n        from_session = None\n        with transaction.atomic():\n            from allauth.usersessions.signals import session_client_changed\n\n            session, created = UserSession.objects.get_or_create(\n                session_key=request.session.session_key, defaults=defaults\n            )\n\n            if not created:\n                from_session = UserSession(\n                    session_key=session.session_key,\n                    user=session.user,\n                    ip=session.ip,\n                    user_agent=session.user_agent,\n                    data=session.data,\n                    created_at=session.created_at,\n                    last_seen_at=session.last_seen_at,\n                )\n                # Update session\n                session.user = defaults[\"user\"]\n                session.ip = defaults[\"ip\"]\n                session.user_agent = defaults[\"user_agent\"]\n                session.last_seen_at = timezone.now()\n\n                session.save()\n\n        if from_session and (\n            from_session.ip != session.ip\n            or from_session.user_agent != session.user_agent\n        ):\n            session_client_changed.send(\n                sender=UserSession,\n                request=request,\n                from_session=from_session,\n                to_session=session,\n            )\n\n\nclass UserSession(models.Model):\n    objects = UserSessionManager()\n\n    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)\n    created_at = models.DateTimeField(default=timezone.now)\n    ip = models.GenericIPAddressField()\n    last_seen_at = models.DateTimeField(default=timezone.now)\n    session_key = models.CharField(\n        _(\"session key\"), max_length=40, unique=True, editable=False\n    )\n    user_agent = models.CharField(max_length=HTTP_USER_AGENT_MAX_LENGTH)\n    data = models.JSONField(default=dict)\n\n    def __str__(self) -> str:\n        return f\"{self.ip} ({self.user_agent})\"\n\n    def _session_store(self, *args):\n        engine = import_module(settings.SESSION_ENGINE)\n        return engine.SessionStore(*args)\n\n    def exists(self) -> bool:\n        return self._session_store().exists(self.session_key)\n\n    def purge(self) -> bool:\n        purge = not self.exists()\n        if not purge:\n            # Even if the session still exists, it might be the case that the\n            # user session hash is out of sync. So, let's see if\n            # `django.contrib.auth` can find a user...\n            user = get_session_user(self._session_store(self.session_key))\n            purge = not user\n        if purge:\n            self.delete()\n            return True\n        return False\n\n    def is_current(self) -> bool:\n        return self.session_key == context.request.session.session_key\n\n    def end(self) -> None:\n        engine = import_module(settings.SESSION_ENGINE)\n        store = engine.SessionStore()\n        store.delete(self.session_key)\n        self.delete()\n"
  },
  {
    "path": "allauth/usersessions/signals.py",
    "content": "from django.dispatch import Signal\n\nfrom allauth.account import app_settings\n\nfrom .models import UserSession\n\n\n# Provides the arguments \"request\", \"from_session\", \"to_session\"\nsession_client_changed = Signal()\n\n\ndef on_user_logged_in(sender, **kwargs):\n    request = kwargs[\"request\"]\n    UserSession.objects.purge_and_list(request.user)\n    UserSession.objects.create_from_request(request)\n\n\ndef on_password_changed(sender, **kwargs):\n    if not app_settings.LOGOUT_ON_PASSWORD_CHANGE:\n        request = kwargs[\"request\"]\n        UserSession.objects.create_from_request(request)\n"
  },
  {
    "path": "allauth/usersessions/urls.py",
    "content": "from django.urls import path\n\nfrom allauth.usersessions import views\n\n\nurlpatterns = [\n    path(\"\", views.list_usersessions, name=\"usersessions_list\"),\n]\n"
  },
  {
    "path": "allauth/usersessions/views.py",
    "content": "from django.contrib import messages\nfrom django.contrib.auth.decorators import login_required\nfrom django.http import HttpResponse\nfrom django.urls import reverse_lazy\nfrom django.utils.decorators import method_decorator\nfrom django.views.generic.edit import FormView\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.usersessions import app_settings\nfrom allauth.usersessions.forms import ManageUserSessionsForm\nfrom allauth.usersessions.models import UserSession\n\n\n@method_decorator(login_required, name=\"dispatch\")\nclass ListUserSessionsView(FormView):\n    template_name = (\n        f\"usersessions/usersession_list.{account_settings.TEMPLATE_EXTENSION}\"\n    )\n    form_class = ManageUserSessionsForm\n    success_url = reverse_lazy(\"usersessions_list\")\n\n    def get_context_data(self, **kwargs) -> dict:\n        ret = super().get_context_data(**kwargs)\n        sessions = sorted(\n            UserSession.objects.purge_and_list(self.request.user),\n            key=lambda s: s.created_at,\n        )\n        ret[\"sessions\"] = sessions\n        ret[\"session_count\"] = len(sessions)\n        ret[\"show_last_seen_at\"] = app_settings.TRACK_ACTIVITY\n        return ret\n\n    def get_form_kwargs(self) -> dict:\n        ret = super().get_form_kwargs()\n        ret[\"request\"] = self.request\n        return ret\n\n    def form_valid(self, form) -> HttpResponse:\n        form.save(self.request)\n        get_account_adapter().add_message(\n            self.request,\n            messages.INFO,\n            \"usersessions/messages/sessions_logged_out.txt\",\n        )\n        return super().form_valid(form)\n\n\nlist_usersessions = ListUserSessionsView.as_view()\n"
  },
  {
    "path": "allauth/utils.py",
    "content": "import importlib\nimport random\nimport re\nimport string\nimport unicodedata\nfrom collections import OrderedDict\nfrom urllib.parse import urlsplit\n\nfrom django.conf import settings\nfrom django.contrib.auth import get_user_model\nfrom django.core.exceptions import ImproperlyConfigured, ValidationError\nfrom django.http import HttpRequest\nfrom django.utils.encoding import force_str\n\nfrom allauth import app_settings\nfrom allauth.core import context\n\n\n# Magic number 7: if you run into collisions with this number, then you are\n# of big enough scale to start investing in a decent user model...\nMAX_USERNAME_SUFFIX_LENGTH = 7\nUSERNAME_SUFFIX_CHARS = [string.digits] * 4 + [string.ascii_letters] * (\n    MAX_USERNAME_SUFFIX_LENGTH - 4\n)\n\n\ndef _generate_unique_username_base(txts, regex=None):\n    from .account.adapter import get_adapter\n\n    adapter = get_adapter()\n    username = None\n    regex = regex or r\"[^\\w\\s@+.-]\"\n    for txt in txts:\n        if not txt:\n            continue\n        username = unicodedata.normalize(\"NFKD\", force_str(txt))\n        username = username.encode(\"ascii\", \"ignore\").decode(\"ascii\")\n        if len(username) == 0:\n            continue\n        username = force_str(re.sub(regex, \"\", username).lower())\n        # Django allows for '@' in usernames in order to accommodate for\n        # project wanting to use email for username. In allauth we don't\n        # use this, we already have a proper place for putting email\n        # addresses (EmailAddress), so let's not use the full email\n        # address and only take the part leading up to the '@'.\n        username = username.split(\"@\")[0]\n        username = username.strip()\n        username = re.sub(r\"\\s+\", \"_\", username)\n        # Finally, validating base username without database lookups etc.\n        try:\n            username = adapter.clean_username(username, shallow=True)\n            break\n        except ValidationError:\n            pass\n    return username or \"user\"\n\n\ndef get_username_max_length():\n    from .account.app_settings import USER_MODEL_USERNAME_FIELD\n\n    if USER_MODEL_USERNAME_FIELD is not None:\n        User = get_user_model()\n        max_length = User._meta.get_field(USER_MODEL_USERNAME_FIELD).max_length\n    else:\n        max_length = 0\n    return max_length\n\n\ndef generate_username_candidate(basename, suffix_length):\n    max_length = get_username_max_length()\n    suffix = \"\".join(\n        random.choice(USERNAME_SUFFIX_CHARS[i]) for i in range(suffix_length)  # nosec\n    )\n    return basename[0 : max_length - len(suffix)] + suffix\n\n\ndef generate_username_candidates(basename):\n    from .account.app_settings import USERNAME_MIN_LENGTH\n\n    if len(basename) >= USERNAME_MIN_LENGTH:\n        ret = [basename]\n    else:\n        ret = []\n    min_suffix_length = max(1, USERNAME_MIN_LENGTH - len(basename))\n    max_suffix_length = min(get_username_max_length(), MAX_USERNAME_SUFFIX_LENGTH)\n    for suffix_length in range(min_suffix_length, max_suffix_length):\n        ret.append(generate_username_candidate(basename, suffix_length))\n    return ret\n\n\ndef generate_unique_username(txts, regex=None):\n    from allauth.account.utils import filter_users_by_username\n\n    from .account.adapter import get_adapter\n    from .account.app_settings import USER_MODEL_USERNAME_FIELD\n\n    adapter = get_adapter()\n    basename = _generate_unique_username_base(txts, regex)\n    candidates = generate_username_candidates(basename)\n    existing_usernames = filter_users_by_username(*candidates).values_list(\n        USER_MODEL_USERNAME_FIELD, flat=True\n    )\n    existing_usernames = {n.lower() for n in existing_usernames}\n    for candidate in candidates:\n        if candidate.lower() not in existing_usernames:\n            try:\n                return adapter.clean_username(candidate, shallow=True)\n            except ValidationError:\n                pass\n    # This really should not happen\n    raise NotImplementedError(\"Unable to find a unique username\")\n\n\ndef import_attribute(path):\n    assert isinstance(path, str)  # nosec\n    pkg, attr = path.rsplit(\".\", 1)\n    ret = getattr(importlib.import_module(pkg), attr)\n    return ret\n\n\ndef import_callable(path_or_callable):\n    if not callable(path_or_callable):\n        ret = import_attribute(path_or_callable)\n    else:\n        ret = path_or_callable\n    return ret\n\n\ndef set_form_field_order(form, field_order):\n    \"\"\"\n    This function is a verbatim copy of django.forms.Form.order_fields() to\n    support field ordering below Django 1.9.\n\n    field_order is a list of field names specifying the order. Append fields\n    not included in the list in the default order for backward compatibility\n    with subclasses not overriding field_order. If field_order is None, keep\n    all fields in the order defined in the class. Ignore unknown fields in\n    field_order to allow disabling fields in form subclasses without\n    redefining ordering.\n    \"\"\"\n    if field_order is None:\n        return\n    fields = OrderedDict()\n    for key in field_order:\n        try:\n            fields[key] = form.fields.pop(key)\n        except KeyError:  # ignore unknown fields\n            pass\n    fields.update(form.fields)  # add remaining fields in original order\n    form.fields = fields\n\n\ndef build_absolute_uri(\n    request: HttpRequest | None, location: str, protocol: str | None = None\n) -> str:\n    \"\"\"request.build_absolute_uri() helper\n\n    Like request.build_absolute_uri, but gracefully handling\n    the case where request is None.\n    \"\"\"\n    from .account import app_settings as account_settings\n\n    if request is None:\n        request = context.request\n\n    if request is None:\n        if not app_settings.SITES_ENABLED:\n            raise ImproperlyConfigured(\n                \"Passing `request=None` requires `sites` to be enabled.\"\n            )\n        from django.contrib.sites.models import Site\n\n        site = Site.objects.get_current()\n        bits = urlsplit(location)\n        if not (bits.scheme and bits.netloc):\n            uri = f\"{account_settings.DEFAULT_HTTP_PROTOCOL}://{site.domain}{location}\"\n        else:\n            uri = location\n    else:\n        uri = request.build_absolute_uri(location)\n    # NOTE: We only force a protocol if we are instructed to do so\n    # (via the `protocol` parameter, or, if the default is set to\n    # HTTPS. The latter keeps compatibility with the debatable use\n    # case of running your site under both HTTP and HTTPS, where one\n    # would want to make sure HTTPS links end up in password reset\n    # mails even while they were initiated on an HTTP password reset\n    # form.\n    if not protocol and account_settings.DEFAULT_HTTP_PROTOCOL == \"https\":\n        protocol = account_settings.DEFAULT_HTTP_PROTOCOL\n    # (end NOTE)\n    if protocol:\n        uri = f\"{protocol}:{uri.partition(':')[2]}\"\n    return uri\n\n\ndef get_form_class(forms, form_id, default_form):\n    form_class = forms.get(form_id, default_form)\n    if isinstance(form_class, str):\n        form_class = import_attribute(form_class)\n    return form_class\n\n\ndef get_request_param(request, param, default=None):\n    if request is None:\n        return default\n    return request.POST.get(param) or request.GET.get(param, default)\n\n\ndef get_setting(name, dflt):\n    getter = getattr(\n        settings,\n        \"ALLAUTH_SETTING_GETTER\",\n        lambda name, dflt: getattr(settings, name, dflt),\n    )\n    getter = import_callable(getter)\n    return getter(name, dflt)\n"
  },
  {
    "path": "devenv.nix",
    "content": "{ pkgs, lib, config, inputs, ... }:\n\n{\n  packages = [\n    pkgs.git\n    pkgs.swagger-cli\n    pkgs.twine\n    pkgs.woodpecker-cli\n    pkgs.xmlsec\n    pkgs.gettext\n\n    pkgs.python312Packages.pyls-flake8\n    pkgs.python312Packages.pylsp-rope\n    pkgs.python312Packages.python-lsp-server\n    pkgs.python312Packages.xmlsec\n    pkgs.python312Packages.build\n  ];\n\n  # https://devenv.sh/languages/\n  languages.python = {\n    enable = true;\n    package = pkgs.python312;\n    venv.enable = true;\n    venv.requirements = ''\n      -r ${./.}/requirements-dev.txt\n    '';\n  };\n\n  enterShell = ''\n    source $VIRTUAL_ENV/bin/activate\n  '';\n}\n"
  },
  {
    "path": "devenv.yaml",
    "content": "# yaml-language-server: $schema=https://devenv.sh/devenv.schema.json\ninputs:\n  nixpkgs:\n    url: github:cachix/devenv-nixpkgs/rolling\n\n# If you're using non-OSS software, you can set allowUnfree to true.\n# allowUnfree: true\n\n# If you're willing to use a package that's vulnerable\n# permittedInsecurePackages:\n#  - \"openssl-1.1.1w\"\n\n# If you have more than one devenv you can merge them\n#imports:\n# - ./backend\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD   = sphinx-build\nPAPER         =\nBUILDDIR      = _build\n\n# Internal variables.\nPAPEROPT_a4     = -D latex_paper_size=a4\nPAPEROPT_letter = -D latex_paper_size=letter\nALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .\n# the i18n builder cannot share the environment and doctrees with the others\nI18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .\n\n.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext\n\nhelp:\n\t@echo \"Please use \\`make <target>' where <target> is one of\"\n\t@echo \"  html       to make standalone HTML files\"\n\t@echo \"  dirhtml    to make HTML files named index.html in directories\"\n\t@echo \"  singlehtml to make a single large HTML file\"\n\t@echo \"  pickle     to make pickle files\"\n\t@echo \"  json       to make JSON files\"\n\t@echo \"  htmlhelp   to make HTML files and a HTML help project\"\n\t@echo \"  qthelp     to make HTML files and a qthelp project\"\n\t@echo \"  devhelp    to make HTML files and a Devhelp project\"\n\t@echo \"  epub       to make an epub\"\n\t@echo \"  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter\"\n\t@echo \"  latexpdf   to make LaTeX files and run them through pdflatex\"\n\t@echo \"  text       to make text files\"\n\t@echo \"  man        to make manual pages\"\n\t@echo \"  texinfo    to make Texinfo files\"\n\t@echo \"  info       to make Texinfo files and run them through makeinfo\"\n\t@echo \"  gettext    to make PO message catalogs\"\n\t@echo \"  changes    to make an overview of all changed/added/deprecated items\"\n\t@echo \"  linkcheck  to check all external links for integrity\"\n\t@echo \"  doctest    to run all doctests embedded in the documentation (if enabled)\"\n\nclean:\n\t-rm -rf $(BUILDDIR)/*\n\nhtml:\n\t$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/html.\"\n\ndirhtml:\n\t$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/dirhtml.\"\n\nsinglehtml:\n\t$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml\n\t@echo\n\t@echo \"Build finished. The HTML page is in $(BUILDDIR)/singlehtml.\"\n\npickle:\n\t$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle\n\t@echo\n\t@echo \"Build finished; now you can process the pickle files.\"\n\njson:\n\t$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json\n\t@echo\n\t@echo \"Build finished; now you can process the JSON files.\"\n\nhtmlhelp:\n\t$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp\n\t@echo\n\t@echo \"Build finished; now you can run HTML Help Workshop with the\" \\\n\t      \".hhp project file in $(BUILDDIR)/htmlhelp.\"\n\nqthelp:\n\t$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp\n\t@echo\n\t@echo \"Build finished; now you can run \"qcollectiongenerator\" with the\" \\\n\t      \".qhcp project file in $(BUILDDIR)/qthelp, like this:\"\n\t@echo \"# qcollectiongenerator $(BUILDDIR)/qthelp/django-allauth.qhcp\"\n\t@echo \"To view the help file:\"\n\t@echo \"# assistant -collectionFile $(BUILDDIR)/qthelp/django-allauth.qhc\"\n\ndevhelp:\n\t$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp\n\t@echo\n\t@echo \"Build finished.\"\n\t@echo \"To view the help file:\"\n\t@echo \"# mkdir -p $$HOME/.local/share/devhelp/django-allauth\"\n\t@echo \"# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/django-allauth\"\n\t@echo \"# devhelp\"\n\nepub:\n\t$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub\n\t@echo\n\t@echo \"Build finished. The epub file is in $(BUILDDIR)/epub.\"\n\nlatex:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo\n\t@echo \"Build finished; the LaTeX files are in $(BUILDDIR)/latex.\"\n\t@echo \"Run \\`make' in that directory to run these through (pdf)latex\" \\\n\t      \"(use \\`make latexpdf' here to do that automatically).\"\n\nlatexpdf:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo \"Running LaTeX files through pdflatex...\"\n\t$(MAKE) -C $(BUILDDIR)/latex all-pdf\n\t@echo \"pdflatex finished; the PDF files are in $(BUILDDIR)/latex.\"\n\ntext:\n\t$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text\n\t@echo\n\t@echo \"Build finished. The text files are in $(BUILDDIR)/text.\"\n\nman:\n\t$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man\n\t@echo\n\t@echo \"Build finished. The manual pages are in $(BUILDDIR)/man.\"\n\ntexinfo:\n\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo\n\t@echo\n\t@echo \"Build finished. The Texinfo files are in $(BUILDDIR)/texinfo.\"\n\t@echo \"Run \\`make' in that directory to run these through makeinfo\" \\\n\t      \"(use \\`make info' here to do that automatically).\"\n\ninfo:\n\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo\n\t@echo \"Running Texinfo files through makeinfo...\"\n\tmake -C $(BUILDDIR)/texinfo info\n\t@echo \"makeinfo finished; the Info files are in $(BUILDDIR)/texinfo.\"\n\ngettext:\n\t$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale\n\t@echo\n\t@echo \"Build finished. The message catalogs are in $(BUILDDIR)/locale.\"\n\nchanges:\n\t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes\n\t@echo\n\t@echo \"The overview file is in $(BUILDDIR)/changes.\"\n\nlinkcheck:\n\t$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck\n\t@echo\n\t@echo \"Link check complete; look for any errors in the above output \" \\\n\t      \"or in $(BUILDDIR)/linkcheck/output.txt.\"\n\ndoctest:\n\t$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest\n\t@echo \"Testing of doctests in the sources finished, look at the \" \\\n\t      \"results in $(BUILDDIR)/doctest/output.txt.\"\n"
  },
  {
    "path": "docs/account/adapter.rst",
    "content": "Adapter\n=======\n\n.. autoclass:: allauth.account.adapter.DefaultAccountAdapter\n   :members:\n"
  },
  {
    "path": "docs/account/advanced.rst",
    "content": "Advanced Usage\n==============\n\nCustom User Models\n------------------\n\nIf you use a custom user model you need to specify what field\nrepresents the ``username``, if any. Here, ``username`` really refers to\nthe field representing the nickname that the user uses to login, and not to\nsome unique identifier (possibly including an email address) as is\nthe case for Django's ``AbstractBaseUser.USERNAME_FIELD``.\n\nTherefore, if your custom user model does not have a ``username`` field (again,\nnot to be mistaken with an email address or user id), you will need to set\n``ACCOUNT_USER_MODEL_USERNAME_FIELD`` to ``None``. This will disable username\nrelated functionality in ``allauth``. Remember to also remove username from\n``ACCOUNT_SIGNUP_FIELDS`` as by default that is present.\n\nSimilarly, you will need to set ``ACCOUNT_USER_MODEL_EMAIL_FIELD`` to\n``None`` or to the proper field (if other than ``email``).\n\nFor example, if you want to use a custom user model that has ``email``\nas the identifying field, and you don't want to collect usernames, you\nneed the following in your settings.py::\n\n    ACCOUNT_USER_MODEL_USERNAME_FIELD = None\n    ACCOUNT_SIGNUP_FIELDS = ['email*', 'password1*', 'password2*']\n    ACCOUNT_LOGIN_METHODS = {'email'}\n\n\nCreating and Populating User instances\n--------------------------------------\n\nThe following adapter methods can be used to intervene in how User\ninstances are created and populated with data\n\n- ``allauth.account.adapter.DefaultAccountAdapter``:\n\n  - ``is_open_for_signup(self, request)``: The default function\n    returns ``True``. You can override this method by returning ``False``\n    if you want to disable account signup.\n\n  - ``new_user(self, request)``: Instantiates a new, empty ``User``.\n\n  - ``save_user(self, request, user, form)``: Populates and saves the\n    ``User`` instance using information provided in the signup form.\n\n  - ``populate_username(self, request, user)``:\n    Fills in a valid username, if required and missing.  If the\n    username is already present, then it is assumed to be valid (unique).\n\n  - ``confirm_email(self, request, email_address)``: Marks the email address as\n    confirmed and saves to the db.\n\n  - ``generate_unique_username(self, txts, regex=None)``: Returns a unique username\n    from the combination of strings present in txts iterable. A regex pattern\n    can be passed to the method to make sure the generated username matches it.\n\n\nInvitations\n-----------\n\nInvitation handling is not supported, and most likely will not be any\ntime soon. An invitation app could cover anything ranging from\ninvitations of new users, to invitations of existing users to\nparticipate in restricted parts of the site. All in all, the scope of\ninvitation handling is large enough to warrant being addressed in an\napp of its own.\n\nStill, everything is in place to easily hook up any third party\ninvitation app. The account adapter\n(``allauth.account.adapter.DefaultAccountAdapter``) offers the following\nmethods:\n\n- ``is_open_for_signup(self, request)``. You can override this method to, for\n  example, inspect the session to check if an invitation was accepted.\n\n- ``stash_verified_email(self, request, email)``. If an invitation was\n  accepted by following a link in an email, then there is no need to\n  send email verification mails after the signup is completed. Use\n  this method to record the fact that an email address was verified.\n\n\nCustom Redirects\n----------------\n\nIf redirecting to statically configurable URLs (as specified in your\nproject settings) is not flexible enough, then you can override the\nfollowing adapter methods:\n\n- ``allauth.account.adapter.DefaultAccountAdapter``:\n\n  - ``get_login_redirect_url(self, request)``\n\n  - ``get_logout_redirect_url(self, request)``\n\n  - ``get_email_verification_redirect_url(self, email_address)``\n\n  - ``get_signup_redirect_url(self, request)``\n\nFor example, redirecting to ``/accounts/<username>/`` can be implemented as\nfollows::\n\n    # project/settings.py:\n    ACCOUNT_ADAPTER = 'project.users.adapter.MyAccountAdapter'\n\n    # project/users/adapter.py:\n    from django.conf import settings\n    from allauth.account.adapter import DefaultAccountAdapter\n\n    class MyAccountAdapter(DefaultAccountAdapter):\n\n        def get_login_redirect_url(self, request):\n            path = \"/accounts/{username}/\"\n            return path.format(username=request.user.username)\n"
  },
  {
    "path": "docs/account/configuration.rst",
    "content": "Configuration\n=============\n\nOverall\n*******\n\n``ACCOUNT_ADAPTER`` (default: ``\"allauth.account.adapter.DefaultAccountAdapter\"``)\n  Specifies the adapter class to use, allowing you to alter certain\n  default behaviour.\n\n``ACCOUNT_FORMS``\n  Used to override the builtin forms. Defaults to::\n\n    ACCOUNT_FORMS = {\n        'add_email': 'allauth.account.forms.AddEmailForm',\n        'change_password': 'allauth.account.forms.ChangePasswordForm',\n        'confirm_login_code': 'allauth.account.forms.ConfirmLoginCodeForm',\n        'login': 'allauth.account.forms.LoginForm',\n        'request_login_code': 'allauth.account.forms.RequestLoginCodeForm',\n        'reset_password': 'allauth.account.forms.ResetPasswordForm',\n        'reset_password_from_key': 'allauth.account.forms.ResetPasswordKeyForm',\n        'set_password': 'allauth.account.forms.SetPasswordForm',\n        'signup': 'allauth.account.forms.SignupForm',\n        'user_token': 'allauth.account.forms.UserTokenForm',\n    }\n\n``ACCOUNT_PREVENT_ENUMERATION`` (default: ``True``)\n  Controls whether or not information is revealed about whether or not a user\n  account exists. For example, by entering random email addresses in the\n  password reset form you can test whether or not those email addresses are\n  associated with an account. Enabling this setting prevents that, and an email\n  is always sent, regardless of whether or not the account exists. Note that\n  there is a slight usability tax to pay because there is no immediate feedback.\n\n  Whether or not enumeration can be prevented during signup depends on the email\n  verification method. In case of mandatory verification, enumeration can be\n  properly prevented because the case where an email address is already taken is\n  indistinguishable from the case where it is not.  However, in case of optional\n  or disabled email verification, enumeration can only be prevented by allowing\n  the signup to go through, resulting in multiple accounts sharing same email\n  address (although only one of the accounts can ever have it verified). When\n  enumeration prevention is set to ``True``, email address uniqueness takes\n  precedence over enumeration prevention, and the issue of multiple accounts\n  having the same email address will be avoided, thus leaking information. Set\n  it to ``\"strict\"`` to allow for signups to go through.\n\n``ACCOUNT_RATE_LIMITS`` (default: ``{...}``)\n  In order to be secure out of the box various rate limits are in place.\n  See :doc:`Rate Limits <./rate_limits>` for details.\n\n``ACCOUNT_SESSION_REMEMBER`` (default: ``None``)\n  Controls the life time of the session. Set to ``None`` to ask the user\n  (\"Remember me?\"), ``False`` to not remember, and ``True`` to always\n  remember.\n\n``ACCOUNT_TEMPLATE_EXTENSION`` (default: ``\"html\"``)\n  A string defining the template extension to use, defaults to ``html``.\n\n\nSignup\n******\n\n``ACCOUNT_SIGNUP_FIELDS`` (default: ``['username*', 'email', 'password1*', 'password2*']``)\n  The list of fields to complete in the signup form: ``username``, ``email``,\n  ``phone``, ``password1``, ``password2``.. Fields marked with an asterisk\n  (e.g. ``'username*'``) are required.  To let the user type in their email\n  address twice to avoid typos, you can add ``'email2'``.  The field\n  ``'password2'`` can be used let the user type in their password twice to avoid\n  typos.\n\n``ACCOUNT_SIGNUP_FORM_CLASS`` (default: ``None``)\n  A string pointing to a custom form class (e.g. ``'myapp.forms.SignupForm'``)\n  that is used during signup to ask the user for additional input (e.g. a\n  newsletter signup checkbox, or birth date). This class should derive from just\n  ``forms.Form`` and only list the additional fields you need. It must implement\n  a ``def signup(self, request, user)`` method, which is called during the\n  signup process. This method allows you to handle and store the submitted data\n  as needed.\n\n``ACCOUNT_SIGNUP_FORM_HONEYPOT_FIELD`` (default: ``None``)\n  A string value that will be used as the HTML 'name' property\n  on a honeypot input field on the sign up form. Honeypot fields are hidden\n  to normal users but might be filled out by naive spam bots. When the field\n  is filled out the app will not create a new user and attempt to fool\n  the bot with a fake successful response. We recommend setting this\n  to some believable value that your app does not actually collect\n  on signup e.g. 'phone_number' or 'address'. Honeypots are not\n  always successful for sophisticated bots so this should be\n  used as one layer in a suite of spam detection tools if your\n  site is having trouble with spam.\n\n\nLogin\n*****\n\n``ACCOUNT_LOGIN_BY_CODE_ENABLED`` (default: ``False``)\n  \"Login by email\" offers an alternative method of logging in. Instead of\n  entering an email address and accompanying password, the user only enters the\n  email address.  Then, a one-time code is sent to that email address which\n  allows the user to login. This method is often referred to as \"Magic Code\n  Login\".  This setting controls whether or not this method of logging in is\n  enabled.\n\n``ACCOUNT_LOGIN_BY_CODE_TRUST_ENABLED`` (default: ``False``)\n  Indicates whether the MFA \"Trust this browser?\" functionality is to be enabled\n  for logging in by code. Note that this requires the MFA app to be installed.\n\n``ACCOUNT_LOGIN_BY_CODE_MAX_ATTEMPTS`` (default: ``3``)\n  This setting controls the maximum number of attempts the user has at inputting\n  a valid code.\n\n``ACCOUNT_LOGIN_BY_CODE_REQUIRED`` (default: ``False``)\n  When enabled (in case of ``True``), every user logging in is required to input\n  a login confirmation code sent by email.  Alternatively, you can specify a set\n  of authentication methods (``\"password\"``, ``\"mfa\"``, or ``\"socialaccount\"``)\n  for which login codes are required.\n\n``ACCOUNT_LOGIN_BY_CODE_SUPPORTS_RESEND`` (default: ``False``)\n  Whether or not the user can request a new login code.\n\n``ACCOUNT_LOGIN_BY_CODE_TIMEOUT`` (default: ``180``)\n  The code that is emailed has a limited life span. It expires this many seconds after\n  which it was sent.\n\n``ACCOUNT_LOGIN_BY_CODE_FORMAT`` (default: ``settings.ALLAUTH_USER_CODE_FORMAT``)\n  Controls the format of the login code.\n\n``ACCOUNT_LOGIN_METHODS`` (default: ``{\"username\"}``, options: ``\"email\"`` or ``\"username\"``)\n  Specifies the login method to use -- whether the user logs in by entering\n  their username, email address, or either one of both.  Note that the login methods need to\n  align with ``ACCOUNT_SIGNUP_FIELDS``, as specifying a login method that you cannot sign up with\n  typically points to a configuration error.\n\n``ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION`` (default: ``False``)\n  The default behavior is not log users in and to redirect them to\n  ``ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL``.\n\n  By changing this setting to ``True``, users will automatically be logged in once\n  they confirm their email address. Note however that this only works when\n  confirming the email address **immediately after signing up**, assuming users\n  didn't close their browser or used some sort of private browsing mode.\n\n  Note that this setting only affects email verification by link. It has no affect in\n  case you turn on code based verification\n  (``ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED``).\n\n``ACCOUNT_LOGIN_ON_PASSWORD_RESET`` (default: ``False``)\n  By changing this setting to ``True``, users will automatically be logged in\n  once they have reset their password. By default they are redirected to the\n  password reset done page.\n\n``ACCOUNT_LOGIN_TIMEOUT`` (default: ``900``)\n  The maximum allowed time (in seconds) for a login to go through the\n  various login stages. This limits, for example, the time span that the\n  2FA stage remains available.\n\n\nLogout\n******\n\n``ACCOUNT_LOGOUT_ON_GET`` (default: ``False``)\n  Determines whether or not the user is automatically logged out by a\n  GET request. `GET is not designed to modify the server state <http://programmers.stackexchange.com/questions/188860/>`_,\n  and in this case it can be dangerous. See `LogoutView in the\n  documentation <https://docs.allauth.org/en/latest/account/views.html#logout>`_\n  for details.\n\n``ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE`` (default: ``False``)\n  Determines whether or not the user is automatically logged out after\n  changing or setting their password. See documentation for\n  `Django's session invalidation on password change <https://docs.djangoproject.com/en/stable/topics/auth/default/#session-invalidation-on-password-change>`_.\n\n\nPassword Reset\n**************\n\n``ACCOUNT_PASSWORD_INPUT_RENDER_VALUE`` (default: ``False``)\n  ``render_value`` parameter as passed to ``PasswordInput`` fields.\n\n``ACCOUNT_PASSWORD_RESET_BY_CODE_ENABLED`` (default: ``False``)\n  Controls whether password reset is performed by means of following a link\n  in the email (``False``), or by entering a code (``True``).\n\n``ACCOUNT_PASSWORD_RESET_BY_CODE_FORMAT`` (default: ``settings.ALLAUTH_USER_CODE_FORMAT``)\n  Controls the format of the password reset code.\n\n``ACCOUNT_PASSWORD_RESET_BY_CODE_MAX_ATTEMPTS`` (default: ``3``)\n  This setting controls the maximum number of attempts the user has at inputting\n  a valid code.\n\n``ACCOUNT_PASSWORD_RESET_BY_CODE_TIMEOUT`` (default: ``180``)\n  The code that is emailed has a limited life span. It expires this many seconds after\n  which it was sent.\n\n``ACCOUNT_PASSWORD_RESET_TOKEN_GENERATOR`` (default: ``\"allauth.account.forms.EmailAwarePasswordResetTokenGenerator\"``)\n  A string pointing to a custom token generator\n  (e.g. 'myapp.auth.CustomTokenGenerator') for password resets. This class\n  should implement the same methods as\n  ``django.contrib.auth.tokens.PasswordResetTokenGenerator`` or subclass it.\n\n\nEmail Verification\n******************\n\n``ACCOUNT_CONFIRM_EMAIL_ON_GET`` (default: ``False``)\n  Determines whether or not an email address is automatically confirmed by\n  a GET request. `GET is not designed to modify the server state\n  <http://programmers.stackexchange.com/questions/188860/>`_, though it is\n  commonly used for email confirmation. To avoid requiring user interaction,\n  consider using POST via Javascript in your email confirmation template as\n  an alternative to setting this to True.\n\n``ACCOUNT_EMAIL_CONFIRMATION_HMAC`` (default: ``True``)\n  In order to verify an email address, a key is mailed identifying the\n  email address to be verified. In previous versions, a record was\n  stored in the database for each ongoing email confirmation, keeping\n  track of these keys. Current versions use HMAC based keys that do not\n  require server side state.\n\n``ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS`` (default: ``3``)\n  Determines the expiration date of email confirmation mails (# of days).\n\n``ACCOUNT_EMAIL_VERIFICATION`` (default: ``\"optional\"``)\n  Determines the email verification method during signup -- choose\n  one of ``\"mandatory\"``, ``\"optional\"``, or ``\"none\"``.\n\n  When set to ``\"mandatory\"`` the user is blocked from logging in until the email\n  address is verified. Choose ``\"optional\"`` or ``\"none\"`` to allow logins\n  with an unverified email address. In case of ``\"optional\"``, the email\n  verification mail is still sent, whereas in case of \"none\" no email\n  verification mails are sent.\n\n  Setting this to ``\"mandatory\"`` requires ``\"email*\"`` to be listed in\n  ``ACCOUNT_SIGNUP_FIELDS``.\n\n``ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED`` (default: ``False``)\n  Controls whether email verification is performed by means of following a link\n  in the email (``False``), or by entering a code (``True``).\n\n``ACCOUNT_EMAIL_VERIFICATION_BY_CODE_FORMAT`` (default: ``settings.ALLAUTH_USER_CODE_FORMAT``)\n  Controls the format of the email verification code.\n\n``ACCOUNT_EMAIL_VERIFICATION_BY_CODE_MAX_ATTEMPTS`` (default: ``3``)\n  This setting controls the maximum number of attempts the user has at inputting\n  a valid code.\n\n``ACCOUNT_EMAIL_VERIFICATION_BY_CODE_TIMEOUT`` (default: ``900``)\n  The code that is emailed has a limited life span. It expires this many seconds after\n  which it was sent.\n\n``ACCOUNT_EMAIL_VERIFICATION_SUPPORTS_CHANGE`` (default: ``False``)\n  Whether or not the email can be changed after signup at the email verification\n  stage.\n\n  **Warning**: If enumeration prevention is turned on, no account is created\n  when a user signs up using an already existing email. If the user then were\n  able to change to a new email address that is not taken, we would have to\n  create an account as we did not do so yet.  Currently, this is not\n  implemented. Changing email address in this scenario is simply not allowed,\n  and therefore, a user paying close attention can deduce that an account\n  already exists. This will be revisited in a future release.\n\n``ACCOUNT_EMAIL_VERIFICATION_SUPPORTS_RESEND`` (default: ``False``)\n  Whether or not the user can request a new email verification code.\n\n\nReauthentication\n****************\n\n``ACCOUNT_REAUTHENTICATION_TIMEOUT`` (default: ``300``)\n  Before asking the user to reauthenticate, we check if a successful\n  (re)authentication happened within the amount of seconds specified here, and\n  if that is the case, the new reauthentication flow is silently skipped.\n\n``ACCOUNT_REAUTHENTICATION_REQUIRED`` (default: ``False``)\n  Specifies whether or not reauthentication is required before the user can\n  alter his account.\n\n\nRouting\n*******\n\n``ACCOUNT_AUTHENTICATED_LOGIN_REDIRECTS`` (default: ``True``)\n  The default behaviour is to redirect authenticated users to\n  ``LOGIN_REDIRECT_URL`` when they try accessing login/signup pages.\n\n  By changing this setting to ``False``, logged in users will not be redirected when\n  they access login/signup pages.\n\n``ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL`` (default: ``settings.LOGIN_URL``)\n  The URL to redirect to after a successful email confirmation, in case no\n  user is logged in.\n\n``ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL`` (default: ``None``)\n  The URL to redirect to after a successful email confirmation, in\n  case of an authenticated user. Set to ``None`` to use\n  ``settings.LOGIN_REDIRECT_URL``.\n\n``ACCOUNT_LOGOUT_REDIRECT_URL`` (default: ``settings.LOGOUT_REDIRECT_URL or \"/\"``)\n  The URL (or URL name) to return to after the user logs out. Defaults to\n  Django's ``LOGOUT_REDIRECT_URL``, unless that is empty, then ``\"/\"`` is used.\n\n``ACCOUNT_SIGNUP_REDIRECT_URL`` (default: ``settings.LOGIN_REDIRECT_URL``)\n  The URL (or URL name) to redirect to directly after signing up. Note that\n  users are only redirected to this URL if the signup went through\n  uninterruptedly, for example, without any side steps due to email\n  verification. If your project requires the user to always pass through certain\n  onboarding views after signup, you will have to keep track of state indicating\n  whether or not the user successfully onboarded, and handle accordingly.\n\n\nSending Email\n*************\n\n``ACCOUNT_EMAIL_SUBJECT_PREFIX`` (default: ``\"[Site] \"``)\n  Subject-line prefix to use for email messages sent. By default, the\n  name of the current ``Site`` (``django.contrib.sites``) is used.\n\n``ACCOUNT_EMAIL_UNKNOWN_ACCOUNTS`` (default: ``True``)\n  Configures whether password reset attempts for email addresses which do not\n  have an account result in sending an email.\n\n``ACCOUNT_EMAIL_NOTIFICATIONS`` (default: ``False``)\n  When enabled, account related security notifications, such as \"Your password\n  was changed\", including information on user agent / IP address from where the\n  change originated, will be emailed.\n\n\nEmail Addresses\n***************\n\n``ACCOUNT_CHANGE_EMAIL`` (default: ``False``)\n  When disabled (``False``), users can add one or more email addresses (up to a\n  maximum of ``ACCOUNT_MAX_EMAIL_ADDRESSES``) to their account and freely manage\n  those email addresses. When enabled (``True``), users are limited to having\n  exactly one email address that they can change by adding a temporary second\n  email address that, when verified, replaces the current email address.\n\n``ACCOUNT_EMAIL_MAX_LENGTH`` (default: ``254``)\n  Maximum length of the email field. You won't need to alter this unless using\n  MySQL with the InnoDB storage engine and the ``utf8mb4`` charset, and only in\n  versions lower than 5.7.7, because the default InnoDB settings don't allow\n  indexes bigger than 767 bytes. When using ``utf8mb4``, characters are 4-bytes\n  wide, so at maximum column indexes can be 191 characters long (767/4).\n  Unfortunately Django doesn't allow specifying index lengths, so the solution\n  is to reduce the length in characters of indexed text fields.\n  More information can be found at `MySQL's documentation on converting between\n  3-byte and 4-byte Unicode character sets\n  <https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html>`_.\n\n``ACCOUNT_MAX_EMAIL_ADDRESSES`` (default: ``None``)\n  The maximum amount of email addresses a user can associate to his account. It\n  is safe to change this setting for an already running project -- it will not\n  negatively affect users that already exceed the allowed amount. Note that if\n  you set the maximum to 1, users will not be able to change their email\n  address.\n\n``ACCOUNT_UNIQUE_EMAIL`` (default: ``True``)\n  Enforce uniqueness of email addresses. On the database level, this implies\n  that only one user account can have an email address marked as verified.\n  Forms prevent a user from registering with or adding an additional email\n  address if that email address is in use by another account.\n\n\nUser Model\n**********\n\n``ACCOUNT_PRESERVE_USERNAME_CASING`` (default: ``True``)\n  This setting determines whether the username is stored in lowercase\n  (``False``) or whether its casing is to be preserved (``True``). Note that when\n  casing is preserved, potentially expensive ``__iexact`` lookups are performed\n  when filter on username. For now, the default is set to ``True`` to maintain\n  backwards compatibility.\n\n``ACCOUNT_USERNAME_BLACKLIST`` (default: ``[]``)\n  A list of usernames that can't be used by user.\n\n``ACCOUNT_USER_DISPLAY`` (default: a callable returning ``user.username``)\n  A callable (or string of the form ``'some.module.callable_name'``)\n  that takes a user as its only argument and returns the display name\n  of the user. The default implementation returns ``user.username``.\n\n``ACCOUNT_USER_MODEL_EMAIL_FIELD`` (default: ``\"email\"``)\n  The name of the field containing the ``email``, if any. See custom\n  user models.\n\n``ACCOUNT_USER_MODEL_USERNAME_FIELD`` (default: ``\"username\"``)\n  The name of the field containing the ``username``, if any. See custom\n  user models.\n\n``ACCOUNT_USERNAME_MIN_LENGTH`` (default: ``1``)\n  An integer specifying the minimum allowed length of a username.\n\n``ACCOUNT_USERNAME_VALIDATORS`` (default: ``None``)\n  A path\n  (``'some.module.validators.custom_username_validators'``) to a list of\n  custom username validators. If left unset, the validators setup\n  within the user model username field are used.\n\n  Example::\n\n      # In validators.py\n\n      from django.contrib.auth.validators import ASCIIUsernameValidator\n\n      custom_username_validators = [ASCIIUsernameValidator()]\n\n      # In settings.py\n\n      ACCOUNT_USERNAME_VALIDATORS = 'some.module.validators.custom_username_validators'\n"
  },
  {
    "path": "docs/account/decorators.rst",
    "content": "Decorators\n==========\n\nVerified Email Required\n------------------------\n\nEven when email verification is not mandatory during signup, there\nmay be circumstances during which you really want to prevent\nunverified users from proceeding. For this purpose you can use the\nfollowing decorator::\n\n    from allauth.account.decorators import verified_email_required\n\n    @verified_email_required\n    def verified_users_only_view(request):\n        ...\n\nThe behavior is as follows:\n\n- If the user isn't logged in, it acts identically to the\n  ``login_required`` decorator.\n\n- If the user is logged in but has no verified email address, an\n  email verification mail is automatically resent and the user is\n  presented with a page informing them they need to verify their email\n  address.\n"
  },
  {
    "path": "docs/account/email.rst",
    "content": "Email\n=====\n\nCase Sensitivity\n****************\n\nHistorically, email addresses started out as case sensitive because the local\npart (the part before the \"@\") could represent a case sensitive user\nname. However, over time, this proved to be a bad idea and the RFCs that\nsucceeded the original were adjusted to move away from treating email addresses\nas case sensitive.\n\n- `RFC 821 <https://tools.ietf.org/html/rfc821>`_: The original RFC from 1982\n  relies on case sensitivity.\n\n- `RFC 2821 <https://tools.ietf.org/html/rfc2821>`_: Released in 2001, obsoletes\n  RFC 821, yet, is still case sensitive.\n\n- `RFC 5321 <https://datatracker.ietf.org/doc/html/rfc5321#section-4.1.2>`_: In\n  2008, the \"Local-part\" is weakened to \"MAY be case-sensitive\".\n\n- `RFC 6530 <https://tools.ietf.org/html/rfc6530#section-10.1>`_: In 2012, the\n  following is acknowledged:\n\n    It has long been the case that the email syntax permits choices about\n    mailbox names that are **unwise in practice** [...].  The most often cited\n    examples involve the use of **case-sensitivity** [...] in mailbox local\n    parts.  These deliberately unusual constructions **are permitted** by the\n    protocols, and servers are expected to support them.  Although they can\n    provide value in special cases, taking advantage of them **is almost always\n    bad practice** unless the intent is to create some form of **security by\n    obscurity**.\n\nTo deal with this, previous versions of django-allauth used to store email\naddresses in their original case, while performing lookups in a case insensitive\nstyle. This approach led to subtle bugs in upstream code, and also comes at a\nperformance cost (``__iexact`` lookups). The latter requires case insensitive\nindex support, which not all databases support. Re-evaluating the approach in\ncurrent times has led to the conclusion that the benefits do not outweigh the\ncosts.  Therefore, email addresses are now always stored as lower case.\n"
  },
  {
    "path": "docs/account/forms.rst",
    "content": "Forms\n=====\n\nLogin\n*****\n\n*Path*:\n  ``allauth.account.forms.LoginForm``\n*Used on*:\n  `account_login <views.html#login-account-login>`__ view.\n\nExample override::\n\n    from allauth.account.forms import LoginForm\n    class MyCustomLoginForm(LoginForm):\n\n        def login(self, *args, **kwargs):\n\n            # Add your own processing here.\n\n            # You must return the original result.\n            return super().login(*args, **kwargs)\n\nYou have access to the following:\n\n- ``self.user`` is the User object that is logging in.\n\n``settings.py``::\n\n    ACCOUNT_FORMS = {'login': 'mysite.forms.MyCustomLoginForm'}\n\nBy default, the password field renders a \"Forgot your password?\" link as the\nhelp text. By providing a ``\"account/password_reset_help_text.html\"`` template\nyou can customize that text.\n\n\nSignup\n******\n\n*Path*:\n  ``allauth.account.forms.SignupForm``\n*Used on*:\n  `account_signup <views.html#signup-account-signup>`__ view.\n\nExample override::\n\n    from allauth.account.forms import SignupForm\n    class MyCustomSignupForm(SignupForm):\n\n        def save(self, request):\n\n            # Ensure you call the parent class's save.\n            # .save() returns a User object.\n            user = super().save(request)\n\n            # Add your own processing here.\n\n            # You must return the original result.\n            return user\n\n``settings.py``::\n\n    ACCOUNT_FORMS = {'signup': 'mysite.forms.MyCustomSignupForm'}\n\n\nAdd Email\n*********\n\n*Path*:\n  ``allauth.account.forms.AddEmailForm``\n*Used on*:\n   `account_email <views.html#emails-management-account-email>`__ view.\n\nExample override::\n\n    from allauth.account.forms import AddEmailForm\n    class MyCustomAddEmailForm(AddEmailForm):\n\n        def save(self, request):\n\n            # Ensure you call the parent class's save.\n            # .save() returns an allauth.account.models.EmailAddress object.\n            email_address_obj = super().save(request)\n\n            # Add your own processing here.\n\n            # You must return the original result.\n            return email_address_obj\n\nYou have access to the following:\n\n- ``self.user`` is the User object that is logged in.\n\n``settings.py``::\n\n    ACCOUNT_FORMS = {'add_email': 'mysite.forms.MyCustomAddEmailForm'}\n\n\nChange Password\n***************\n\n*Path*:\n  ``allauth.account.forms.ChangePasswordForm``\n*Used on*:\n  `account_change_password <views.html#password-management>`__ view.\n\nExample override::\n\n    from allauth.account.forms import ChangePasswordForm\n    class MyCustomChangePasswordForm(ChangePasswordForm):\n\n        def save(self):\n\n            # Ensure you call the parent class's save.\n            # .save() does not return anything\n            super().save()\n\n            # Add your own processing here.\n\nYou have access to the following:\n\n- ``self.user`` is the User object that is logged in.\n\n``settings.py``::\n\n    ACCOUNT_FORMS = {'change_password': 'mysite.forms.MyCustomChangePasswordForm'}\n\n\nSet Password\n************\n\n*Path*:\n  ``allauth.account.forms.SetPasswordForm``\n*Used on*:\n  `account_set_password <views.html#password-management>`__ view.\n\nExample override::\n\n    from allauth.account.forms import SetPasswordForm\n    class MyCustomSetPasswordForm(SetPasswordForm):\n\n        def save(self):\n\n            # Ensure you call the parent class's save.\n            # .save() does not return anything\n            super().save()\n\n            # Add your own processing here.\n\nYou have access to the following:\n\n- ``self.user`` is the User object that is logged in.\n\n``settings.py``::\n\n    ACCOUNT_FORMS = {'set_password': 'mysite.forms.MyCustomSetPasswordForm'}\n\nReset Password\n**************\n\n*Path*:\n  ``allauth.account.forms.ResetPasswordForm``\n*Used on*:\n  `account_reset_password <views.html#password-reset-account-reset-password>`__ view.\n\nExample override::\n\n    from allauth.account.forms import ResetPasswordForm\n    class MyCustomResetPasswordForm(ResetPasswordForm):\n\n        def save(self, request):\n\n            # Ensure you call the parent class's save.\n            # .save() returns a string containing the email address supplied\n            email_address = super().save(request)\n\n            # Add your own processing here.\n\n            # Ensure you return the original result\n            return email_address\n\nYou have access to the following:\n\n- ``self.users`` is a list of all possible User objects with matching email address.\n\n``settings.py``::\n\n    ACCOUNT_FORMS = {'reset_password': 'mysite.forms.MyCustomResetPasswordForm'}\n\n\nReset Password From Key\n***********************\n\n*Path*:\n  ``allauth.account.forms.ResetPasswordKeyForm``\n*Used on*:\n  `account_reset_password <views.html#password-reset-account-reset-password>`__ view.\n\nExample override::\n\n    from allauth.account.forms import ResetPasswordKeyForm\n    class MyCustomResetPasswordKeyForm(ResetPasswordKeyForm):\n\n        def save(self):\n\n            # Add your own processing here.\n\n            # Ensure you call the parent class's save.\n            # .save() does not return anything\n            super().save()\n\nYou have access to the following:\n\n- ``self.user`` is the User object.\n\n``settings.py``::\n\n    ACCOUNT_FORMS = {'reset_password_from_key': 'mysite.forms.MyCustomResetPasswordKeyForm'}\n"
  },
  {
    "path": "docs/account/index.rst",
    "content": "Regular Accounts\n================\n\n.. toctree::\n\n   introduction\n   configuration\n   rate_limits\n   views\n   templates\n   forms\n   decorators\n   signals\n   email\n   phone\n   adapter\n   advanced\n"
  },
  {
    "path": "docs/account/introduction.rst",
    "content": "Introduction\n============\n\nA regular account is a user account, identified by an email address or username,\nand protected by a password. The ``allauth.account`` app is responsible for\nmanaging regular accounts. It supports:\n\n- Authentication by username or email.\n\n- Registration of new users, with custom signup form support.\n\n- Email address management: both a simple change email address flow, and more\n  elaborate flows with multiple email addresses (adding secondary, setting a\n  primary) is supported.\n\n- Password forgotten flow.\n\n- Changing of the password.\n\n- Email address verification flow.\n"
  },
  {
    "path": "docs/account/phone.rst",
    "content": "Phone\n=====\n\nInstallation\n************\n\nIn addition to following the overall instructions, pay attention to the\nfollowing in the ``settings.py`` of your project::\n\n  # Make sure that the login methods includes \"phone\" as a method.\n  ACCOUNT_LOGIN_METHODS = {\"phone\", \"email\"}\n\n  # Add a required phone field to the signup fields.\n  # ACCOUNT_SIGNUP_FIELDS = [\n    'phone*',\n    'email*'  # Can be left out if you want to only use 'phone'.\n  ]\n\n  # You will need to provide methods for storing phone numbers, and\n  # sending SMS messages in a custom adapter.\n  ACCOUNT_ADAPTER = 'project.users.adapter.MyAccountAdapter'\n\n\nConfiguration\n=============\n\nAvailable settings:\n\n``ACCOUNT_PHONE_VERIFICATION_ENABLED`` (default: ``True``)\n  Whether or not mandatory verification of phone numbers during login/signup takes place.\n\n``ACCOUNT_PHONE_VERIFICATION_MAX_ATTEMPTS`` (default: ``3``)\n  This setting controls the maximum number of attempts the user has at inputting\n  a valid code.\n\n``ACCOUNT_PHONE_VERIFICATION_TIMEOUT`` (default: ``900``)\n  The code that is sent has a limited life span. It expires this many seconds after\n  which it was sent.\n\n``ACCOUNT_PHONE_VERIFICATION_SUPPORTS_CHANGE`` (default: ``False``)\n  Whether or not the phone number can be changed after signup at the\n  phone number verification stage.\n\n  **Warning**: the warning related to enumeration prevent over at\n   ``ACCOUNT_EMAIL_VERIFICATION_SUPPORTS_CHANGE`` holds here as well.\n\n``ACCOUNT_PHONE_VERIFICATION_SUPPORTS_RESEND`` (default: ``False``)\n  Whether or not the user can request a new phone number verification code.\n\n``ACCOUNT_PHONE_VERIFICATION_CODE_FORMAT`` (default: ``settings.ALLAUTH_USER_CODE_FORMAT``)\n  Controls the format of the verification code.\n\n\nForm Fields\n***********\n\nFor presenting a phone number form field to the user a basic ``<input type=\"tel\">`` field\nis used that requires input in E164 format. There are various external projects\nthat offer more elaborate phone number input fields. You can switch over to\nusing the fields provided by those projects, or, tweak the phone number\nvalidaton logic, by overriding the following adapter methods:\n\n.. autoclass:: allauth.account.adapter.DefaultAccountAdapter\n\n   .. automethod:: phone_form_field\n   .. automethod:: clean_phone\n\n\nDatabase Models\n***************\n\nOut of the box, there are no models provided intended to store the phone numbers\nof users.  It is up to the developer to decide where phone numbers are to be\nstored, for example, on a custom user model, or, on a separate `Phone` model of\nits own. Once those the models are setup, the following adapter methods need to\nbe populated so that the models will be used:\n\n .. autoclass:: allauth.account.adapter.DefaultAccountAdapter\n\n   .. automethod:: get_phone\n   .. automethod:: set_phone\n   .. automethod:: set_phone_verified\n   .. automethod:: get_user_by_phone\n\n\nSending SMS Messages\n********************\n\nFor sending SMS messages, various external providers and packages are\navailable. You can integrate those by overriding the following adapter method:\n\n .. autoclass:: allauth.account.adapter.DefaultAccountAdapter\n\n   .. automethod:: send_verification_code_sms\n   .. automethod:: send_unknown_account_sms\n"
  },
  {
    "path": "docs/account/rate_limits.rst",
    "content": "Rate Limits\n===========\n\nIn this section the ratelimits related to the ``allauth.account`` app are\ndocumented.  Refer to the :doc:`overall rate limit documentation <../common/rate_limits>`\nfor more background information on the mechanism itself.\n\nThe rate limits are configured through the ``ACCOUNT_RATE_LIMITS`` setting:\n\n- Set it to ``False`` to disable all rate limits.\n\n- Set it to a dictionary, e.g. ``{\"action\": \"your-rate-limit\", ...}`` to use the\n  default configuration but with your specific actions overriden.\n\n\nThe following actions are available for configuration:\n\n``\"change_password\"`` (default: ``\"5/m/user\"``)\n  Changing the password (for already authenticated users).\n\n``\"change_phone\"`` (default: ``\"1/m/user\"``)\n  Changing the phone number.\n\n``\"manage_email\"`` (default: ``\"10/m/user\"``)\n  Email management related actions, such as add, remove, change primary.\n\n``\"reset_password\"`` (default: ``\"20/m/ip,5/m/key\"``)\n  Requesting a password reset. The email for which the password is to be reset is\n  passed as the key.\n\n``\"reauthenticate\"`` (default: ``\"10/m/user\"``)\n  Reauthentication (for users already logged in).\n\n``\"reset_password_from_key\"`` (default: ``\"20/m/ip\"``)\n  Password reset (the view the password reset email links to).\n\n``\"signup\"`` (default: ``\"20/m/ip\"``)\n  Signups.\n\n``\"login\"`` (default: ``\"30/m/ip\"``)\n  Logins.\n\n``\"login_failed\"`` (default: ``\"10/m/ip,5/5m/key\"``)\n  Restricts the allowed number of failed login attempts. When exceeded, the user\n  is prohibited from logging in for the remainder of the rate limit. Important:\n  while this protects the allauth login view, it does not\n  :doc:`protect Django's admin login from being brute forced <../common/admin>`.\n\n``\"confirm_email\"`` (default: ``\"1/3m/key\"`` (link) or ``\"1/10s/key\"`` (code))\n  Users can request email confirmation mails via the email management view, and,\n  implicitly, when logging in with an unverified account. This rate limit\n  prevents users from sending too many of these mails.\n"
  },
  {
    "path": "docs/account/signals.rst",
    "content": "Signals\n=======\n\nThere are several signals emitted during authentication flows. You can\nhook to them for your own needs.\n\n- ``allauth.account.signals.authentication_step_completed(request, user, method, **kwargs)``\n    Sent when an authentication step was completed. Note that this does not\n    imply that the user is fully signed in. For example, consider a case where a\n    user authenticates using a password, but still needs to complete the 2FA\n    challenge.\n\n- ``allauth.account.signals.user_logged_in(request, user)``\n    Sent when a user logs in.\n\n- ``allauth.account.signals.user_logged_out(request, user)``\n    Sent when a user logs out.\n\n- ``allauth.account.signals.user_signed_up(request, user)``\n    Sent when a user signs up for an account. This signal is\n    typically followed by a ``user_logged_in``, unless email verification\n    prohibits the user to log in.\n\n- ``allauth.account.signals.password_set(request, user)``\n    Sent when a password has been successfully set for the first time.\n\n- ``allauth.account.signals.password_changed(request, user)``\n    Sent when a password has been successfully changed.\n\n- ``allauth.account.signals.password_reset(request, user)``\n    Sent when a password has been successfully reset.\n\n- ``allauth.account.signals.email_confirmed(request, email_address)``\n    Sent after the email address in the db was updated and set to confirmed.\n\n- ``allauth.account.signals.email_confirmation_sent(request, confirmation, signup)``\n    Sent right after the email confirmation is sent.\n\n- ``allauth.account.signals.email_changed(request, user, from_email_address, to_email_address)``\n    Sent when a primary email address has been changed.\n\n- ``allauth.account.signals.email_added(request, user, email_address)``\n    Sent when a new email address has been added.\n\n- ``allauth.account.signals.email_removed(request, user, email_address)``\n    Sent when an email address has been deleted.\n"
  },
  {
    "path": "docs/account/templates.rst",
    "content": "Template Tags\n=============\n\nUse ``user_display`` to render a user name without making assumptions on\nhow the user is represented (e.g. render the username, or first\nname?)::\n\n    {% load account %}\n\n    {% user_display user %}\n\nOr, if you need to use in a ``{% blocktrans %}``::\n\n    {% load account %}\n\n    {% user_display user as user_display %}\n    {% blocktrans %}{{ user_display }} has logged in...{% endblocktrans %}\n\nThen, override the ``ACCOUNT_USER_DISPLAY`` setting with your project\nspecific user display callable.\n\nIf you set ``ACCOUNT_USERNAME_REQUIRED = False`` and ``ACCOUNT_USER_MODEL_USERNAME_FIELD = None``,\nthen you can simply display the user.email with {{ user }}::\n\n    In case you forgot, your username is {{ user }}.\n"
  },
  {
    "path": "docs/account/views.rst",
    "content": "Views\n=====\n\nLogin\n-----\n\n*URL name*:\n  ``account_login``\n\nUsers login via the ``allauth.account.views.LoginView`` view over at\n``/accounts/login/`` (URL name ``account_login``). When users attempt to login\nwhile their account is inactive (``user.is_active``) they are presented with the\n``account/account_inactive.html`` template.\n\n\nSignup\n------\n\n*URL name*:\n  ``account_signup``\n\nUsers sign up via the ``allauth.account.views.SignupView`` view over at\n``/accounts/signup/`` (URL name ``account_signup``).\n\n\nLogout\n------\n\n*URL name*:\n  ``account_logout``\n\nThe logout view (``allauth.account.views.LogoutView``) over at\n``/accounts/logout/`` (URL name ``account_logout``) requests for confirmation\nbefore logging out. The user is logged out only when the confirmation is\nreceived by means of a POST request.\n\nIf you are wondering why, consider what happens when a malicious user\nembeds the following image in a post::\n\n    <img src=\"http://example.com/accounts/logout/\">\n\nFor this and more background information on the subject, see:\n\n- https://code.djangoproject.com/ticket/15619\n- http://stackoverflow.com/questions/3521290/logout-get-or-post\n\nIf you insist on having logout on GET, then please consider adding a\nbit of Javascript to automatically turn a click on a logout link into\na POST. As a last resort, you can set ``ACCOUNT_LOGOUT_ON_GET`` to\n``True``.\n\n\nPassword Management\n-------------------\n\nAuthenticated users can manage their password account using the\n``allauth.account.views.PasswordSetView`` and\n``allauth.account.views.PasswordChangeView`` views, over at\n``/accounts/password/set/`` respectively ``/accounts/password/change/`` (URL names\n``account_set_password`` and ``account_change_password`` respectively).\n\nUsers are redirected between these views, according to whether or not\nthey have setup a password (``user.has_usable_password()``).  Typically,\nwhen users signup via a social provider they will not have a password\nset.\n\n\nPassword Reset\n--------------\n\n*URL name*:\n  ``account_reset_password``\n\nUsers can request a password reset using the\n``allauth.account.views.PasswordResetView`` view over at\n``/accounts/password/reset/`` (URL name ``account_reset_password``).  An email\nwill be sent containing a reset link pointing to ``PasswordResetFromKeyView``\nview.\n\n\nEmails Management\n-----------------\n\n*URL name*:\n  ``account_email``\n\nUsers manage the email addresses tied to their account using the\n``allauth.account.views.EmailView`` view over at ``/accounts/email/`` (URL name\n``account_email``). Here, users can add (and verify) email addresses, remove\nemail addresses, and choose a new primary email address.\n\n\nEmail Verification\n-------------------\n\nDepending on the setting ``ACCOUNT_EMAIL_VERIFICATION``, a verification\nemail is sent pointing to the\n``allauth.account.views.ConfirmEmailView`` view.\n\nThe setting ``ACCOUNT_CONFIRM_EMAIL_ON_GET`` determines whether users\nhave to manually confirm the address by submitting a confirmation form,\nor whether the address is automatically confirmed by a mere GET\nrequest.\n"
  },
  {
    "path": "docs/common/admin.rst",
    "content": "Admin\n=====\n\nThe Django admin site (``django.contrib.admin``) does not use Django allauth by\ndefault. Since Django admin provides a custom login view, it does not go through\nthe normal Django allauth workflow.\n\n.. warning::\n\n    This limitation means that Django allauth features are not applied to the\n    Django admin site:\n\n    * The admin login is not protected from being brute forced (``ACCOUNT_RATE_LIMITS``).\n    * Two-factor authentication is not enforced.\n    * Any other custom workflow that overrides the Django allauth adapter's\n      login method will not be applied.\n\nAn easy workaround for this is to require users to login before going to the\nDjango admin site's login page, by adding this to urls.py (note that the following would need to be applied to\nevery instance of ``AdminSite``):\n\n\n.. code-block:: python\n\n    from django.contrib import admin\n    from allauth.account.decorators import secure_admin_login\n\n    admin.autodiscover()\n    admin.site.login = secure_admin_login(admin.site.login)\n"
  },
  {
    "path": "docs/common/configuration.rst",
    "content": "Configuration\n=============\n\nAvailable settings:\n\n``ALLAUTH_DEFAULT_AUTO_FIELD``\n  Can be set to configure the primary key of all models. For\n  example: ``\"hashid_field.HashidAutoField\"``.\n\n``ALLAUTH_USER_CODE_FORMAT`` (default: ``{\"numeric\": False, \"dashed\": True, length: 8}``)\n  Controls the format of user-facing verification codes (e.g. email\n  verification, phone verification, login codes).\n"
  },
  {
    "path": "docs/common/email.rst",
    "content": "Sending Email\n=============\n\nEmails sent (e.g. in case of password forgotten or email\nconfirmation) can be altered by providing your own\ntemplates. Templates are named as follows::\n\n    account/email/email_confirmation_signup_subject.txt\n    account/email/email_confirmation_signup_message.txt\n\n    account/email/email_confirmation_subject.txt\n    account/email/email_confirmation_message.txt\n\nIn case you want to include an HTML representation, add an HTML\ntemplate as follows::\n\n    account/email/email_confirmation_signup_message.html\n\n    account/email/email_confirmation_message.html\n\nThe project does not contain any HTML email templates out of the box.\nWhen you do provide these yourself, note that both the text and HTML\nversions of the message are sent.\n\nIf this does not suit your needs, you can hook up your own custom\nmechanism by overriding the ``send_mail`` method of the account adapter\n(``allauth.account.adapter.DefaultAccountAdapter``).\n"
  },
  {
    "path": "docs/common/index.rst",
    "content": "Common Functionality\n====================\n\n.. toctree::\n   :maxdepth: 1\n\n   configuration\n   email\n   templates\n   messages\n   admin\n   rate_limits\n"
  },
  {
    "path": "docs/common/messages.rst",
    "content": "Messages\n========\n\nThe Django messages framework (``django.contrib.messages``) is used if\nit is listed in ``settings.INSTALLED_APPS``.  All messages (as in\n``django.contrib.messages``) are configurable by overriding their\nrespective template. If you want to disable a message, simply override\nthe message template with a blank one.\n"
  },
  {
    "path": "docs/common/rate_limits.rst",
    "content": ".. _rate_limits:\n\nRate Limits\n===========\n\nIn order to be secure out of the box various rate limits are in place. The rate\nlimit mechanism is backed by a Django cache. Hence, rate limiting will not work\nproperly if you are using the `DummyCache`.\n\nWhen rate limits are hit the ``429.html`` template is rendered,\nalternatively, you can configure a custom handler by declaring\na ``handler429`` view in your root URLconf.\n\nRate limits are consumed by triggering actions, the full list of which is\ndocumented below.  Per action, the rate can be configured. The rate itself is an\namount, per time unit, per either IP address, user or action-specific key.\n\nFor example, requesting a password reset is an action that is both limited\nglobally by IP address, as well as per email. Here, the email address used is\nthe specific key.\n\n\n.. danger::\n\n    Rate limits rely on accurate client IP address detection to function correctly.\n    However, **it is not possible for django-allauth to reliably determine the\n    client IP address out of the box** because the correct method varies depending\n    on your deployment architecture (direct connections, load balancers, reverse\n    proxies, CDNs, etc.).\n\n    The ``X-Forwarded-For`` header cannot be used to determine the client IP,\n    as **this header can be trivially spoofed by malicious actors**, allowing them\n    to completely bypass rate limits.\n\n    To ensure rate limits work correctly:\n\n    1. **Review and adjust the rate limit configuration settings** documented below\n       (``ALLAUTH_TRUSTED_PROXY_COUNT``, ``ALLAUTH_TRUSTED_CLIENT_IP_HEADER``)\n       to match your security requirements and deployment architecture.\n\n    2. If the settings are not sufficient, **override the account adapter's**\n       ``get_client_ip()`` method to implement custom logic for extracting the\n       real client IP address from the correct header(s) for your specific\n       infrastructure. See the :doc:`adapter documentation <../account/adapter>` for\n       guidance on implementing a custom adapter.\n\n\nConfiguration\n-------------\n\n``ALLAUTH_TRUSTED_PROXY_COUNT`` (default: ``0``)\n    As the ``X-Forwarded-For`` header can be spoofed, you need to\n    configure the number of proxies that are under your control and hence,\n    can be trusted. The default is 0, meaning, no proxies are trusted.  As a\n    result, the ``X-Forwarded-For`` header will be disregarded by default.\n\n``ALLAUTH_TRUSTED_CLIENT_IP_HEADER`` (default: ``None``)\n    If your service is running behind a trusted proxy that sets a custom header\n    containing the client IP address, specify that header name here. The client\n    IP will be extracted from this header instead of ``X-Forwarded-For``.\n    Examples: ``\"CF-Connecting-IP\"`` (Cloudflare), ``\"X-Real-IP\"`` (nginx).\n\n\nImplementation Notes\n--------------------\n\nThe builtin rate limitting relies on a cache and uses non-atomic operations,\nmaking it vulnerable to race conditions. As a result, users may occasionally\nbypass the intended rate limit due to concurrent access. However, such race\nconditions are rare in practice. For example, if the limit is set to 10 requests\nper minute and a large number of parallel processes attempt to test that limit,\nyou may occasionally observe slight overruns—such as 11 or 12 requests slipping\nthrough. Nevertheless, exceeding the limit by a large margin is highly unlikely\ndue to the low probability of many processes entering the critical non-atomic\ncode section simultaneously.\n\n\nTesting\n-------\n\nUnless the rate limit is disabled or the default limits are increased, you might\nrun intro problems if you're running unit tests that are dependant on\nfuncionalities covered by the rate limits. For example, if you're testing the\n`confirm_email` functionality in your unit tests and you're testing if the\nverification email is sent twice after requesting it twice, only one of the\nemails will be sent.\n"
  },
  {
    "path": "docs/common/templates.rst",
    "content": "Templates\n=========\n\nIntroduction\n------------\n\nThe templates that are offered out of the box are intentionally plain and\nwithout any styling. We do not want to pick a side in the multitudes of frontend\nstyling options out there, and the look and feel typically should be adjusted to\nmatch the branding of your project. Therefore it is recommended that you copy all\ntemplates over to your own project and adjust them as you see fit.\n\nHaving said that, with features such as third party account providers\nand two-factor authentication, adjusting the templates involves a lot more than\njust styling a ``login.html`` and a ``signup.html`` template. Therefore, a\nmechanism is included that allows you to adjust the look and feel of all\ntemplates by only overriding a few core templates.  This approach allows you to\nachieve visual results fast, but is of course more limited compared to styling\nall templates yourself.\n\n\nOverriding the Built-In Templates\n---------------------------------\n\nThe ``allauth`` app includes all templates, and can be found in the\n`allauth/templates\n<https://codeberg.org/allauth/django-allauth/src/branch/main/allauth/templates>`__\ndirectory. When ``allauth`` is part of your ``INSTALLED_APPS``, and\n``\"APP_DIRS\": True`` is configured, Django will be able to find its templates.\nAs ``DIRS`` is searched before ``APP_DIRS``, overriding the templates involves\nadding an entry to ``DIRS`` that points to your a project specific template\nfolder, as follows::\n\n    from pathlib import Path\n\n    BASE_DIR = Path(__file__).resolve().parent.parent\n\n    TEMPLATES = [\n        {\n            \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n            \"DIRS\": [\n                BASE_DIR / \"templates\"\n            ],\n            \"APP_DIRS\": True,\n            \"OPTIONS\": {\n                \"context_processors\": [\n                    \"django.template.context_processors.debug\",\n                    \"django.template.context_processors.request\",\n                    \"django.contrib.auth.context_processors.auth\",\n                    \"django.contrib.messages.context_processors.messages\",\n                ],\n            },\n        },\n    ]\n\nIf you copy over all templates to your ``BASE_DIR / \"templates\"`` it should\ncontain these entries (a.o.):\n\n- An ``account`` folder containing the templates from the ``allauth.account`` app.\n- A ``socialaccount`` folder containing the templates from the ``allauth.socialaccount`` app.\n- A ``mfa`` folder containing the templates from the ``allauth.mfa`` app.\n- An ``allauth`` folder containing the overall styling templates (see the next section).\n\n\nStyling the Existing Templates\n------------------------------\n\nInstead of copying all templates, a mechanism is included that allows you to\nadjust the look and feel of all templates by only overriding a few core\ntemplates.  This approach allows you to achieve visual results fast, but is of\ncourse more limited compared to styling all templates yourself.\n\n\nLayouts\n^^^^^^^\n\nThe existing templates use two base page layouts:\n\n- The entrance layout: These are all pages where the user is in the process of\n  authenticating, such as the login and signup pages.\n\n- The account management layout: The pages where an authenticated user can\n  manage the account, such as changing the email address or password.\n\nYou can alter these layouts by providing these templates in your own project:\n\n==========================================  ===========\nTemplate file                               Description\n==========================================  ===========\nallauth/layouts/base.html                   The overall base template.\nallauth/layouts/entrance.html               The entrance template, extending the base template.\nallauth/layouts/manage.html                 The account management template, extending the base template.\n==========================================  ===========\n\n\nElements\n^^^^^^^^\n\nWhen rendering e.g. a Bootstrap button you would typically use::\n\n    <button class=\"btn btn-primary\">Okay</button>\n\nYet, when a different CSS framework is used other class names apply, and\npossibly even other markup. Therefore, the built-in templates do not include the\nabove content directly. Instead of referring to tags such ``<button>``, ``<h1>``\nor ``<form>`` directly, the templates render those elements using a special\nelement `templatetag`::\n\n    {% load allauth %}\n    {% element h1 tags=\"foo,bar\" %}Welcome{% endelement %}\n\nUnder the hood, this `templatetag` renders the ``allauth/elements/h1.html``\ntemplate, which out of the box contains this::\n\n    {% load allauth %}<h1>{% slot %}{% endslot %}</h1>\n\nIf you want to change the styling of all headings across all pages, you can do\nso by overriding that ``allauth/elements/h1.html`` template, as follows::\n\n    {% load allauth %}\n    <div class=\"myproject-h1 aa-{{ origin|slugify }}\"\n         style=\"font-size: {% if \"foo\" in attrs.tags %}3{% else %}5{% endif %}rem\">\n        {% slot %}{% endslot %}\n    </div>\n\nOf course, the above is a bit of a contrived example. In each of the element\ntemplates the ``{{ origin }}`` context variable is available, which is equal to\nthe base template name where the element is used (e.g. ``account/login`` for\nelements used from within the ``account/login.html`` template).\n\nSlots may also be named. In that case, the ``element`` will be invoked like::\n\n    {% load allauth %}\n    {% element form method=\"post\" action=action_url %}\n        {% slot body %}\n            ...\n        {% endslot %}\n        {% slot actions %}\n            ...\n        {% endslot %}\n    {% endelement %}\n\nWhen overriding an element with named slots, they may be injected in any order.\nFor example, with ``allauth/elements/form.html``::\n\n    {% load allauth %}\n    <form method=\"{{ attrs.method }}\" action=\"{{ attrs.action }}\">\n        {% slot body %}\n        {% endslot %}\n        <hr>\n        {% slot actions %}\n        {% endslot %}\n    </form>\n\nThe following elements are available -- override them as you see fit for your\nproject:\n\n==========================================  ===========\nTemplate file                               Description\n==========================================  ===========\nallauth/elements/alert.html                 Display alert messages.\nallauth/elements/badge.html                 Badges for labeling purposes.\nallauth/elements/button.html                A button (``<button>``).\nallauth/elements/button_group.html          A group of related buttons.\nallauth/elements/details.html               Disclosure (``<details>``).\nallauth/elements/field.html                 A single form field.\nallauth/elements/fields.html                The form fields, uses ``{{form.as_p}}`` by default, hence, not rendering the ``field.html``.\nallauth/elements/form.html                  The ``<form>`` container tag.\nallauth/elements/h1.html                    Level 1 heading (``<h1>``).\nallauth/elements/h2.html                    Level 2 heading (``<h2>``).\nallauth/elements/hr.html                    Horizontal rule (``<hr>``).\nallauth/elements/img.html                   An image  tag (``<img>``).\nallauth/elements/panel.html                 A panel (aka card), consisting of a title, body and actions.\nallauth/elements/p.html                     Paragraphs (``<p>``).\nallauth/elements/provider.html              A link to a third-party provider.\nallauth/elements/provider_list.html         The container element for the list of third-party providers.\nallauth/elements/table.html                 Table (``<table>``).\nallauth/elements/tbody.html                 Table body (``<tbody>``).\nallauth/elements/td.html                    Table data cell (``<td>``).\nallauth/elements/th.html                    Table header cell (``<th>``).\nallauth/elements/thead.html                 Table head (``<thead>``).\nallauth/elements/tr.html                    Table row (``<tr>``).\n==========================================  ===========\n\n\nExample\n^^^^^^^\n\nThe source repository contains a Bootstrap styled example project, which\nprovides a good example of how all of the above can be put together to provide\nstyling without altering any of the content templates.  Please take a look at\nthe `templates of the example project\n<https://codeberg.org/allauth/django-allauth/src/branch/main/examples/regular-django/example/templates>`__.\nYou can see those templates live in the `running demo project\n<https://django.demo.allauth.org>`__.\n"
  },
  {
    "path": "docs/conf.py",
    "content": "import os\nimport sys\nfrom pathlib import Path\n\nfrom sphinx.util.fileutil import copy_asset_file\n\n\n# -*- coding: utf-8 -*-\n#\n# django-allauth documentation build configuration file, created by\n# sphinx-quickstart on Wed Jun  6 22:58:42 2012.\n#\n# This file is execfile()d with the current directory set to its containing dir.\n#\n# Note that not all possible configuration values are present in this\n# autogenerated file.\n#\n# All configuration values have a default; values that are commented out\n# serve to show the default.\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n# sys.path.insert(0, os.path.abspath('.'))\n\n# -- General configuration -----------------------------------------------------\n\n# If your documentation needs a minimal Sphinx version, state it here.\n# needs_sphinx = '1.0'\n\n# Add any Sphinx extension module names here, as strings. They can be extensions\n# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.\nextensions = []\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = [\"_templates\"]\n\n# The suffix of source filenames.\nsource_suffix = \".rst\"\n\n# The encoding of source files.\n# source_encoding = 'utf-8-sig'\n\n# The master toctree document.\nmaster_doc = \"index\"\n\n# General information about the project.\nproject = \"django-allauth\"\ncopyright = \"2017, Raymond Penners\"\n\n# The version info for the project you're documenting, acts as replacement for\n# |version| and |release|, also used in various other places throughout the\n# built documents.\n#\n# The short X.Y version.\nversion = \"65.15.0\"\n# The full version, including alpha/beta/rc tags.\nrelease = \"65.15.0\"\n\n# The language for content autogenerated by Sphinx. Refer to documentation\n# for a list of supported languages.\nlanguage = \"en\"\n\n# There are two options for replacing |today|: either, you set today to some\n# non-false value, then it is used:\n# today = ''\n# Else, today_fmt is used as the format for a strftime call.\n# today_fmt = '%B %d, %Y'\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\nexclude_patterns = [\"_build\"]\n\n# The reST default role (used for this markup: `text`) to use for all documents.\n# default_role = None\n\n# If true, '()' will be appended to :func: etc. cross-reference text.\n# add_function_parentheses = True\n\n# If true, the current module name will be prepended to all description\n# unit titles (such as .. function::).\n# add_module_names = True\n\n# If true, sectionauthor and moduleauthor directives will be shown in the\n# output. They are ignored by default.\n# show_authors = False\n\n# The name of the Pygments (syntax highlighting) style to use.\npygments_style = \"sphinx\"\n\n# A list of ignored prefixes for module index sorting.\n# modindex_common_prefix = []\n\n\n# -- Options for HTML output ---------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\nhtml_theme = \"sphinx_rtd_theme\"\n\n# Theme options are theme-specific and customize the look and feel of a theme\n# further.  For a list of options available for each theme, see the\n# documentation.\n# html_theme_options = {}\n\n# Add any paths that contain custom themes here, relative to this directory.\n# html_theme_path = []\n\n# The name for this set of Sphinx documents.  If None, it defaults to\n# \"<project> v<release> documentation\".\n# html_title = None\n\n# A shorter title for the navigation bar.  Default is the same as html_title.\n# html_short_title = None\n\n# The name of an image file (relative to this directory) to place at the top\n# of the sidebar.\n# html_logo = None\n\n# The name of an image file (within the static path) to use as favicon of the\n# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32\n# pixels large.\n# html_favicon = None\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = [\"_static\"]\n\n# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,\n# using the given strftime format.\n# html_last_updated_fmt = '%b %d, %Y'\n\n# If true, SmartyPants will be used to convert quotes and dashes to\n# typographically correct entities.\n# html_use_smartypants = True\n\n# Custom sidebar templates, maps document names to template names.\n# html_sidebars = {}\n\n# Additional templates that should be rendered to pages, maps page names to\n# template names.\n# html_additional_pages = {}\n\n# If false, no module index is generated.\n# html_domain_indices = True\n\n# If false, no index is generated.\n# html_use_index = True\n\n# If true, the index is split into individual pages for each letter.\n# html_split_index = False\n\n# If true, links to the reST sources are added to the pages.\n# html_show_sourcelink = True\n\n# If true, \"Created using Sphinx\" is shown in the HTML footer. Default is True.\n# html_show_sphinx = True\n\n# If true, \"(C) Copyright ...\" is shown in the HTML footer. Default is True.\n# html_show_copyright = True\n\n# If true, an OpenSearch description file will be output, and all pages will\n# contain a <link> tag referring to it.  The value of this option must be the\n# base URL from which the finished HTML is served.\n# html_use_opensearch = ''\n\n# This is the file name suffix for HTML files (e.g. \".xhtml\").\n# html_file_suffix = None\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = \"django-allauthdoc\"\n\n\n# -- Options for LaTeX output --------------------------------------------------\n\nlatex_elements = {\n    # The paper size ('letterpaper' or 'a4paper').\n    \"papersize\": \"letterpaper\",\n    # The font size ('10pt', '11pt' or '12pt').\n    \"pointsize\": \"10pt\",\n    # Additional stuff for the LaTeX preamble.\n    \"preamble\": \"\",\n}\n\n# Grouping the document tree into LaTeX files. List of tuples\n# (source start file, target name, title, author, documentclass [howto/manual]).\nlatex_documents = [\n    (\n        \"index\",\n        \"django-allauth.tex\",\n        \"django-allauth Documentation\",\n        \"Raymond Penners\",\n        \"manual\",\n    ),\n]\n\n# The name of an image file (relative to this directory) to place at the top of\n# the title page.\n# latex_logo = None\n\n# For \"manual\" documents, if this is true, then toplevel headings are parts,\n# not chapters.\n# latex_use_parts = False\n\n# If true, show page references after internal links.\n# latex_show_pagerefs = False\n\n# If true, show URL addresses after external links.\n# latex_show_urls = False\n\n# Documents to append as an appendix to all manuals.\n# latex_appendices = []\n\n# If false, no module index is generated.\n# latex_domain_indices = True\n\n\n# -- Options for manual page output --------------------------------------------\n\n# One entry per manual page. List of tuples\n# (source start file, name, description, authors, manual section).\nman_pages = [\n    (\n        \"index\",\n        \"django-allauth\",\n        \"django-allauth Documentation\",\n        [\"Raymond Penners\"],\n        1,\n    )\n]\n\n# If true, show URL addresses after external links.\n# man_show_urls = False\n\n\n# -- Options for Texinfo output ------------------------------------------------\n\n# Grouping the document tree into Texinfo files. List of tuples\n# (source start file, target name, title, author,\n#  dir menu entry, description, category)\ntexinfo_documents = [\n    (\n        \"index\",\n        \"django-allauth\",\n        \"django-allauth Documentation\",\n        \"Raymond Penners\",\n        \"django-allauth\",\n        \"One line description of project.\",\n        \"Miscellaneous\",\n    ),\n]\n\n# Documents to append as an appendix to all manuals.\n# texinfo_appendices = []\n\n# If false, no module index is generated.\n# texinfo_domain_indices = True\n\n# How to display URL addresses: 'footnote', 'no', or 'inline'.\n# texinfo_show_urls = 'footnote'\n\nextensions = [\n    \"sphinx.ext.autodoc\",\n    \"sphinx_rtd_theme\",\n]\n\nsys.path.insert(0, os.path.abspath(\"../\"))\nautodoc_mock_imports = [\n    \"allauth.account.utils\",\n    \"allauth.mfa.app_settings\",\n    \"allauth.app_settings\",\n]\n\n\ndef copy_custom_files(app, exc):\n    root_dir = Path(__file__).parent.parent\n    if app.builder.format == \"html\" and not exc:\n        dst = Path(app.builder.outdir) / \"headless\" / \"openapi-specification\"\n        os.makedirs(dst, exist_ok=True)\n        for fn in [\n            root_dir / \"allauth/headless/spec/doc/openapi.yaml\",\n            root_dir / \"allauth/headless/spec/doc/description.md\",\n            root_dir / \"docs/headless/openapi-specification/index.html\",\n        ]:\n            copy_asset_file(Path(\"headless/openapi-specification\") / fn, dst)\n\n\ndef setup(app):\n    import django\n\n    app.connect(\"build-finished\", copy_custom_files)\n    os.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"docs.settings\")\n    django.setup()\n"
  },
  {
    "path": "docs/faq.rst",
    "content": "Frequently Asked Questions\n==========================\n\nOverall\n-------\n\nWhy don't you implement support for ... ?\n*****************************************\n\nThis app is just about authentication. Anything that is project\nspecific, such as making choices on what to display in a profile page,\nor, what information is stored for a user (e.g. home address, or\nfavorite color?), is beyond scope and therefore not offered.\n\nThis information is nice and all, but... I need more!\n*****************************************************\n\nHere are a few third party resources to help you get started:\n\n- https://dev.to/gajesh/the-complete-django-allauth-guide-la3\n- https://learndjango.com/tutorials/django-allauth-tutorial\n- https://www.youtube.com/watch?v=2QLAc7RJ99s\n- https://speakerdeck.com/tedtieken/signing-up-and-signing-in-users-in-django-with-django-allauth\n- https://stackoverflow.com/questions/tagged/django-allauth\n- https://github.com/aellerton/demo-allauth-bootstrap\n- https://github.com/danihodovic/django-allauth-ui\n\nI think I found a security issue... now what?\n*********************************************\n\nPlease report security issues only to security@allauth.org.\n\nYou may also want to subscribe to django-allauth-announce@googlegroups.com to\nget notified about security releases.\n\n\nTroubleshooting\n---------------\n\nThe /accounts/ URL is giving me a 404\n*************************************\n\nThere is no such URL. Try ``/accounts/login/`` instead.\n\nWhen I attempt to login I run into a 404 on /accounts/profile/\n**************************************************************\n\nWhen you end up here you have successfully logged in. However, you\nwill need to implement a view for this URL yourself, as whatever is to\nbe displayed here is project specific. You can also decide to redirect\nelsewhere:\n\nhttps://docs.djangoproject.com/en/dev/ref/settings/#login-redirect-url\n\nWhen I sign up I run into connectivity errors (connection refused et al)\n************************************************************************\n\nYou probably have not got an email (SMTP) server running on the\nmachine you are developing on. Therefore, ``allauth`` is unable to send\nverification mails.\n\nYou can work around this by adding the following line to\n``settings.py``::\n\n    EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'\n\nThis will avoid the need for an SMTP server as emails will be printed\nto the console. For more information, please refer to:\n\nhttps://docs.djangoproject.com/en/dev/ref/settings/#email-host\n\n\nDevelopment\n-----------\n\nWhy did you just close my issue?\n********************************\n\nTime is limited and I have to pick my battles. Please do not file the following\ntypes of issues:\n\n- **Support questions, installation instructions, \"How do I...?\":** please direct\n  these questions elsewhere, for example here:\n  https://stackoverflow.com/questions/tagged/django-allauth\n\n- **Documentation related complaints:** while the documentation can most certainly be\n  improved, I am adhering to the debatable principle that keeping open issues\n  around with respect to documentation is not very helpful in improving things.\n  Please step in and file a pull request if you feel there is something unclear.\n\n- **Project specific integration trouble:** In cases where ``allauth`` is just\n  one piece of the puzzle and for example a stack trace indicates another\n  module crashing, please try to come up stripped version of the issue where it\n  is clear that ``allauth`` is the one that is misbehaving.\n\n- **Social login trouble:** There are many reasons why the social login for a\n  provider is not working for you. Common causes are errors in setting up the\n  credential for the OAuth app and/or having setup invalid callback URLs. Filing\n  issues stating that things are not working for you is not very helpful. It is\n  simply not feasible to debug your specific setup. If you really do think that\n  there is an issue in ``allauth``, please do the initial debugging and analysis\n  yourself, and, provide detailed information in the issue. If the issue does\n  not point to any concrete issue in ``allauth``, it is likely to get closed.\n"
  },
  {
    "path": "docs/headless/adapter.rst",
    "content": "Adapter\n=======\n\n.. autoclass:: allauth.headless.adapter.DefaultHeadlessAdapter\n   :members:\n"
  },
  {
    "path": "docs/headless/api.rst",
    "content": "API\n===\n\nOpenAPI Specification\n*********************\n\nYou can find the documentation for the API itself in its `OpenAPI Specification\n<openapi-specification/>`_.\n\n\nExample\n*******\n\nThe source code repository contains a\n`React example application <https://codeberg.org/allauth/django-allauth/src/branch/main/examples/react-spa>`_ that\ndemonstrates how the API can be put to use in practice. The documentation for that application can be found in the `README <https://codeberg.org/allauth/django-allauth/src/branch/main/examples/react-spa/README.org>`_. Instructions on how to run it locally can be found there as well, though you can also view a copy running over at `react.demo.allauth.org <https://react.demo.allauth.org>`_.\n"
  },
  {
    "path": "docs/headless/configuration.rst",
    "content": "Configuration\n=============\n\nAvailable settings:\n\n``HEADLESS_ADAPTER`` (default: ``\"allauth.headless.adapter.DefaultHeadlessAdapter\"``)\n  Specifies the adapter class to use, allowing you to alter certain\n  default behavior.\n\n``HEADLESS_CLIENTS`` (default: ``(\"app\", \"browser\")``)\n  Specifies the supported types of clients for the API. Setting this to\n  e.g. ``(\"app\",)`` will remove all ``\"browser\"`` related endpoints.\n\n``HEADLESS_FRONTEND_URLS`` (default: ``{}``)\n  Email confirmation and password reset mails contain links that by default point to the\n  views from the ``allauth.account`` app. In case you  need to point these to your own frontend\n  application, you can do so by configuring this setting, as follows::\n\n    HEADLESS_FRONTEND_URLS = {\n        \"account_confirm_email\": \"https://app.project.org/account/verify-email/{key}\",\n        # Key placeholders are automatically populated. You are free to adjust this\n        # to your own needs, e.g.\n        #\n        # \"https://app.project.org/account/email/verify-email?token={key}\",\n        \"account_reset_password\": \"https://app.project.org/account/password/reset\",\n        \"account_reset_password_from_key\": \"https://app.project.org/account/password/reset/key/{key}\",\n        \"account_signup\": \"https://app.project.org/account/signup\",\n        # Fallback in case the state containing the `next` URL is lost and the handshake\n        # with the third-party provider fails.\n        \"socialaccount_login_error\": \"https://app.project.org/account/provider/callback\",\n    }\n\n``HEADLESS_ONLY`` (default: ``False``)\n  You can use headless-only mode in case your application fully takes care of\n  the frontend, and you do not want for e.g. the login and signup views to be\n  accessible. In this case, including ``allauth.urls`` skips those views, yet,\n  still includes e.g. the provider callback views.\n\n``HEADLESS_SERVE_SPECIFICATION`` (default: ``False``)\n  Whether or not to serve the OpenAPI specification files. When enabled, the\n  endpoints ``/_allauth/openapi.yaml``, ``/_allauth/openapi.json`` and\n  ``/_allauth/openapi.html`` become available. This functionality requires\n  the extra ``django-allauth[headless-spec]`` to be installed.\n\n``HEADLESS_SPECIFICATION_TEMPLATE_NAME`` (default: ``\"headless/spec/redoc_cdn.html\"``)\n  The template used to serve the OpenAPI specification in HTML format. Out of the box,\n  Redoc (``\"headless/spec/redoc_cdn.html\"``) and Swagger (\n  (``\"headless/spec/swagger_cdn.html\"``) are available.\n\n``HEADLESS_TOKEN_STRATEGY`` (default: ``\"allauth.headless.tokens.strategies.sessions.SessionTokenStrategy\"``)\n  If you need to change the way tokens are created and handled, you can plug in your own\n  :doc:`./tokens`.\n"
  },
  {
    "path": "docs/headless/cors.rst",
    "content": "Cross-Origin Resource Sharing (CORS)\n====================================\n\nIn case your project requires CORS handling, the following configuration can be\nused as a starting point:\n\n.. code-block:: python\n\n    MIDDLEWARE = (\n        ...\n        \"corsheaders.middleware.CorsMiddleware\",\n        ...\n    )\n\n    INSTALLED_APPS = (\n        ...\n        \"corsheaders\",\n        ...\n    )\n\n    CORS_ALLOWED_ORIGINS = [\n        \"https://app.project.org\",\n    ]\n\n    from corsheaders.defaults import default_headers\n\n    CORS_ALLOW_HEADERS = (\n        *default_headers,\n        \"x-session-token\",\n        \"x-email-verification-key\",\n        \"x-password-reset-key\",\n    )\n    CORS_ALLOW_CREDENTIALS = True\n"
  },
  {
    "path": "docs/headless/faq.rst",
    "content": "Frequently Asked Questions\n==========================\n\nMy signup requires additional inputs, is that supported?\n--------------------------------------------------------\n\nYes, though an important thing to keep in mind is that there is no one-to-one\nmapping of headed forms to headless input payloads. For example, while having to\nenter your password twice makes sense in a headed environment, it is pointless\nfrom an API point of view.  As a result, the headed forms that can be overridden\nby means of ``ACCOUNT_FORMS`` play no role in the headless environment.\n\nInstead of overriding the complete signup form via ``ACCOUNT_FORMS``, provide a\n``ACCOUNT_SIGNUP_FORM_CLASS`` as documented :doc:`here\n<../account/configuration>` , listing the additional fields you need. These\nfields will automatically show up in the headed signup form, and will\nautomatically be validated when posting payloads to the signup endpoint.\n"
  },
  {
    "path": "docs/headless/index.rst",
    "content": "Headless\n========\n\n.. toctree::\n\n   introduction\n   installation\n   configuration\n   api\n   cors\n   adapter\n   token-strategies/index\n   faq\n"
  },
  {
    "path": "docs/headless/installation.rst",
    "content": "Installation\n============\n\nIn order to use the headless functionality you need to install the\n``headless`` extra as follows::\n\n  pip install \"django-allauth[headless]\"\n\nIn your ``settings.py``, include::\n\n  INSTALLED_APPS = [\n      ...\n\n      # Required\n      'allauth',\n      'allauth.account',\n      'allauth.headless',\n\n      # Optional\n      'allauth.socialaccount',\n      'allauth.mfa',\n      'allauth.usersessions',\n\n      ...\n  ]\n\n  # These are the URLs to be implemented by your single-page application.\n  HEADLESS_FRONTEND_URLS = {\n      \"account_confirm_email\": \"https://app.project.org/account/verify-email/{key}\",\n      \"account_reset_password_from_key\": \"https://app.org/account/password/reset/key/{key}\",\n      \"account_signup\": \"https://app.org/account/signup\",\n  }\n\n\nYour project ``urls.py`` should include::\n\n    urlpatterns = [\n        # Even when using headless, the third-party provider endpoints are stil\n        # needed for handling e.g. the OAuth handshake. The account views\n        # can be disabled using `HEADLESS_ONLY = True`.\n        path(\"accounts/\", include(\"allauth.urls\")),\n\n        # Include the API endpoints:\n        path(\"_allauth/\", include(\"allauth.headless.urls\")),\n    ]\n"
  },
  {
    "path": "docs/headless/introduction.rst",
    "content": "Introduction\n============\n\nSupport for single-page and mobile applications is offered by the\n``allauth.headless`` app.  Note that you still need to have e.g. the\n``allauth.account`` app installed for this to work, yet, you can completely\ndisable its views using ``settings.HEADLESS_ONLY = True``.\n"
  },
  {
    "path": "docs/headless/openapi-specification/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" >\n    <head>\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n        <title>allauth.headless OpenAPI Specification | django-allauth</title>\n    </head>\n    <body>\n        <redoc spec-url=\"./openapi.yaml\"></redoc>\n        <script src=\"//cdn.redoc.ly/redoc/latest/bundles/redoc.standalone.js\"> </script>\n    </body>\n</html>\n"
  },
  {
    "path": "docs/headless/token-strategies/abstract-strategy.rst",
    "content": "Abstract Token Strategy\n=======================\n\nIf the token strategies that are offered out of the box do not suit your needs\nyou can create your own strategy. Your strategy should match the following\ninterface:\n\n.. autoclass:: allauth.headless.tokens.strategies.base.AbstractTokenStrategy\n   :members:\n"
  },
  {
    "path": "docs/headless/token-strategies/index.rst",
    "content": "Token Strategies\n================\n\n.. toctree::\n\n   introduction\n   session-tokens\n   jwt-tokens\n   abstract-strategy\n"
  },
  {
    "path": "docs/headless/token-strategies/introduction.rst",
    "content": "Introduction\n============\n\nThe authentication process is an inherently stateful process, as unauthenticated\nusers are guided through a number of stages in order to become fully\nauthenticated.  For example, state is needed to keep track of a user that did\nsuccessfully complete the password stage, but did not yet pass the two-factor\nauthentication stage. Similarly, in case of email verificiation using a code, we\nneed to keep track of the code and keep track of the number of failed login\nattempts.\n\nThe state of the authentication process is stored in the session. When using\nallauth headless in non-browser contexts, such as mobile apps, there is no\nsession cookie that can be used to link clients to their session. So, instead of\nrelying on cookies, the HTTP header ``X-Session-Token`` is used to keep track\nof the session.  The app is required to hand over the session token during the\nauthenticaton process.\n\nOnce a user is fully authenticated, you can hand out your own type of token by\nsetting up a specific :doc:`strategy`. Out of the box, two token strategies are\noffered: :doc:`session-tokens` and :doc:`jwt-tokens`.\n"
  },
  {
    "path": "docs/headless/token-strategies/jwt-tokens.rst",
    "content": "JWT Tokens\n==========\n\nIntroduction\n------------\n\nWhen using the JWT token strategy, an access token and refresh token pair is\nhanded out when the user becomes fully authenticated. The access token is a JWT\ntoken, and is typically short-lived. The refresh token can be used to issue a\nnew access token in case the access token is expired.\n\nThe use of JWT is mainly beneficial for a multi-service architecture, where\nauthentication can be performed in each service without having to contact a\ncentral authority.\n\nOften, the JWT token strategy is incorrectly touted as being stateless. Unless\nit is acceptable that access tokens can still be used after logging out, state\nis needed to invalidate outstanding access tokens, diminishing the stateless\naspect of the JWT token strategy.\n\n\nUsage\n-----\n\nWith the JWT token strategy enabled, the way of working is as follows:\n\n- End users are guided through the authentication process. For as long as\n  they are not fully authenticated, you communicate the ``X-Session-Token`` header\n  back to the allauth API.\n\n- In the response of the request that resulted in the user becoming fully\n  authenticated, you will find an access token and refresh token pair in the\n  ``meta`` payload.\n\n- From this moment onward, your application can drop the ``X-Session-Token``\n  completely.  The access token can be used to reach out to your own API\n  endpoints, as well as to the allauth API endpoints.\n\n\nConfiguration\n-------------\n\nAvailable settings:\n\n``HEADLESS_JWT_ALGORITHM`` (default: ``\"RS256\"``)\n  The algorithm used to sign the tokens. For asymmetric algorithms (e.g. ``\"RS256\"``),\n  the ``HEADLESS_JWT_PRIVATE_KEY`` is used as the RSA private key. For symmetric\n  algorithms (e.g. ``\"HS256\"``), ``HEADLESS_JWT_PRIVATE_KEY`` is used as the\n  secret. In case a symmetric algorithm is used and the private key is not\n  configured, ``settings.SECRET_KEY`` is used as a fallback.\n\n``HEADLESS_JWT_PRIVATE_KEY`` (default: ``\"\"``)\n  The private key (or secret) used to sign the JWT tokens. For asymmetric\n  algorithms, it can be generated using the following command::\n\n    openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048\n\n  Then, include that ``private_key.pem`` in your ``settings.py``::\n\n    HEADLESS_JWT_PRIVATE_KEY = \"\"\"\n    -----BEGIN PRIVATE KEY-----\n    MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCiStSwvoSk61uf\n    cQvkGDmR6gsM2QjVgKxCTPtg3tMhMO7kXq3PPMEiWlF49JicjPWs5vkYcLAsWNVE\n    ...\n    rfnteLIERvzd4rLi9WjTahfKA2Mq3YNIe3Hw8IDrrczJgd/XkEaENGYXmmNCX22B\n    gtUcukumVPtrDhGK9i/PG3Q=\n    -----END PRIVATE KEY-----\n    \"\"\"\n\n``HEADLESS_JWT_ACCESS_TOKEN_EXPIRES_IN`` (default: ``300``)\n  The lifetime (in seconds) of the access tokens.\n\n``HEADLESS_JWT_REFRESH_TOKEN_EXPIRES_IN`` (default: ``86400``)\n  The lifetime (in seconds) of the refresh tokens.\n\n``HEADLESS_JWT_AUTHORIZATION_HEADER_SCHEME`` (default: ``\"Bearer\"``)\n  Specifies the HTTP Authorization header scheme for access tokens, e.g.: ``Authorization: Bearer <access-token>``.\n\n``HEADLESS_JWT_STATEFUL_VALIDATION_ENABLED`` (default: ``False``)\n  When enabled, it is validated that the access token still belongs to an\n  active session. As a result, logging out will immediately invalidate the\n  access token.\n\n``HEADLESS_JWT_ROTATE_REFRESH_TOKEN`` (default: ``True``)\n  When enabled, refreshing the access token results in a new refresh token\n  as well. The original refresh token is invalidated.\n\n\nCustomization\n-------------\n\nYou can customize the behavior of the JWT token strategy by creating a custom\nclass deriving from ``JWTTokenStrategy``, and pointing\n``settings.HEADLESS_TOKEN_STRATEGY`` to that class.\n\n.. autoclass:: allauth.headless.tokens.strategies.jwt.JWTTokenStrategy\n   :members: get_claims\n\n\nSecuring Your API Endpoints\n---------------------------\n\nDjango Ninja\n~~~~~~~~~~~~\n\nFor Django Ninja, the following security class is available:\n\n.. autoclass:: allauth.headless.contrib.ninja.security.JWTTokenAuth\n   :members:\n\nAn example on how to use that security class in your own code is listed below:\n\n.. code-block:: python\n\n    from allauth.headless.contrib.ninja.security import jwt_token_auth\n    from ninja import NinjaAPI\n\n    api = NinjaAPI()\n\n    @api.get(\"/your/own/api\", auth=[jwt_token_auth])\n    def your_own_api(request):\n        ...\n\n\n\nDjango REST framework\n~~~~~~~~~~~~~~~~~~~~~\n\nFor Django REST framework, the following authentication class is available:\n\n.. autoclass:: allauth.headless.contrib.rest_framework.authentication.JWTTokenAuthentication\n   :members:\n\nAn example on how to use that authentication class in your own code is listed below:\n\n.. code-block:: python\n\n    from allauth.headless.contrib.rest_framework.authentication import (\n        JWTTokenAuthentication,\n    )\n    from rest_framework import permissions\n    from rest_framework.views import APIView\n\n    class YourOwnAPIView(APIView):\n\n        authentication_classes = [\n            JWTTokenAuthentication,\n        ]\n        permission_classes = [permissions.IsAuthenticated]\n\n        def get(self, request):\n            ...\n"
  },
  {
    "path": "docs/headless/token-strategies/session-tokens.rst",
    "content": "Session Tokens\n==============\n\nIntroduction\n------------\n\nWhen using allauth headless in non-browser contexts, such as mobile apps, a\nsession token is used to keep track of the authentication state. This session\ntoken is handed over by the app by providing the ``X-Session-Token`` request\nheader.\n\nIf you do not have any requirements that prescribe a specific token strategy,\nthe simplest way forward is to use the ``X-Session-Token`` authentication\nmechanism for your own APIs as well.  In order to do so, integration with Django\nNinja and Django REST framework is offered out of the box.\n\n\nSecuring Your API Endpoints\n---------------------------\n\nDjango Ninja\n~~~~~~~~~~~~\n\nFor Django Ninja, the following security class is available:\n\n.. autoclass:: allauth.headless.contrib.ninja.security.XSessionTokenAuth\n   :members:\n\nAn example on how to use that security class in your own code is listed below:\n\n.. code-block:: python\n\n    from allauth.headless.contrib.ninja.security import x_session_token_auth\n    from ninja import NinjaAPI\n\n    api = NinjaAPI()\n\n    @api.get(\"/your/own/api\", auth=[x_session_token_auth])\n    def your_own_api(request):\n        ...\n\n\nDjango REST framework\n~~~~~~~~~~~~~~~~~~~~~\n\nFor Django REST framework, the following authentication class is available:\n\n.. autoclass:: allauth.headless.contrib.rest_framework.authentication.XSessionTokenAuthentication\n   :members:\n\nAn example on how to use that authentication class in your own code is listed below:\n\n.. code-block:: python\n\n    from allauth.headless.contrib.rest_framework.authentication import (\n        XSessionTokenAuthentication,\n    )\n    from rest_framework import permissions\n    from rest_framework.views import APIView\n\n    class YourOwnAPIView(APIView):\n\n        authentication_classes = [\n            XSessionTokenAuthentication,\n        ]\n        permission_classes = [permissions.IsAuthenticated]\n\n        def get(self, request):\n            ...\n"
  },
  {
    "path": "docs/idp/index.rst",
    "content": "Identity Provider\n=================\n\nYou can easily enable identity provider functionality in your own projects by\nmeans of ``allauth.idp``. While this module is structured to allow for multiple\nprotocols, currently, there is only one protocol supported: OpenID Connect.\n\n.. toctree::\n   :maxdepth: 1\n\n   openid-connect/index\n"
  },
  {
    "path": "docs/idp/openid-connect/adapter.rst",
    "content": "Adapter\n=======\n\n.. autoclass:: allauth.idp.oidc.adapter.DefaultOIDCAdapter\n   :members:\n"
  },
  {
    "path": "docs/idp/openid-connect/clients.rst",
    "content": "Clients\n=======\n\nThe Open ID Connect clients (also commonly referred to as consumers, or applications) can be managed via the Django admin. A typical client configuration has the following properties:\n\nName\n    The name of the client. This is displayed in the authorization page.\n\nID\n    The client ID. This field is automatically populated.\n\nSecret\n    The client secret. When adding clients using the Django admin, the secret is\n    automatically generated and displayed only once via a message at creation\n    time.\n\nScopes\n    The scope(s) the client is allowed to request. Values are provide line by line, e.g.::\n\n      openid\n      profile\n      email\n\nDefault scopes\n    In case the client does not specify any scope, this are the default scope\n    that will be used. Values are provide line by line.\n\nGrant types\n    A list of allowed grant types. Provide one value per line, e.g.::\n\n      authorization_code\n      client_credentials\n      refresh_token\n\nCORS origins\n    A list of allowed origins for cross-origin requests, one per line.\n\nRedirect URIs\n    A list of allowed redirect (callback) URLs, one per line.\n\nAllow URI wildcards\n    When enabled, allows the use of wildcards (*) in redirect URIs and CORS origins.\n    This is particularly useful for supporting deploy previews from services like\n    Cloudflare Pages or Netlify, where preview URLs may contain dynamic subdomains\n    (e.g., ``https://*.project.pages.dev``). When wildcards are enabled:\n\n    - URIs can contain a single asterisk (*)\n    - Only the hostname portion of the URI is allowed to contain a wildcard\n\nResponse types\n    A list of allowed response types. Provide one value per line, e.g.::\n\n      code\n\nSkip consent\n    When enabled, the consent page is silently skipped and all requested scopes are granted.\n\nType\n    Confidential clients are clients that are able to securely authenticate with\n    the authorization server as they are able to keep their registered client\n    secret safe. Public clients, such as applications running in a browser or\n    mobile device, are unable to keep the client secrets safe.\n"
  },
  {
    "path": "docs/idp/openid-connect/configuration.rst",
    "content": "Configuration\n=============\n\nAvailable settings:\n\n``IDP_OIDC_ACCESS_TOKEN_EXPIRES_IN`` (default: 3600)\n  The time (in seconds) after which access tokens expire.\n\n``IDP_OIDC_ACCESS_TOKEN_FORMAT`` (default: ``\"opaque\"``)\n  The format of issued access tokens. This can be ``\"opaque\"`` for randomized\n  strings, or, ``\"jwt\"`` for JWT based access tokens.\n\n``IDP_OIDC_ADAPTER`` (default: ``\"allauth.idp.oidc.adapter.DefaultOIDCAdapter\"``)\n  Specifies the adapter class to use, allowing you to alter certain\n  default behavior.\n\n``IDP_OIDC_AUTHORIZATION_CODE_EXPIRES_IN`` (default: 60)\n  The time (in seconds) after which authorization codes expire.\n\n``IDP_OIDC_DEVICE_CODE_EXPIRES_IN`` (default: 300)\n  The time (in seconds) after which device codes expire.\n\n``IDP_OIDC_DEVICE_CODE_INTERVAL`` (default: 5)\n  The time (in seconds) a client should wait between polling attempts when using\n  the device authorization flow.\n\n``IDP_OIDC_ID_TOKEN_EXPIRES_IN`` (default: 300)\n  The time (in seconds) after which ID tokens expire.\n\n``IDP_OIDC_USER_CODE_FORMAT`` (default: ``settings.ALLAUTH_USER_CODE_FORMAT``)\n  Controls the format of the user code.\n\n``IDP_OIDC_PRIVATE_KEY`` (default: ``\"\"``)\n  The private key used for creating ID tokens (and ``.well-known/jwks.json``).\n\n``IDP_OIDC_RATE_LIMITS`` (default: ``{\"device_user_code\": \"5/m/ip\"}``)\n  Rate limit configuration.\n\n``IDP_OIDC_ROTATE_REFRESH_TOKEN`` (default: ``True``)\n  When access tokens are refreshed the old refresh token can be kept\n  (``False``) or replaced (``True``) with a new one (rotated).\n\n``IDP_OIDC_RP_INITIATED_LOGOUT_ASKS_FOR_OP_LOGOUT`` (default: ``True``)\n  During the RP initiated logout, the OIDC specification recommends that the end\n  user is asked whether or not to logout of the OP as well. When this setting is\n  ``True``, the end user is always asked. When ``False``, the user is only asked\n  if needed according to the specification.\n\n``IDP_OIDC_USERINFO_ENDPOINT`` (default: ``None``)\n  This setting can be used to point the ``userinfo_endpoint`` value as returned\n  in the \".well-known/openid-configuration\" to a custom URL.  Setting this\n  disables the built-in userinfo endpoint.\n"
  },
  {
    "path": "docs/idp/openid-connect/index.rst",
    "content": "OpenID Connect\n==============\n\n.. toctree::\n   :maxdepth: 1\n\n   introduction\n   installation\n   configuration\n   views\n   clients\n   adapter\n   integrations\n"
  },
  {
    "path": "docs/idp/openid-connect/installation.rst",
    "content": "Installation\n============\n\nIn order to use this functionality you need to install the\n``idp-oidc`` extra as follows::\n\n  pip install \"django-allauth[idp-oidc]\"\n\nAs the provider functionality is dependent on the regular allauth account\nhandling, you will need to follow the installation instructions related to\n``allauth.account`` first. On top of that, you will need to add the following to\nyour project setup.\n\nIn your ``settings.py``, include the OpenID Connect provider app::\n\n    INSTALLED_APPS = [\n        ...\n        \"allauth.idp.oidc\",\n        ...\n    ]\n\nNext, create a private key using the following command::\n\n    openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048\n\nThen, include that ``private_key.pem`` in your ``settings.py``::\n\n    IDP_OIDC_PRIVATE_KEY = \"\"\"\n    -----BEGIN PRIVATE KEY-----\n    MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCiStSwvoSk61uf\n    cQvkGDmR6gsM2QjVgKxCTPtg3tMhMO7kXq3PPMEiWlF49JicjPWs5vkYcLAsWNVE\n    ...\n    rfnteLIERvzd4rLi9WjTahfKA2Mq3YNIe3Hw8IDrrczJgd/XkEaENGYXmmNCX22B\n    gtUcukumVPtrDhGK9i/PG3Q=\n    -----END PRIVATE KEY-----\n    \"\"\"\n\nYour project ``urls.py`` should include::\n\n    urlpatterns = [\n        ...\n        path(\"\", include(\"allauth.idp.urls\")),\n        ...\n    ]\n"
  },
  {
    "path": "docs/idp/openid-connect/integrations.rst",
    "content": "Integrations\n============\n\nIn order to simplify implementing your own OIDC based API endpoints, allauth\noffers out of the box support for authenticating and authorizing requests with\nDjango Ninja as well as Django REST framework.\n\n\nDjango Ninja\n------------\n\nFor Django Ninja, the following security class is available:\n\n.. autoclass:: allauth.idp.oidc.contrib.ninja.security.TokenAuth\n   :special-members: __init__\n   :members:\n\nAn example on how to use that security class in your own code is listed below:\n\n.. code-block:: python\n\n    from allauth.idp.oidc.contrib.ninja.security import TokenAuth\n    from ninja import NinjaAPI\n\n    api = NinjaAPI()\n\n    @api.get(\"/api/resource\", auth=[TokenAuth(scope=[\"view-resource\"])])\n    def resource(request):\n        ...\n\n\n\n\nDjango REST framework\n---------------------\n\nFor Django REST framework, the following authentication class is available:\n\n.. autoclass:: allauth.idp.oidc.contrib.rest_framework.authentication.TokenAuthentication\n\n.. autoclass:: allauth.idp.oidc.contrib.rest_framework.permissions.TokenPermission\n   :members: has_scope\n\nAn example on how to use that authentication class in your own code is listed below:\n\n.. code-block:: python\n\n    from rest_framework.views import APIView\n\n    from allauth.idp.oidc.contrib.rest_framework.authentication import TokenAuthentication\n    from allauth.idp.oidc.contrib.rest_framework.permissions import TokenPermission\n\n\n    class ResourceView(APIView):\n        authentication_classes = [TokenAuthentication]\n        permission_classes = [TokenPermission.has_scope([\"view-resource\"])]\n\n        def get(request, *args, **kwargs):\n            ...\n"
  },
  {
    "path": "docs/idp/openid-connect/introduction.rst",
    "content": "Introduction\n============\n\nThe ``allauth.idp`` package offers an out of the box OpenID Connect provider by\nmeans of the ``allauth.idp.oidc`` Django application. The\nprovider functionality is dependent on the base ``allauth.account`` handling,\nand works seamlessly with any of the other allauth packages.\n\nThe following OpenID Connect functionality is supported:\n\n- Authorization code grant.\n\n- Client credentials grant.\n\n- Implicit grant.\n\n- Device authorization grant\n\nFunctionality intentionally not supported:\n\n- Password grant: This is a legacy flow, no longer recommended. For example, it lacks support for MFA.\n"
  },
  {
    "path": "docs/idp/openid-connect/views.rst",
    "content": "URLs & Views\n============\n\nYour project ``urls.py`` should include:\n\n.. code-block:: python\n\n    urlpatterns = [\n        ...\n        path(\"\", include(\"allauth.idp.urls\")),\n        ...\n    ]\n\nThe above will enable the following views:\n\n``/.well-known/openid-configuration``\n  Provides the OpenID Provider Configuration Information. This endpoint returns\n  a JSON document that includes metadata about the OIDC provider, such as\n  supported authentication methods, token endpoints, and available scopes.\n\n``/.well-known/jwks.json``\n  Serves the JSON Web Key Set (JWKS) used to verify the signatures of JWTs\n  issued by the OIDC provider. Clients use this to validate ID tokens and access\n  tokens.\n\n``/identity/o/authorize``\n  The authorization endpoint used to initiate the OAuth2/OIDC flow. It handles\n  authentication requests and issues authorization codes or tokens based on the\n  request parameters.\n\n``/identity/o/api/revoke``\n  Allows clients to revoke access or refresh tokens. This endpoint helps\n  maintain security by invalidating credentials that are no longer needed or\n  have been compromised.\n\n``/identity/o/api/userinfo``\n  Returns user profile information in a JSON format. This endpoint is typically\n  used after a successful authentication to fetch claims about the authenticated\n  user.\n\n``/identity/o/api/token``\n  Handles the exchange of authorization codes for tokens, or client credentials\n  for access tokens. This is a key component of the token flow in OAuth2/OIDC.\n"
  },
  {
    "path": "docs/index.rst",
    "content": ".. django-allauth documentation master file, created by\n   sphinx-quickstart on Wed Jun  6 22:58:42 2012.\n\n.. include:: ../README.rst\n    :end-before: .. end-welcome\n\nContents\n********\n\n.. toctree::\n   :maxdepth: 2\n\n   introduction/index\n   installation/index\n   account/index\n   Third-Party Accounts <socialaccount/index>\n   mfa/index\n   usersessions/index\n   headless/index\n   idp/index\n   common/index\n   project/index\n   faq\n   release-notes/index\n\n\nIndices and tables\n******************\n\n* :ref:`genindex`\n* :ref:`search`\n"
  },
  {
    "path": "docs/installation/examples.rst",
    "content": "Example Projects\n================\n\nThe source code repository contains fully functional example projects to help you get started.\n\nRegular Django Project\n----------------------\n\nThe `Regular Django project\n<https://codeberg.org/allauth/django-allauth/src/branch/main/examples/regular-django>`_\nis a Bootstrap styled example project, which provides an example of how allauth\ncan be styled without altering any of the builtin templates.  Please take a look\nat the `templates of the example project\n<https://codeberg.org/allauth/django-allauth/src/branch/main/examples/regular-django/example/templates>`__.\nYou can see this project running live over at `django.demo.allauth.org\n<https://django.demo.allauth.org>`__.\n\n\nReact Single-Page Application\n-----------------------------\n\nThe `React example application\n<https://codeberg.org/allauth/django-allauth/src/branch/main/examples/react-spa>`_\ndemonstrates how the allauth headless API can be put to use in practice. The\ndocumentation can be found in the `README\n<https://codeberg.org/allauth/django-allauth/src/branch/main/examples/react-spa/README.org>`_. Instructions\non how to run it locally can be found there as well, though you can also view a\ncopy running over at `react.demo.allauth.org <https://react.demo.allauth.org>`_.\n"
  },
  {
    "path": "docs/installation/index.rst",
    "content": "============\nInstallation\n============\n\n.. toctree::\n   :maxdepth: 2\n\n   requirements\n   quickstart\n   examples\n"
  },
  {
    "path": "docs/installation/quickstart.rst",
    "content": "Quickstart\n==========\n\nFirst, install the python package. If you do not need any of the social account\nrelated functionality, install using::\n\n    pip install django-allauth\n\nOtherwise, install using::\n\n    pip install \"django-allauth[socialaccount]\"\n\nThen, assuming you have a Django project up and running, add the following to\nthe ``settings.py`` of your project::\n\n    # Specify the context processors as follows:\n    TEMPLATES = [\n        {\n            'BACKEND': 'django.template.backends.django.DjangoTemplates',\n            'DIRS': [],\n            'APP_DIRS': True,\n            'OPTIONS': {\n                'context_processors': [\n                    # Already defined Django-related contexts here\n\n                    # `allauth` needs this from django\n                    'django.template.context_processors.request',\n                ],\n            },\n        },\n    ]\n\n    AUTHENTICATION_BACKENDS = [\n        ...\n        # Needed to login by username in Django admin, regardless of `allauth`\n        'django.contrib.auth.backends.ModelBackend',\n\n        # `allauth` specific authentication methods, such as login by email\n        'allauth.account.auth_backends.AuthenticationBackend',\n        ...\n    ]\n\n    INSTALLED_APPS = [\n        ...\n        # The following apps are required:\n        'django.contrib.auth',\n        'django.contrib.messages',\n\n        'allauth',\n        'allauth.account',\n\n        # Optional -- requires install using `django-allauth[socialaccount]`.\n        'allauth.socialaccount',\n        # ... include the providers you want to enable:\n        'allauth.socialaccount.providers.agave',\n        'allauth.socialaccount.providers.amazon',\n        'allauth.socialaccount.providers.amazon_cognito',\n        'allauth.socialaccount.providers.angellist',\n        'allauth.socialaccount.providers.apple',\n        'allauth.socialaccount.providers.asana',\n        'allauth.socialaccount.providers.auth0',\n        'allauth.socialaccount.providers.authentiq',\n        'allauth.socialaccount.providers.baidu',\n        'allauth.socialaccount.providers.basecamp',\n        'allauth.socialaccount.providers.battlenet',\n        'allauth.socialaccount.providers.bitbucket_oauth2',\n        'allauth.socialaccount.providers.bitly',\n        'allauth.socialaccount.providers.box',\n        'allauth.socialaccount.providers.cilogon',\n        'allauth.socialaccount.providers.clever',\n        'allauth.socialaccount.providers.coinbase',\n        'allauth.socialaccount.providers.dataporten',\n        'allauth.socialaccount.providers.daum',\n        'allauth.socialaccount.providers.digitalocean',\n        'allauth.socialaccount.providers.dingtalk',\n        'allauth.socialaccount.providers.discogs',\n        'allauth.socialaccount.providers.discord',\n        'allauth.socialaccount.providers.disqus',\n        'allauth.socialaccount.providers.douban',\n        'allauth.socialaccount.providers.doximity',\n        'allauth.socialaccount.providers.draugiem',\n        'allauth.socialaccount.providers.drip',\n        'allauth.socialaccount.providers.dropbox',\n        'allauth.socialaccount.providers.dwolla',\n        'allauth.socialaccount.providers.edmodo',\n        'allauth.socialaccount.providers.edx',\n        'allauth.socialaccount.providers.eventbrite',\n        'allauth.socialaccount.providers.eveonline',\n        'allauth.socialaccount.providers.evernote',\n        'allauth.socialaccount.providers.exist',\n        'allauth.socialaccount.providers.facebook',\n        'allauth.socialaccount.providers.feedly',\n        'allauth.socialaccount.providers.figma',\n        'allauth.socialaccount.providers.fivehundredpx',\n        'allauth.socialaccount.providers.flickr',\n        'allauth.socialaccount.providers.foursquare',\n        'allauth.socialaccount.providers.frontier',\n        'allauth.socialaccount.providers.fxa',\n        'allauth.socialaccount.providers.gitea',\n        'allauth.socialaccount.providers.github',\n        'allauth.socialaccount.providers.gitlab',\n        'allauth.socialaccount.providers.globus',\n        'allauth.socialaccount.providers.google',\n        'allauth.socialaccount.providers.gumroad',\n        'allauth.socialaccount.providers.hubic',\n        'allauth.socialaccount.providers.instagram',\n        'allauth.socialaccount.providers.jupyterhub',\n        'allauth.socialaccount.providers.kakao',\n        'allauth.socialaccount.providers.lemonldap',\n        \"allauth.socialaccount.providers.lichess\",\n        'allauth.socialaccount.providers.line',\n        'allauth.socialaccount.providers.linkedin',\n        'allauth.socialaccount.providers.linkedin_oauth2',\n        'allauth.socialaccount.providers.mailchimp',\n        'allauth.socialaccount.providers.mailcow',\n        'allauth.socialaccount.providers.mailru',\n        'allauth.socialaccount.providers.mediawiki',\n        'allauth.socialaccount.providers.meetup',\n        'allauth.socialaccount.providers.miro',\n        'allauth.socialaccount.providers.microsoft',\n        'allauth.socialaccount.providers.naver',\n        'allauth.socialaccount.providers.nextcloud',\n        'allauth.socialaccount.providers.notion',\n        'allauth.socialaccount.providers.odnoklassniki',\n        'allauth.socialaccount.providers.openid',\n        'allauth.socialaccount.providers.openid_connect',\n        'allauth.socialaccount.providers.openstreetmap',\n        'allauth.socialaccount.providers.orcid',\n        'allauth.socialaccount.providers.patreon',\n        'allauth.socialaccount.providers.paypal',\n        'allauth.socialaccount.providers.persona',\n        'allauth.socialaccount.providers.pinterest',\n        'allauth.socialaccount.providers.pocket',\n        \"allauth.socialaccount.providers.questrade\",\n        'allauth.socialaccount.providers.quickbooks',\n        'allauth.socialaccount.providers.reddit',\n        'allauth.socialaccount.providers.robinhood',\n        'allauth.socialaccount.providers.salesforce',\n        'allauth.socialaccount.providers.sharefile',\n        'allauth.socialaccount.providers.shopify',\n        'allauth.socialaccount.providers.slack',\n        'allauth.socialaccount.providers.snapchat',\n        'allauth.socialaccount.providers.soundcloud',\n        'allauth.socialaccount.providers.spotify',\n        'allauth.socialaccount.providers.stackexchange',\n        'allauth.socialaccount.providers.steam',\n        'allauth.socialaccount.providers.stocktwits',\n        'allauth.socialaccount.providers.strava',\n        'allauth.socialaccount.providers.stripe',\n        'allauth.socialaccount.providers.telegram',\n        'allauth.socialaccount.providers.trainingpeaks',\n        'allauth.socialaccount.providers.trello',\n        'allauth.socialaccount.providers.tumblr',\n        'allauth.socialaccount.providers.tumblr_oauth2',\n        'allauth.socialaccount.providers.twentythreeandme',\n        'allauth.socialaccount.providers.twitch',\n        'allauth.socialaccount.providers.twitter',\n        'allauth.socialaccount.providers.twitter_oauth2',\n        'allauth.socialaccount.providers.untappd',\n        'allauth.socialaccount.providers.vimeo',\n        'allauth.socialaccount.providers.vimeo_oauth2',\n        'allauth.socialaccount.providers.vk',\n        'allauth.socialaccount.providers.wahoo',\n        'allauth.socialaccount.providers.weibo',\n        'allauth.socialaccount.providers.weixin',\n        'allauth.socialaccount.providers.windowslive',\n        'allauth.socialaccount.providers.xing',\n        'allauth.socialaccount.providers.yahoo',\n        'allauth.socialaccount.providers.yandex',\n        'allauth.socialaccount.providers.ynab',\n        'allauth.socialaccount.providers.zoho',\n        'allauth.socialaccount.providers.zoom',\n        'allauth.socialaccount.providers.okta',\n        'allauth.socialaccount.providers.feishu',\n        \"allauth.socialaccount.providers.atlassian\",\n        ...\n    ]\n\n    MIDDLEWARE = (\n        \"django.contrib.sessions.middleware.SessionMiddleware\",\n        \"django.middleware.common.CommonMiddleware\",\n        \"django.middleware.csrf.CsrfViewMiddleware\",\n        \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n        \"django.contrib.messages.middleware.MessageMiddleware\",\n\n        # Add the account middleware:\n        \"allauth.account.middleware.AccountMiddleware\",\n    )\n\n    # Provider specific settings\n    SOCIALACCOUNT_PROVIDERS = {\n        'google': {\n            # For each OAuth based provider, either add a ``SocialApp``\n            # (``socialaccount`` app) containing the required client\n            # credentials, or list them here:\n            'APP': {\n                'client_id': '123',\n                'secret': '456',\n                'key': ''\n            }\n        }\n    }\n\nAdditionally, add this to your project ``urls.py``::\n\n    urlpatterns = [\n        ...\n        path('accounts/', include('allauth.urls')),\n        ...\n    ]\n\nNote that you do not necessarily need the URLs provided by\n``django.contrib.auth.urls``. Instead of the URLs ``login``, ``logout``, and\n``password_change`` (among others), you can use the URLs provided by\n``allauth``: ``account_login``, ``account_logout``, ``account_set_password``...\n\n**Important**: This project is not designed to work with ``SESSION_ENGINE`` set\nto ``\"django.contrib.sessions.backends.signed_cookies\"``.  With signed cookies,\nthe session data is signed but not encrypted, whereas allauth stores secrets\n(e.g. verification codes) in the session.\n\n\nPost-Installation\n-----------------\n\nIn your Django root execute the command below to create your database tables::\n\n    python manage.py migrate\n\nNow start your server, visit your admin pages (e.g. http://localhost:8000/admin/)\nand follow these steps:\n\n- For each OAuth based provider, either add a ``SocialApp`` (``socialaccount``\n  app) containing the required client credentials, or, make sure that these are\n  configured via the ``SOCIALACCOUNT_PROVIDERS[<provider>]['APP']`` setting (see example above).\n"
  },
  {
    "path": "docs/installation/requirements.rst",
    "content": "Requirements\n------------\n\nThis package has the following external dependencies:\n\n- Python 3.10, 3.11, 3.12, 3.13 or 3.14.\n\n- Django (4.2+)\n\n- Depending on which social providers you use:\n\n  - requests and requests-oauthlib\n\n  - python-openid or python3-openid (depending on your Python version)\n\n  - pyjwt\n\n  - python3-saml\n"
  },
  {
    "path": "docs/introduction/index.rst",
    "content": "Introduction\n============\n\nRationale\n---------\n\n.. include:: ../../README.rst\n    :start-after: .. begin-rationale\n    :end-before: .. end-rationale\n\nFeatures\n--------\n\n.. include:: ../../README.rst\n    :start-after: .. begin-features\n    :end-before: .. end-features\n\n\nDesign\n------\n\nThis package is internally subdivided into individual Django apps that each\ntarget a specific functional part:\n\n- Functionality related to regular (username and/or email based) accounts is implemented in the ``allauth.account`` app.\n\n- Functionality related to social accounts is implemented in the ``allauth.socialaccount`` app.\n\n- Functionality related to multi-factor authentication is implemented in the ``allauth.mfa`` app.\n\nThe documentation is structured according to the subdivision above, where each\nfunctional part is covered by its own chapter.\n"
  },
  {
    "path": "docs/mfa/adapter.rst",
    "content": "Adapter\n=======\n\n.. autoclass:: allauth.mfa.adapter.DefaultMFAAdapter\n   :members:\n"
  },
  {
    "path": "docs/mfa/configuration.rst",
    "content": "Configuration\n=============\n\nAvailable settings:\n\n``MFA_ADAPTER`` (default: ``\"allauth.mfa.adapter.DefaultMFAAdapter\"``)\n  Specifies the adapter class to use, allowing you to alter certain\n  default behavior.\n\n``MFA_ALLOW_UNVERIFIED_EMAIL`` (default: ``False``)\n  By default, an account that has an unverified email address is not allowed to\n  turn on MFA. Additionally, accounts that have MFA turned on cannot add a new\n  (unverified) email address. The rationale is that if this were allowed, it\n  would allow an attacker to signup without verifying and then turn on MFA to\n  prevent the real owner of the account from ever gaining access.  If the risk\n  of this scenario is manageable for your project, you can allow unverified email\n  address in combination with MFA by changing this setting.\n\n``MFA_FORMS``\n  Used to override forms. Defaults to::\n\n    MFA_FORMS = {\n        'authenticate': 'allauth.mfa.base.forms.AuthenticateForm',\n        'reauthenticate': 'allauth.mfa.base.forms.AuthenticateForm',\n        'activate_totp': 'allauth.mfa.totp.forms.ActivateTOTPForm',\n        'deactivate_totp': 'allauth.mfa.totp.forms.DeactivateTOTPForm',\n        'generate_recovery_codes': 'allauth.mfa.recovery_codes.forms.GenerateRecoveryCodesForm',\n    }\n\n``MFA_PASSKEY_LOGIN_ENABLED`` (default: ``False``)\n  Whether or not end users can login using a (WebAuthn) passkey. Note that for\n  this to be enabled, you also need to add ``\"webauthn\"`` to\n  ``MFA_SUPPORTED_TYPES``.\n\n``MFA_PASSKEY_SIGNUP_ENABLED`` (default: ``False``)\n  Whether or not end users can signup using a (WebAuthn) passkey. Note that for\n  this to be enabled, you need to add ``\"webauthn\"`` to ``MFA_SUPPORTED_TYPES``,\n  require mandatory email verification and have\n  ``ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED`` set to ``True``.\n\n``MFA_RECOVERY_CODE_COUNT`` (default: ``10``)\n  The number of recovery codes.\n\n``MFA_RECOVERY_CODE_DIGITS`` (default: ``8``)\n  The number of digits of each recovery code.\n\n``MFA_SUPPORTED_TYPES`` (default: ``[[\"recovery_codes\", \"totp\"]``)\n  The authenticator types that end users are able to setup. Allowed\n  types are: ``\"recovery_codes\"``, ``\"totp\"``, and ``\"webauthn\"``. The\n  latter is disabled by default.\n\n``MFA_TOTP_PERIOD`` (default: ``30``)\n  The period that a TOTP code will be valid for, in seconds.\n\n``MFA_TOTP_TOLERANCE`` (default: ``0``)\n  The number of time steps in the past or future to allow. Lower values are more secure, but more likely to fail due to clock drift.\n\n``MFA_TOTP_DIGITS`` (default: ``6``)\n  The number of digits for TOTP codes.\n\n``MFA_TOTP_ISSUER`` (default: ``\"\"``)\n  The issuer (appearing in the TOTP QR code).\n\n``MFA_WEBAUTHN_ALLOW_INSECURE_ORIGIN`` (default: ``False``)\n  The WebAuthn uses the ``fido2`` package, and versions up to including version\n  1.1.3 do not regard localhost as a secure origin, which is problematic during\n  local development and testing. To work around that, you can use this setting.\n  Only use this for development, never on production. See commit ``8b979313``\n  over at ``fido2``.\n\n``MFA_TRUST_ENABLED`` (default: ``False``)\n  Enables the \"Trust this browser?\" functionality, which presents users with MFA\n  enabled the choice to trust their browser allowing them to skip authenticating\n  per MFA on each login. This is implemented by handing out a special trust\n  cookie.\n\n``MFA_TRUST_COOKIE_AGE`` (default: ``timedelta(days=14)``)\n  Specifies the period (in seconds, or ``timedelta``) during which MFA is\n  skipped.\n\n``MFA_TRUST_COOKIE_NAME`` (default: ``\"mfa_trusted\"``)\n  The name of the trust cookie.\n\n``MFA_TRUST_COOKIE_DOMAIN`` (default: ``settings.SESSION_COOKIE_DOMAIN``)\n  The domain of the trust cookie.\n\n``MFA_TRUST_COOKIE_HTTPONLY`` (default: ``settings.SESSION_COOKIE_HTTPONLY``)\n  Whether or not the trust cookie is HTTP only.\n\n``MFA_TRUST_COOKIE_PATH`` (default: ``settings.SESSION_COOKIE_PATH``)\n  The path set on the trust cookie.\n\n``MFA_TRUST_COOKIE_SAMESITE`` (default: ``settings.SESSION_COOKIE_SAMESITE``)\n  The value of the SameSite flag on the trust cookie.\n\n``MFA_TRUST_COOKIE_SECURE`` (default: ``settings.SESSION_COOKIE_SECURE``)\n  Whether to use a secure cookie for the trust cookie.\n"
  },
  {
    "path": "docs/mfa/django-allauth-2fa.rst",
    "content": "Upgrading from django-allauth-2fa\n=================================\n\nIn case you are currently using django-allauth-2fa and want to switch to the\nbuilt-in implementation, you will need to migrate the existing TOTP keys and recovery codes. For that purpose, the following reference code is available::\n\n    import base64\n\n    from allauth.mfa.adapter import get_adapter\n    from allauth.mfa.models import Authenticator\n    from django.core.management.base import BaseCommand\n    from django_otp.plugins.otp_static.models import StaticDevice\n    from django_otp.plugins.otp_totp.models import TOTPDevice\n\n\n    class Command(BaseCommand):\n        def handle(self, **options):\n            adapter = get_adapter()\n            authenticators = []\n            for totp in TOTPDevice.objects.filter(confirmed=True).iterator():\n                recovery_codes = set()\n                for sdevice in StaticDevice.objects.filter(confirmed=True, user_id=totp.user_id).iterator():\n                    recovery_codes.update(sdevice.token_set.values_list(\"token\", flat=True))\n                secret = base64.b32encode(bytes.fromhex(totp.key)).decode(\"ascii\")\n                totp_authenticator = Authenticator(\n                    user_id=totp.user_id,\n                    type=Authenticator.Type.TOTP,\n                    data={\"secret\": adapter.encrypt(secret)},\n                )\n                authenticators.append(totp_authenticator)\n                authenticators.append(\n                    Authenticator(\n                        user_id=totp.user_id,\n                        type=Authenticator.Type.RECOVERY_CODES,\n                        data={\n                            \"migrated_codes\": [adapter.encrypt(c) for c in recovery_codes],\n                        },\n                    )\n                )\n            Authenticator.objects.bulk_create(authenticators)\n"
  },
  {
    "path": "docs/mfa/forms.rst",
    "content": "Forms\n=====\n\n(Re)authenticate\n****************\n\n*Path*\n  ``allauth.mfa.base.forms.AuthenticateForm``\n  ``allauth.mfa.base.forms.ReauthenticateForm``\n  ``allauth.mfa.webauthn.forms.AuthenticateWebAuthnForm``\n\n*Used on*:\n  AuthenticateView and ReauthenticateView, used when a user authenticates with MFA.\n\nExample override::\n\n    from allauth.mfa.base.forms import AuthenticateForm, ReauthenticateForm\n    from allauth.mfa.webauthn.forms import AuthenticateWebAuthnForm\n\n\n    class MyCustomAuthenticateForm(AuthenticateForm):\n        pass\n\n\n    class MyCustomReauthenticateForm(ReauthenticateForm):\n        pass\n\n\n    class MyCustomAuthenticateWebAuthnForm(AuthenticateWebAuthnForm):\n        pass\n\n``settings.py``::\n\n    MFA_FORMS = {\n        'authenticate': 'mysite.forms.MyCustomAuthenticateForm',\n        'reauthenticate': 'mysite.forms.MyCustomReauthenticateForm',\n        'authenticate_webauthn': 'mysite.forms.MyCustomAuthenticateWebAuthnForm',\n    }\n\nActivate TOTP\n*************\n\n*Path*\n  ``allauth.mfa.totp.forms.ActivateTOTPForm``\n\n*Used on*:\n  ActivateTOTPView, used when a user activates TOTP.\n\nExample override::\n\n    from allauth.mfa.totp.forms import ActivateTOTPForm\n    class MyCustomActivateTOTPForm(ActivateTOTPForm):\n      pass\n\n``settings.py``::\n\n    MFA_FORMS = {\n        'activate_totp': 'mysite.forms.MyCustomActivateTOTPForm',\n    }\n\nDeactivate TOTP\n***************\n\n*Path*\n  ``allauth.mfa.totp.forms.DeactivateTOTPForm``\n\n*Used on*:\n  DeactivateTOTPView, used when a user deactivates TOTP.\n\nExample override::\n\n    from allauth.mfa.totp.forms import DeactivateTOTPForm\n    class MyCustomDeactivateTOTPForm(DeactivateTOTPForm):\n      pass\n\n``settings.py``::\n\n    MFA_FORMS = {\n        'deactivate_totp': 'mysite.forms.MyCustomDeactivateTOTPForm',\n    }\n\nGenerate Recovery Codes\n***********************\n\n*Path*\n  ``allauth.mfa.recovery_codes.forms.GenerateRecoveryCodesForm``\n\n*Used on*:\n  GenerateRecoveryCodesView, used when a user generates recovery codes.\n\nExample override::\n\n    from allauth.mfa.recovery_codes.forms import GenerateRecoveryCodesForm\n    class MyCustomGenerateRecoveryCodesForm(GenerateRecoveryCodesForm):\n      pass\n\n``settings.py``::\n\n    MFA_FORMS = {\n        'generate_recovery_codes': 'mysite.forms.MyCustomGenerateRecoveryCodesForm',\n    }\n"
  },
  {
    "path": "docs/mfa/index.rst",
    "content": "Multi-Factor Authentication\n===========================\n\n.. toctree::\n\n   introduction\n   configuration\n   forms\n   adapter\n   webauthn\n   django-allauth-2fa\n"
  },
  {
    "path": "docs/mfa/introduction.rst",
    "content": "Introduction\n============\n\nThe ``allauth.mfa`` app contains all functionality related to Multi-Factor\nAuthentication. It supports:\n\n- TOTP based authentication.\n\n- Authentication by recovery codes.\n\n- Viewing, downloading and regenerating recovery codes.\n\n- WebAuthn based credentials.\n\n- Login using passkeys.\n\n\nNote that in order to use this functionality you need to install the ``mfa`` extras of the ``django-allauth`` package::\n\n  pip install \"django-allauth[mfa]\"\n\nRemember to add the app to the ``settings.py`` of your project::\n\n    INSTALLED_APPS = [\n        ...\n        # The required `allauth` apps...\n        'allauth',\n        'allauth.account',\n\n        # The MFA app:\n        'allauth.mfa',\n        ...\n    ]\n\nNote that :doc:`WebAuthn support <./webauthn>` is disabled by default.\n"
  },
  {
    "path": "docs/mfa/webauthn.rst",
    "content": "WebAuthn\n========\n\nWebAuthn support is disabled by default. To enable it, add these settings::\n\n    # Make sure \"webauthn\" is included.\n    MFA_SUPPORTED_TYPES = [\"totp\", \"webauthn\", \"recovery_codes\"]\n\n    # Optional: enable support for logging in using a (WebAuthn) passkey.\n    MFA_PASSKEY_LOGIN_ENABLED = True\n\n    # Optional -- use for local development only: the WebAuthn uses the\n    #``fido2`` package, and versions up to including version 1.1.3 do not\n    # regard localhost as a secure origin, which is problematic during\n    # local development and testing.\n    MFA_WEBAUTHN_ALLOW_INSECURE_ORIGIN = True\n\n    # Add \"humanize\" contrib app if using default templates\n    INSTALLED_APPS = [\n        ...\n        \"django.contrib.humanize\",\n    ]\n"
  },
  {
    "path": "docs/project/contributing.rst",
    "content": "Contributing\n============\n\n.. include:: ../../CONTRIBUTING.rst\n    :start-after: .. begin-contributing\n    :end-before: .. end-contributing\n"
  },
  {
    "path": "docs/project/funding.rst",
    "content": "Funding\n-------\n\nMaintaining a project of this nature to align with the latest standards and\nexpectations demands a significant investment of time and effort. If you are\nusing this project, especially in a commercial context, then please do consider\n`sponsoring <https://github.com/sponsors/pennersr>`_.\n"
  },
  {
    "path": "docs/project/index.rst",
    "content": "Project\n=======\n\n.. toctree::\n\n   support\n   funding\n   contributing\n"
  },
  {
    "path": "docs/project/support.rst",
    "content": "Commercial Support\n------------------\n\n.. include:: ../../README.rst\n    :start-after: .. begin-support\n    :end-before: .. end-support\n"
  },
  {
    "path": "docs/release-notes/2012.rst",
    "content": "0.8.3 (2012-12-06)\n******************\n\nNote worthy changes\n-------------------\n\n- Markus Thielen contributed a German translation, thanks!\n\n- The ``site`` foreign key from ``SocialApp`` to ``Site`` has been replaced\n  by a ``ManyToManyField``. Many apps can be used across multiple domains\n  (Facebook cannot).\n\n- account: Added adapter class for increased pluggability. Added\n  hook for 3rd party invitation system to by pass email\n  verification (``stash_email_verified``). Moved sending of mail to\n  adapter.\n\n- account: Added option to completely disable email verification\n  during signup.\n\n\nBackwards incompatible changes\n------------------------------\n\n- The ``ACCOUNT_EMAIL_VERIFICATION`` setting is no longer a boolean\n  based setting. Use a string value of \"none\", \"optional\" or\n  \"mandatory\" instead.\n\n- The template \"account/password_reset_key_message.txt\" has been moved\n  to \"account/email/password_reset_key_message.txt\". The subject of\n  the message has been moved into a template\n  (\"account/email/password_reset_key_subject.txt\").\n\n- The ``site`` foreign key from ``SocialApp`` to ``Site`` has been replaced\n  by a ``ManyToManyField``. Many apps can be used across multiple\n  domains (Facebook cannot).\n\n\n0.8.2 (2012-10-10)\n******************\n\nNote worthy changes\n-------------------\n\n- Twitter: Login was broken due to change at in URLs at Twitter,\n  fixed.\n\n- LinkedIn: Added support for passing along the OAuth scope.\n\n- account: Improved email confirmation error handling, no more\n  confusing 404s.\n\n- account: Aldiantoro Nugroho contributed support for a new\n  setting: ACCOUNT_USERNAME_MIN_LENGTH\n\n- socialaccount: Added preliminary support for Mozilla Persona.\n\n- account: Sam Solomon added various signals for email and\n  password related changes.\n\n- account: Usernames may now contain @, +, . and - characters.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Dropped support for ``CONTACT_EMAIL`` from the ``account`` template\n  context processor. It was never documented and only used in the\n  templates as an example -- there is no need to pollute the ``allauth``\n  settings with that. If your templates rely on it then you will have\n  to put it in a context processor yourself.\n\n\n0.8.1 (2012-09-03)\n******************\n\nNote worthy changes\n-------------------\n\n- Python 2.6.2 compatibility issue, fixed.\n\n- The example project was unintentionally packaged, fixed.\n\n\nBackwards incompatible changes\n------------------------------\n\nNone\n\n\n0.8.0 (2012-09-01)\n******************\n\nNote worthy changes\n-------------------\n\n- account: Dropped dependency on the emailconfirmation app,\n  integrating its functionality into the account app. This change is\n  of major impact, please refer to the documentation on how to\n  upgrade.\n\n- account: Documented ACCOUNT_USERNAME_REQUIRED. This is actually\n  not a new setting, but it somehow got overlooked in the\n  documentation.\n\n- account/socialaccount: Dropped the _tags postfix from the\n  template tag libraries. Simply use {% load account %} and {% load\n  socialaccount %}.\n\n- Added signup and social login signals.\n\n- SoundCloud: Rabi Alam contributed a SoundCloud provider, thanks!\n\n- account: Sam Solomon cleaned up the email management view:\n  added proper redirect after POSTs, prevent deletion of primary\n  email. Thanks.\n\n- account: When signing up, instead of generating a completely\n  random username a more sensible username is automatically derived\n  from first/last name or email.\n\n\nBackwards incompatible changes\n------------------------------\n\n- ``allauth`` now depends on Django 1.4 or higher.\n\n- Major impact: dropped dependency on the ``emailconfirmation`` app, as\n  this project is clearly left unmaintained. Important tickets such\n  as https://github.com/pinax/django-email-confirmation/pull/5 are not\n  being addressed. All models and related functionality have been\n  directly integrated into the ``allauth.account`` app. When upgrading\n  take care of the following:\n\n  - The ``emailconfirmation`` setting ``EMAIL_CONFIRMATION_DAYS`` has been\n    replaced by ``ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS``.\n\n  - Instead of directly confirming the email address upon the GET\n    request the confirmation is now processed as part of an explicit\n    POST. Therefore, a new template ``account/email_confirm.html`` must\n    be setup.\n\n  - Existing ``emailconfirmation`` data should be migrated to the new\n    tables. For this purpose a special management command is\n    available: ``python manage.py\n    account_emailconfirmationmigration``. This command does not drop\n    the old ``emailconfirmation`` tables -- you will have to do this\n    manually yourself. Why not use South? EmailAddress uniqueness\n    depends on the configuration (``ACCOUNT_UNIQUE_EMAIL``), South does\n    not handle settings dependent database models.\n\n- ``{% load account_tags %}`` is deprecated, simply use: ``{% load account %}``\n\n- ``{% load socialaccount_tags %}`` is deprecated, simply use:\n  ``{% load socialaccount %}``\n\n\n0.7.0 (2012-07-18)\n******************\n\nNote worthy changes\n-------------------\n\n- Facebook: Facundo Gaich contributed support for dynamically\n  deriving the Facebook locale from the Django locale, thanks!.\n\n- OAuth: All OAuth/OAuth2 tokens are now consistently stored\n  across the board. Cleaned up OAuth flow removing superfluous\n  redirect.\n\n- Facebook: Dropped Facebook SDK dependency.\n\n- socialaccount: DRY focused refactoring of social login.\n\n- socialaccount: Added support for Google OAuth2 and Facebook\n  OAuth2. Fixed GitHub.\n\n- account: Added verified_email_required decorator.\n\n- socialaccount: When signing up, user.first/last_name where\n  always taken from the provider signup data, even when a custom\n  signup form was in place that offered user inputs for editing\n  these fields. Fixed.\n\n\nBackwards incompatible changes\n------------------------------\n\nNone\n\n\n0.6.0 (2012-06-20)\n******************\n\nNote worthy changes\n-------------------\n\n- account: Added ACCOUNT_USER_DISPLAY to render a user name\n  without making assumptions on how the user is represented.\n\n- allauth, socialaccount: Removed the last remaining bits of\n  hardcodedness with respect to the enabled social authentication\n  providers.\n\n- account: Added ACCOUNT_AUTHENTICATION_METHOD setting, supporting\n  login by username, email or both.\n\n\nBackwards incompatible changes\n------------------------------\n\n- The ``ACCOUNT_EMAIL_AUTHENTICATION`` setting has been dropped in favor\n  of ``ACCOUNT_AUTHENTICATION_METHOD``.\n\n- The login form field is now always named ``login``. This used to by\n  either ``username`` or ``email``, depending on the authentication\n  method. If needed, update your templates accordingly.\n\n- The ``allauth`` template tags (containing template tags for\n  OpenID, Twitter and Facebook) have been removed. Use the\n  ``socialaccount`` template tags instead (specifically: ``{% provider_login_url\n  ... %}``).\n\n- The ``allauth.context_processors.allauth`` context processor has been\n  removed, in favor of\n  ``allauth.socialaccount.context_processors.socialaccount``. In doing\n  so, all hardcodedness with respect to providers (e.g\n  ``allauth.facebook_enabled``) has been removed.\n\n\n0.5.0 (2012-06-08)\n******************\n\nNote worthy changes\n-------------------\n\n- account: Added setting ACCOUNT_PASSWORD_MIN_LENGTH for\n  specifying the minimum password length.\n\n- socialaccount: Added generic OAuth2 support. Added GitHub\n  support as proof of concept.\n\n- socialaccount: More refactoring: generic provider & OAuth\n  consumer approach. Added LinkedIn support to test this approach.\n\n- socialaccount: Introduced generic models for storing social\n  apps, accounts and tokens in a central and consistent manner,\n  making way for adding support for more account providers. Note:\n  there is more refactoring to be done -- this first step only\n  focuses on the database models.\n\n- account: Email confirmation mails are now automatically resent\n  whenever a user attempts to login with an unverified email\n  address (if ACCOUNT_EMAIL_VERIFICATION=True).\n\n\nBackwards incompatible changes\n------------------------------\n\n- Upgrade your ``settings.INSTALLED_APPS``: Replace ``allauth.<provider>``\n  (where provider is one of ``twitter``, ``facebook`` or ``openid``) with\n  ``allauth.socialaccount.providers.<provider>``\n\n- All provider related models (``FacebookAccount``, ``FacebookApp``,\n  ``TwitterAccount``, ``TwitterApp``, ``OpenIDAccount``) have been unified\n  into generic ``SocialApp`` and ``SocialAccount`` models. South migrations\n  are in place to move the data over to the new models, after which\n  the original tables are dropped. Therefore, be sure to run migrate\n  using South.\n\n\n0.4.0 (2012-03-25)\n******************\n\nNote worthy changes\n-------------------\n\n- account: The render_value parameter of all PasswordInput fields\n  used can now be configured via a setting.\n\n- account: Added support for prefixing the subject of sent emails.\n\n- account: Added support for a plugging in a custom signup form\n  used for additional questions to ask during signup.\n\n- account: ``is_active`` is no longer used to keep users with an\n  unverified email address from logging in.\n\n- Dropping uniform dependency. Moved uniform templates into\n  example project.\n\n\nBackwards incompatible changes\n------------------------------\n\nNone\n\n\n0.3.0 (2012-01-19)\n******************\n\nNote worthy changes\n-------------------\n\n- The email authentication backend now attempts to use the\n  'username' parameter as an email address. This is needed to\n  properly integrate with other apps invoking authenticate.\n\n- SmileyChris contributed support for automatically generating a\n  user name at signup when ``ACCOUNT_USERNAME_REQUIRED`` is set to\n  False.\n\n- Vuong Nguyen contributed support for (optionally) asking for the\n  password just once during signup\n  (``ACCOUNT_SIGNUP_PASSWORD_VERIFICATION``).\n\n- The Twitter oauth sequence now respects the \"oauth_callback\"\n  parameter instead of defaulting to the callback URL\n  configured at Twitter.\n\n- Pass along ``?next=`` parameter between login and signup views.\n\n- Added Dutch translation.\n\n- Added template tags for pointing to social login URLs. These\n  tags automatically pass along any ``?next=``\n  parameter. Additionally, added an overall allauth_tags that\n  gracefully degrades when e.g. allauth.facebook is not installed.\n\n- Pass along next URL, if any, at ``/accounts/social/signup/``.\n\n- Duplicate email address handling could throw a\n  MultipleObjectsReturned exception, fixed.\n\n- Removed separate social account login view, in favour of having\n  a single unified login view including both forms of login.\n\n- Added support for passing along a next URL parameter to\n  Facebook, OpenID logins.\n\n- Added support for django-avatar, copying the Twitter profile\n  image locally on signup.\n\n- ``allauth/account/forms.py`` (``BaseSignupForm.clean_email``): With\n  ``ACCOUNT_EMAIL_REQUIRED=False``, empty email addresses were\n  considered duplicates. Fixed.\n\n- The existing migrations for allauth.openid were not compatible\n  with MySQL due to the use of an URLField with max_length above\n  255. The issue has now been addressed but unfortunately at the\n  cost of the existing migrations for this app. Existing\n  installations will have to be dealt with manually (altering the\n  \"identity\" column of OpenIDAccount, deleting ghost migrations).\n\nBackwards incompatible changes\n------------------------------\n\n- None\n"
  },
  {
    "path": "docs/release-notes/2013.rst",
    "content": "0.15.0 (2013-12-01)\n*******************\n\nNote worthy changes\n-------------------\n\n- socialaccount: Added ``is_auto_signup_allowed`` to social account\n  adapter.\n\n- facebook: Added a new setting: VERIFIED_EMAIL.\n\n- socialaccount: a collision on email address when you sign up\n  using a third party social account is now more clearly explained:\n  \"An account already exists with this email address.  Please sign\n  in to that account first, then connect your Google account\".\n\n- account: You are now automatically logged in after confirming\n  your email address during sign up.\n\n- account: The ``/accounts/login/`` view now supports AJAX requests.\n\n- facebook: The fbconnect.js script is now more pluggable.\n\n- socialaccount: Markus Kaiserswerth contributed a Feedly\n  provider, thanks!\n\n- socialaccount: Dropped django-avatar support.\n\n- openid: First, last and full name are now also queried together\n  with the email address. Thanks, @andrvb.\n\n- openid: Compatibility fix for Django 1.6 (JSON serializer).\n\n- account: Added support for ``ACCOUNT_CONFIRM_EMAIL_ON_GET``.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Instead of directly rendering and returning a template, logging in\n  while the account is inactive or not yet confirmed now redirects to\n  two new views: ``/accounts/inactive/`` respectively\n  ``/accounts/confirm-email/``.\n\n- The ``account/verification_sent.html`` template no longer receives the\n  email address in the context (``email``). Note that a message\n  containing that email address is still emitted using the messages\n  framework.\n\n- The ``/accounts/confirm_email/key/`` view has been\n  renamed to ``/accounts/confirm-email/`` (human friendlier). Redirects\n  are in place to handle old still pending confirmations.\n\n- Built-in support for django-avatar has been removed. Offering such\n  functionality means making choices which may not be valid for\n  everyone. For example, allauth was downloading the image (which can\n  take some time, or even block) in the context of the login, whereas\n  a better place might be some celery background job. Additionally, in\n  case of an error it simply ignored this. How about retries et al?\n  Also, do you want to copy the avatar once at sign up, or do you want\n  to update on each login? All in all, this functionality goes way\n  beyond authentication and should be addressed elsewhere, beyond\n  allauth scope. The original code has been preserved here so that you\n  can easily reinstate it in your own project:\n  https://gist.github.com/pennersr/7571752\n\n\n0.14.2 (2013-11-16)\n*******************\n\nNote worthy changes\n-------------------\n\n- Compatibility fix for logging in with Django 1.6.\n\n- Maksim Rukomoynikov contributed a Russian translation, thanks!\n\n\nBackwards incompatible changes\n------------------------------\n\n- In case you were using the internal method\n  ``generate_unique_username``, note that its signature has changed. It\n  now takes a list of candidates to base the username on.\n\n\n0.14.1 (2013-10-28)\n*******************\n\nNote worthy changes\n-------------------\n\n- PyPi did not render the README.rst properly.\n\n\nBackwards incompatible changes\n------------------------------\n\nNone\n\n\n0.14.0 (2013-10-28)\n*******************\n\nNote worthy changes\n-------------------\n\n- Stuart Ross contributed AngelList support, thanks!\n\n- LinkedIn: profile fields that are to be fetched are now\n  configurable (``PROFILE_FIELDS`` provider-level setting).\n\n- Udi Oron contributed a Hebrew translation, thanks!\n\n- Add setting ``ACCOUNT_DEFAULT_HTTP_PROTOCOL`` (HTTPS support).\n\n- George Whewell contributed Instagram support, thanks!\n\n- Refactored adapter methods relating to creating and populating\n  ``User`` instances.\n\n- User creation methods in the ``Default(Social)AccountAdapter`` now\n  have access to the ``request``.\n\n\nBackwards incompatible changes\n------------------------------\n\n- The ``socialaccount/account_inactive.html`` template has been\n  moved to ``account/account_inactive.html``.\n\n- The adapter API for creating and populating users has been\n  overhauled. As a result, the ``populate_new_user`` adapter methods\n  have disappeared. Please refer to the section on \"Creating and\n  Populating User Instances\" for more information.\n\n\n0.13.0 (2013-08-31)\n*******************\n\nNote worthy changes\n-------------------\n\n- Koichi Harakawa contributed a Japanese translation, thanks!\n\n- Added ``is_open_for_signup`` to DefaultSocialAccountAdapter.\n\n- Added VK provider support.\n\n- Marcin Spoczynski contributed a Polish translation, thanks!\n\n- All views are now class-based.\n\n- ``django.contrib.messages`` is now optional.\n\n- \"jresins\" contributed a simplified Chinese, thanks!\n\n\nBackwards incompatible changes\n------------------------------\n\n- The password reset from key success response now redirects to a\n  \"done\" view (``/accounts/password/reset/key/done/``). This view has\n  its own ``account/password_reset_from_key_done.html`` template. In\n  previous versions, the success template was intertwined with the\n  ``account/password_reset_from_key.html`` template.\n\n\n0.12.0 (2013-07-01)\n*******************\n\nNote worthy changes\n-------------------\n\n- Added support for re-authenticated (forced prompt) by means of a\n  new ``action=\"reauthenticate\"`` parameter to the ``{%\n  provider_login_url %}``\n\n- Roberto Novaes contributed a Brazilian Portuguese translation,\n  thanks!\n\n- Daniel Eriksson contributed a Swedish translation, thanks!\n\n- You can now logout from both allauth and Facebook via a\n  Javascript helper: ``window.allauth.facebook.logout()``.\n\n- Connecting a social account is now a flow that needs to be\n  explicitly triggered, by means of a ``process=\"connect\"`` parameter\n  that can be passed along to the ``{% provider_login_url %}``, or a\n  ``process=connect`` GET parameter.\n\n- Tomas Marcik contributed a Czech translation, thanks!\n\n\nBackwards incompatible changes\n------------------------------\n\n- The ``{% provider_login_url %}`` tag now takes an optional process\n  parameter that indicates how to process the social login. As a\n  result, if you include the template\n  ``socialaccount/snippets/provider_list.html`` from your own overridden\n  ``socialaccount/connections.html`` template, you now need to pass\n  along the process parameter as follows:\n  ``{% include \"socialaccount/snippets/provider_list.html\" with process=\"connect\" %}``.\n\n- Instead of inlining the required Facebook SDK Javascript wrapper\n  code into the HTML, it now resides into its own .js file (served\n  with ``{% static %}``). If you were using the builtin ``fbconnect.html``\n  this change should go by unnoticed.\n\n\n0.11.1 (2013-06-04)\n*******************\n\nNote worthy changes\n-------------------\n\n- Released (due to issue in disconnecting social accounts).\n\nBackwards incompatible changes\n------------------------------\n\nNone\n\n\n0.11.0 (2013-06-02)\n*******************\n\nNote worthy changes\n-------------------\n\n- Moved logic whether or not a social account can be disconnected\n  to the ``SocialAccountAdapter`` (``validate_disconnect``).\n\n- Added ``social_account_removed`` signal.\n\n- Implemented CSRF protection\n  (http://tools.ietf.org/html/draft-ietf-oauth-v2-30#section-10.12).\n\n- The ``user_logged_in`` signal now optionally receives a\n  ``sociallogin`` parameter, in case of a social login.\n\n- Added ``social_account_added`` (contributed by orblivion, thanks).\n\n- Hatem Nassrat contributed Bitly support, thanks!\n\n- Bojan Mihelac contributed a Croatian translation, thanks!\n\n- Messages (as in ``django.contrib.messages``) are now configurable\n  through templates.\n- Added support for differentiating email handling (verification,\n  required) between local and social accounts:\n  ``SOCIALACCOUNT_EMAIL_REQUIRED`` and\n  ``SOCIALACCOUNT_EMAIL_VERIFICATION``.\n\n\nBackwards incompatible changes\n------------------------------\n\nNone\n\n\n0.10.1 (2013-04-16)\n*******************\n\nNote worthy changes\n-------------------\n\n- Cleaning of ``username`` can now be overridden via\n  ``DefaultAccountAdapter.clean_username``\n\n- Fixed potential error (``assert``) when connecting social\n  accounts.\n\n- Added support for custom username handling in case of custom\n  user models (``ACCOUNT_USER_MODEL_USERNAME_FIELD``).\n\n\nBackwards incompatible changes\n------------------------------\n\nNone\n\n\n0.10.0 (2013-04-12)\n*******************\n\nNote worthy changes\n-------------------\n\n- Chris Davis contributed Vimeo support, thanks!\n\n- Added support for overriding the URL to return to after\n  connecting a social account\n  (``allauth.socialaccount.adapter.DefaultSocialAccountAdapter.get_connect_redirect_url``).\n\n- Python 3 is now supported!\n\n- Dropped dependency on (unmaintained?) oauth2 package, in favor\n  of requests-oauthlib.\n\n- account: Email confirmation mails generated at signup can now\n  be differentiated from regular email confirmation mails by\n  placing e.g. a welcome message into the\n  ``account/email/email_confirmation_signup*`` templates. Thanks to\n  Sam Solomon for the patch.\n\n- account: Moved User instance creation to adapter so that e.g.\n  username generation can be influenced. Thanks to John Bazik for\n  the patch.\n\n- Robert Balfre contributed Dropbox support, thanks!\n\n- socialaccount: Added support for Weibo.\n\n- account: Added support for sending HTML email. Add\n  ``*_message.html`` templates and they will be automatically picked\n  up.\n\n- Added support for passing along extra parameters to the OAuth2\n  authentication calls, such as ``access_type`` (Google) or\n  ``auth_type`` (Facebook).\n- Both the login and signup view now immediately redirect to the\n  login redirect url in case the user was already authenticated.\n\n- Added support for closing down signups in a pluggable fashion,\n  making it easy to hookup your own invitation handling mechanism.\n\n- Added support for passing along extra parameters to the\n  ``FB.login`` API call.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Logout no longer happens on GET request. Refer to the ``LogoutView``\n  documentation for more background information. Logging out on GET\n  can be restored by the setting ``ACCOUNT_LOGOUT_ON_GET``. Furthermore,\n  after logging out you are now redirected to\n  ``ACCOUNT_LOGOUT_REDIRECT_URL`` instead of rendering the\n  ``account/logout.html`` template.\n\n- ``LOGIN_REDIRECT_URLNAME`` is now deprecated. Django 1.5 accepts both\n  URL names and URLs for ``LOGIN_REDIRECT_URL``, so we do so as well.\n\n- ``DefaultAccountAdapter.stash_email_verified`` is now named\n  ``stash_verified_email``.\n\n- Django 1.4.3 is now the minimal requirement.\n\n- Dropped dependency on (unmaintained?) oauth2 package, in favor of\n  requests-oauthlib. So you will need to update your (virtual)\n  environment accordingly.\n\n- We noticed a very rare bug that affects end users who add Google\n  social login to existing accounts. The symptom is you end up with\n  users who have multiple primary email addresses which conflicts\n  with assumptions made by the code. In addition to fixing the code\n  that allowed duplicates to occur, there is a management command\n  you can run if you think this effects you (and if it doesn't effect\n  you there is no harm in running it anyways if you are unsure):\n\n  - ``python manage.py account_unsetmultipleprimaryemails``\n\n    - Will silently remove primary flags for email addresses that\n      aren't the same as ``user.email``.\n\n    - If no primary ``EmailAddress`` is ``user.email`` it will pick one\n      at random and print a warning.\n\n- The expiry time, if any, is now stored in a new column\n  ``SocialToken.expires_at``. Migrations are in place.\n\n- Furthermore, Facebook started returning longer tokens, so the\n  maximum token length was increased. Again, migrations are in place.\n\n- Login and signup views have been turned into class-based views.\n\n- The template variable ``facebook_perms`` is no longer passed to the\n  \"facebook/fbconnect.html\" template. Instead, ``fb_login_options``\n  containing all options is passed.\n\n\n0.9.0 (2013-01-30)\n******************\n\nNote worthy changes\n-------------------\n\n- account: ``user_signed_up`` signal now emits an optional\n  ``sociallogin`` parameter so that receivers can easily differentiate\n  between local and social signups.\n\n- account: Added ``email_removed`` signal.\n\n- socialaccount: Populating of User model fields is now\n  centralized in the adapter, splitting up ``name`` into ``first_name``\n  and ``last_name`` if these were not individually available.\n\n- Ahmet Emre Aladağ contributed a Turkish translation, thanks!\n\n- socialaccount: Added SocialAccountAdapter hook to allow for\n  intervention in social logins.\n\n- google: support for Google's ``verified_email`` flag to determine\n  whether or not to send confirmation emails.\n\n- Fábio Santos contributed a Portuguese translation, thanks!\n\n- socialaccount: Added support for Stack Exchange.\n\n- socialaccount: Added ``get_social_accounts`` template tag.\n\n- account: Default URL to redirect to after login can now be\n  overridden via the adapter, both for login and email confirmation\n  redirects.\n\n\nBackwards incompatible changes\n------------------------------\n\n- ``requests`` is now a dependency (dropped ``httplib2``).\n\n- Added a new column ``SocialApp.client_id``. The value of ``key`` needs\n  to be moved to the new ``client_id`` column. The ``key`` column is\n  required for Stack Exchange. Migrations are in place to handle all\n  of this automatically.\n"
  },
  {
    "path": "docs/release-notes/2014.rst",
    "content": "0.18.0 (2014-08-12)\n*******************\n\nNote worthy changes\n-------------------\n\n- Storing social access tokens is now optional\n  (``SOCIALACCOUNT_STORE_TOKENS``).\n\n- ``nimiq`` contributed ORCID support, thanks.\n\n- All forms are now pluggable via a new setting:\n  ``(SOCIAL)ACCOUNT_FORMS``.\n\n- James Thompson contributed Windows Live support, thanks!\n\n\nBackwards incompatible changes\n------------------------------\n\n- SECURITY: The Persona provider now requires the ``AUDIENCE`` parameter\n  to be explicitly configured, as required by the Persona\n  specification for security reasons.\n\n- The inline Javascript is removed from the ``fbconnect.html`` template,\n  which allows for a more strict ``Content-Security-Policy``. If you\n  were using the builtin ``fbconnect.html`` this change should go by\n  unnoticed.\n\n\n0.17.0 (2014-06-16)\n*******************\n\nNote worthy changes\n-------------------\n\n- ``sourenaraya`` contributed Mail.Ru support, thanks.\n\n- account: Justin Michalicek contributed support to control\n  session life time and age: ``ACCOUNT_SESSION_COOKIE_AGE`` and\n  ``ACCOUNT_SESSION_REMEMBER``.\n\n- Serafeim Papastefanos contributed an Ukrainian translation,\n  thanks!\n\n- ``kkarwows`` contributed AppConfig support, thanks.\n\n- socialaccount: Added Xing provider.\n\n- socialaccount: Marcin Skarbek contributed Hubic support, thanks!\n\n- Volodymyr Yatsyk contributed an Ukrainian translation, thanks!\n\n- ``joke2k`` contributed an Italian translation, thanks!\n\n- socialaccount: All providers now support the ``VERIFIED_EMAIL``\n  property have email addresses forced to be interpreted as\n  verified.\n\n\nBackwards incompatible changes\n------------------------------\n\nNone\n\n\n0.16.1 (2014-03-12)\n*******************\n\nNote worthy changes\n-------------------\n\n- Facebook login via Javascript was broken if ``auth_type`` was not\n  set to ``reauthenticate``, fixed.\n- Support for hooking up a callback when ``FB.init()`` is ready\n  (``allauth.facebook.onInit``)\n\nBackwards incompatible changes\n------------------------------\n\nNone\n\n\n0.16.0 (2014-03-10)\n*******************\n\nNote worthy changes\n-------------------\n\n- Nariman Gharib contributed a Persian translation, thanks!\n\n- The custom signup form ``save`` has been deprecated in favour of a\n  ``def signup(request, user)`` method.\n\n- Facebook reauthentication now uses an ``auth_nonce``.\n\n- Added a new option ``ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION``, to\n  indicate whether or not email confirmation is to automatically\n  log in.\n\n- socialaccount: Added Bitbucket provider.\n\n- Jack Shedd contributed Tumblr support, thanks!\n\n- Romanos Tsouroplis contributed Foursquare support, thanks!\n\n- \"excessivedemon\" contributed Flickr support, thanks!\n\n- Luis Diego García contributed Amazon and Paypal support, thanks!\n\n- Stuart Ross contributed LinkedIn OAuth 2.0 support, thanks!\n\n\nBackwards incompatible changes\n------------------------------\n\n- Previously, the ``save(user)`` was called on the custom signup form.\n  However, this shadowed the existing ``save`` method in case a model\n  form was used. To avoid confusion, the ``save`` method has been\n  deprecated in favour of a ``def signup(request, user)`` method.\n\n- The Amazon provider requires more space for ``token_secret``, so the\n  maximum length restriction has been dropped. Migrations are in\n  place.\n"
  },
  {
    "path": "docs/release-notes/2015.rst",
    "content": "0.24.1 (2015-11-09)\n*******************\n\nNote worthy changes\n-------------------\n\n- Non-test code accidentally had test packages as a dependency.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Setting a password after logging in with a social account no longer logs out\n  the user by default on Django 1.7+. Setting an initial password and changing\n  the password both respect ``settings.ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE``.\n\n\n0.24.0 (2015-11-08)\n*******************\n\nNote worthy changes\n-------------------\n\n- Django 1.9b1 compatibility.\n\n- Seppo Erviälä contributed a Finnish translation, thanks!\n\n- Iurii Kriachko contributed a Basecamp provider, thanks!\n\nBackwards incompatible changes\n------------------------------\n\n- Increased ``SocialApp`` key/secret/token sizes to 191, decreased\n  ``SocialAccount.uid`` size to 191. The latter was done in order to\n  accommodate for MySQL in combination with utf8mb4 and constraints on\n  ``uid``. Note that ``uid`` is used to store OpenID URLs, which can\n  theoretically be longer than 191 characters, although in practice\n  this does not seem to be the case. In case you really need to\n  control the ``uid`` length, set ``settings.SOCIALACCOUNT_UID_MAX_LENGTH``\n  accordingly. Migrations are in place.\n\n\n0.23.0 (2015-08-02)\n*******************\n\nNote worthy changes\n-------------------\n\n- David Friedman contributed Edmodo support, thanks!\n\n- Added support for ``ACCOUNT_LOGIN_ON_PASSWORD_RESET`` (thanks Julen!)\n\n\nBackwards incompatible changes\n------------------------------\n\nNone\n\n\n0.22.0 (2015-07-23)\n*******************\n\nNote worthy changes\n-------------------\n\n- Reversal of the email confirmation url can now be overridden in\n  the adapter (``get_email_confirmation_url``). Additionally, the\n  complete confirmation email handling can be overridden via\n  ``send_confirmation_mail``.\n\n- Template context processors are no longer used.\n\n- The Facebook Graph API fields (/me/?fields=...) can now be\n  configured using the provider ``FIELDS`` setting.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Dropped support for Python 2.6 and Django <1.6.\n\n- The default Facebook Graph API version is now v2.4.\n\n- Template context processors are no longer used. The context\n  processor for ``allauth.account`` was already empty, and the context\n  processor for ``allauth.socialaccount`` has been converted into the\n  :doc:``{% get_providers %} <templates>`` template tag.\n\n\n0.21.0 (2015-07-02)\n*******************\n\nNote worthy changes\n-------------------\n\n- You can now tweak the authentication params per OAuth provider,\n  as you already could for OAuth2. Contributed by Peter Rowlands,\n  thanks.\n\n- Nattaphoom Ch. contributed a Thai translation, thanks!\n\n- Guoyu Hao contributed a Baidu provider, thanks!\n\n- Rod Xavier Bondoc contributed support logging out on password\n  change (see setting: ``ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE``)\n\n\nBackwards incompatible changes\n------------------------------\n\n- In version 0.20.0 an ``account`` migration (``0002_email_max_length``)\n  was added to alter the maximum length of the email\n  field. Unfortunately, a side effect of this migration was that the\n  ``unique=True`` setting slipped through as well. Hardcoding this to\n  ``True`` is wrong, as uniqueness actually depends on the\n  ``ACCOUNT_UNIQUE_EMAIL`` setting. We cannot create a followup ``0003``\n  migration to set things straight, as the ``0002`` migration may fail\n  on installations where email addresses are not unique. Therefore, we\n  had to resort to changing an existing migration which is normally\n  not the right thing to do. In case your installation has\n  ``ACCOUNT_UNIQUE_EMAIL`` set to ``True``, you need not take any further\n  action. In case it is set to ``False`` and migration ``0002`` already\n  ran, please issue a ``--fake`` migration down to ``0001``, followed by a\n  re-run of the updated ``0002``.\n\n\n0.20.0 (2015-05-25)\n*******************\n\nNote worthy changes\n-------------------\n\n- Patrick Paul contributed a provider for Evernote, thanks!\n\n- Josh Wright contributed a provider for Spotify, thanks!\n\n- Björn Andersson added support for Dropbox OAuth2, thanks!\n\n- guoqiao contributed a provider for Douban, thanks!\n\n\nBackwards incompatible changes\n------------------------------\n\n- Given that the ``max_length`` for the Django 1.8 ``EmailField`` has been\n  bumped to 254, allauth is following up. Migrations (``account``) are\n  in place.\n\n\n0.19.1 (2015-02-05)\n*******************\n\nNote worthy changes\n-------------------\n\n- Fixed migrations when using South & Django 1.6.\n\n\n0.19.0 (2015-01-04)\n*******************\n\nNote worthy changes\n-------------------\n\n- Basil Shubin contributed an Odnoklassniki provider, thanks!\n\n- Facebook: If the JS SDK is not available, for example due to a\n  browser plugin like Disconnect.me that blocks it, login falls back\n  to the regular non JS handshake.\n\n- ``is_safe_url`` can now be overridden\n\n- Facebook: The Graph API version is now configurable via\n  ``SOCIALACCOUNT_PROVIDERS``.\n\n- A Firefox Accounts provider was added by Jannis Leidel, thanks!\n\n- Josh Owen contributed Coinbase support, thanks!\n\n- Tomas Babej contributed a Slovak translation, thanks!\n\n- Moved existing migrations into ``south_migrations``\n\n- \"zbryikt\" contributed a Taiwanese Chinese translation, thanks!\n\n- Added support for custom password rules via ``clean_password``.\n\n\nBackwards incompatible changes\n------------------------------\n\n- In the upcoming Django 1.8 it is no longer possible to hookup an\n  unsaved ``User`` instance to a ``SocialAccount``. Therefore, if you are\n  inspecting the ``sociallogin`` object, you should now use\n  ``sociallogin.user`` instead of ``sociallogin.account.user``.\n\n- When users logged in while ``User.is_active`` was ``False``, they were\n  sent to ``/accounts/inactive/`` in case of a social login, and\n  received a form validation error in case of a local login. This\n  needless inconsistency has been removed. The validation error no\n  longer appears and local logins are also redirected to\n  ``/accounts/inactive/``.\n\n- In case you were overriding the ``ResetPasswordForm``: the save method\n  now takes ``request`` as its first argument.\n\n- All existing migrations have been moved into ``south_migrations``\n  packages, this in order not to conflict with Django's built-in\n  support for migrations. South 1.0 automatically picks up this new\n  location. Upgrade South if you are still dependent on these\n  migrations.\n"
  },
  {
    "path": "docs/release-notes/2016.rst",
    "content": "0.29.0 (2016-11-21)\n*******************\n\nNote worthy changes\n-------------------\n\n- Addressed Django 1.10 deprecation warnings.\n\n\n0.28.0 (2016-10-13)\n*******************\n\nSecurity notice\n---------------\n\n- Previous versions contained a vulnerability allowing an attacker to alter the\n  provider specific settings for ``SCOPE`` and/or ``AUTH_PARAMS`` (part of the\n  larger ``SOCIALACCOUNT_PROVIDERS`` setting). The changes would persist across\n  subsequent requests for all users, provided these settings were explicitly set\n  within your project. These settings translate directly into request\n  parameters, giving the attacker undesirable control over the OAuth(2)\n  handshake. You are not affected if you did not explicitly configure these\n  settings. Thanks to Ryan Kelly for reporting!\n\n\nNote worthy changes\n-------------------\n\n- New providers: Doximity.\n\n- New translations: Korean.\n\n\n0.27.0 (2016-08-18)\n*******************\n\nNote worthy changes\n-------------------\n\n- Django 1.10 compatibility.\n\n- The Twitter and GitHub providers now support querying of the email address.\n\n\nBackwards incompatible changes\n------------------------------\n\n- When ``ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE`` was turned on, the email field key\n  changed from ``email`` to ``email1``, which could introduce subtle bugs. This\n  has now been changed: there always is an ``email`` field, and optionally an\n  ``email2`` field.\n\n- The \"You must type the same password each time\" form validation error that can\n  be triggered during signup is now added to the ``password2`` field instead of\n  being added to the non field errors.\n\n- The ``email_confirmation_sent`` signal is now passed ``request``,\n  ``confirmation`` and ``signup`` instead of only the ``confirmation``.\n\n- ``ACCOUNT_PASSWORD_MIN_LENGTH`` was already deprecated, but is now completely\n  ignored if ``AUTH_PASSWORD_VALIDATORS`` is not empty.\n\n\n0.26.1 (2016-07-25)\n*******************\n\nNote worthy changes\n-------------------\n\n- Locale files wrongly packaged, fixed.\n\n- Fixed bug (``KeyError``) when ``ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE`` was set to\n  ``True``.\n\n\n0.26.0 (2016-07-24)\n*******************\n\nNote worthy changes\n-------------------\n\n- New providers: Weixin, Battle.net, Asana, Eve Online, 23andMe, Slack\n\n- Django's password validation mechanism (see ``AUTH_PASSWORD_VALIDATORS``) is now\n  used to validate passwords.\n\n- By default, email confirmations are no longer stored in the\n  database. Instead, the email confirmation mail contains an HMAC\n  based key identifying the email address to confirm. The verification\n  lookup includes a fallback to the previous strategy so that there is\n  no negative impact on pending verification emails.\n\n- A new setting ``ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE`` was added, requiring users to\n  input their email address twice. The setting\n  ``ACCOUNT_SIGNUP_PASSWORD_VERIFICATION`` has been renamed to\n  ``ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE``.\n\n- New translations: Latvian, Kyrgyz.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Dropped support for Django 1.6\n\n- In order to accommodate for Django's password validation, the\n  ``clean_password`` method of the adapter now takes an (optional)\n  ``user`` parameter as its second argument.\n\n- The new HMAC based keys may contain colons. If you have forked\n  ``account/urls.py``, be sure to sync the ``account_confirm_email``\n  pattern.\n\n\n0.25.2 (2016-03-13)\n*******************\n\nNote worthy changes\n-------------------\n\n- Bug fix release (MemcachedKeyCharacterError: \"Control characters not allowed\")\n\n\n0.25.1 (2016-03-13)\n*******************\n\nNote worthy changes\n-------------------\n\n- Bug fix release (AttributeError in password reset view).\n\n\n0.25.0 (2016-03-12)\n*******************\n\nNote worthy changes\n-------------------\n\n- Many providers were added: Reddit, Untappd, GitLab, Stripe,\n  Pinterest, Shopify, Draugiem, DigitalOcean, Robinhood,\n  Bitbucket(OAuth2).\n\n- The account connections view is now AJAX aware.\n\n- You can now customize the template extension that is being used to\n  render all HTML templates (``ACCOUNT_TEMPLATE_EXTENSION``)\n\n- In order to be secure by default, users are now blocked from logging\n  in after exceeding a maximum number of failed login attempts (see\n  ``ACCOUNT_LOGIN_ATTEMPTS_LIMIT``,\n  ``ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT``). Set\n  ``ACCOUNT_LOGIN_ATTEMPTS_LIMIT`` to ``None`` to disable this\n  functionality. Important: while this protects the allauth login view, it\n  does not protect Django's admin login from being brute forced.\n\n- New translations: Arabic, Lithuanian\n\n\nBackwards incompatible changes\n------------------------------\n\nNone\n"
  },
  {
    "path": "docs/release-notes/2017.rst",
    "content": "0.34.0 (2017-10-29)\n*******************\n\nSecurity notice\n---------------\n\n- The \"Set Password\" view did not properly check whether or not the user already\n  had a usable password set. This allowed an attacker to set the password\n  without providing the current password, but only in case the attacker already\n  gained control over the victim's session.\n\n\nNote worthy changes\n-------------------\n\n- New provider: Meetup.\n\n\n0.33.0 (2017-08-20)\n*******************\n\nNote worthy changes\n-------------------\n\n- Security: password reset tokens are now prevented from being leaked through\n  the password reset URL.\n\n- New providers: Patreon, Authentiq, Dataporten.\n\n- Dropbox has been upgraded to API V2.\n\n- New translation: Norwegian.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Dropped support for Django 1.9.\n\n\n0.32.0 (2017-04-27)\n*******************\n\nNote worthy changes\n-------------------\n\n- Improved AJAX support: the account management views (change/set password,\n  manage email addresses and social connections) now support AJAX GET requests.\n  These views hand over all the required data for you to build your frontend\n  application upon.\n\n- New providers: Dwolla, Trello.\n\n- Shopify: support for per-user access mode.\n\n\nBackwards incompatible changes\n------------------------------\n\n- In previous versions, the views only responded with JSON responses when\n  issuing AJAX requests of type POST. Now, the views also respond in JSON when\n  making AJAX GET requests.\n\n- The structure of the response for AJAX requests has changed. Previously, it\n  contained a ``form_errors`` key containing all form validation errors, if any.\n  Now, it contains a ``form`` key that describes the complete form, including\n  the fields. Field specific errors are placed in\n  ``form.fields['some_field'].errors``, non-field errors in ``form.errors``.\n\n- The parameters passed to the Facebook JS SDK ``FB.init()`` method used to contain\n  ``cookie``, ``status``, and ``xfbml``, all set to ``true``. These parameters\n  are no longer explicitly passed. You can use the newly introduced ``INIT_PARAMS``\n  provider setting to provide your own values.\n\n\n\n0.31.0 (2017-02-28)\n*******************\n\nNote worthy changes\n-------------------\n\n- Added a new ``user_logged_out`` signal.\n\n- OpenId: Added support for requesting additional data.\n\n- New providers: Auth0, Box, Line, Naver, Kakao, Daum, MailChimp, Eventbrite.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Django 1.7 / Python 3.2 compatibility has been dropped.\n\n- Due to providers being registered in the same file as their definition\n  it was impossible to subclass a provider without having the parent be\n  registered. This has been addressed. If you have implemented a custom\n  provider, you will need to change\n  ``providers.registry.register(CustomProvider)``\n  into\n  ``provider_classes = [CustomProvider]``.\n\n\n0.30.0 (2017-01-01)\n*******************\n\nNote worthy changes\n-------------------\n\n- Changed the algorithm that generates unique usernames. Previously, in case the\n  provider did not hand over any information to base the username on, the\n  username \"user\" extended with an ever increasing numeric suffix would be\n  attempted until a free username was found. In case of a large number of\n  existing users, this could result in many queries being executed before a free\n  username would be found, potentially resulting in a denial of service. The new\n  algorithm uses a random suffix and only one query to determine the final\n  username.\n\n- Added a new setting: ``ACCOUNT_PRESERVE_USERNAME_CASING``. This setting\n  determines whether the username is stored in lowercase (``False``) or whether\n  its casing is to be preserved (``True``). Note that when casing is preserved,\n  potentially expensive ``__iexact`` lookups are performed when filter on\n  username. For now, the default is set to ``True`` to maintain backwards\n  compatibility.\n\n- The OAuth2Adapter class has gained a ``get_callback_url`` method for when\n  customizing the callback URL is desired.\n\n- The Battle.net login backend now accepts the ``region`` GET parameter.\n\n- New providers: 500px, Discord.\n\n\nBackwards incompatible changes\n------------------------------\n\n- In previous versions, the ``DefaultAccountAdapter`` contained a\n  ``username_regex`` property and accompanying\n  ``error_messages['invalid_username']`` validation error message. These have\n  been removed in favor of using the regex validation already defined at the\n  user model level. Alternatively, you can use the newly introduced\n  ``ACCOUNT_USERNAME_VALIDATORS`` setting.\n\n- The Battle.net backend no longer overrides username regex validation. In\n  order to use battletags as usernames, you are expected to override either\n  the ``username`` field on your User model, or to pass a custom validator\n  which will accept the ``#`` character using the new\n  ``ACCOUNT_USERNAME_VALIDATORS`` setting. Such a validator is available in\n  ``socialaccount.providers.battlenet.validators.BattletagUsernameValidator``.\n"
  },
  {
    "path": "docs/release-notes/2018.rst",
    "content": "0.38.0 (2018-10-03)\n*******************\n\nSecurity notice\n---------------\n\nThe ``{% user_display user %}`` tag did not escape properly. Depending on the\nusername validation rules, this could lead to XSS issues.\n\n\nNote worthy changes\n-------------------\n\n- New provider: Vimeo (OAuth2).\n\n- New translations: Basque.\n\n\n0.37.1 (2018-08-27)\n*******************\n\nBackwards incompatible changes\n------------------------------\n\n- Dropped the ``x-li-src: msdk`` headers from the ``linkedin_oauth2`` handshake.\n  This header is only required for mobile tokens, and breaks the regular flow.\n  Use the ``HEADERS`` setting to add this header if you need it.\n\n\n0.37.0 (2018-08-27)\n*******************\n\nNote worthy changes\n-------------------\n\n- The Battle.net login backend now recognizes ``apac`` as a valid region.\n\n- User model using a ``UUIDField`` as it's primary key can now be logged\n  in upon email confirmation (if using ``ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION``).\n\n- New providers: Agave, Cern, Disqus, Globus.\n\n- New translation: Danish.\n\n0.36.0 (2018-05-08)\n*******************\n\nNote worthy changes\n-------------------\n\n- New providers: Telegram, QuickBooks.\n\n- The Facebook API version now defaults to v2.12.\n\n- ORCID upgraded to use API v2.1.\n\n\nSecurity notice\n---------------\n\n- In previous versions, the authentication backend did not invoke the\n  ``user_can_authenticate()`` method, potentially allowing users with\n  ``is_active=False`` to authenticate when the allauth authentication backend\n  was used in a non allauth context.\n\n\n0.35.0 (2018-02-02)\n*******************\n\nNote worthy changes\n-------------------\n\n- Add support for Django 2.0\n\nSecurity notice\n---------------\n\n- As an extra security measure on top of what the standard Django password reset\n  token generator is already facilitating, allauth now adds the user email\n  address to the hash such that whenever the user's email address changes the\n  token is invalidated.\n\nBackwards incompatible changes\n------------------------------\n\n- Drop support for Django 1.8 and Django 1.10.\n\n\nNote worthy changes\n-------------------\n\n- New provider: Azure, Microsoft Graph, Salesforce, Yahoo.\n"
  },
  {
    "path": "docs/release-notes/2019.rst",
    "content": "0.41.0 (2019-12-18)\n*******************\n\nSecurity notice\n---------------\n\n- See `CVE-2019-19844\n  <https://www.djangoproject.com/weblog/2019/dec/18/security-releases/>`_.\n\n\nNote worthy changes\n-------------------\n\n- New providers: Exist.io., YNAB, Amazon Cognito.\n\n- You can now store OAuth credentials directly in your\n  ``settings.SOCIALACCOUNT_PROVIDERS`` settings instead of storing them in the\n  database using a ``SocialApp`` record.\n\n- Adding Keycloak Provider\n\n\nBackwards incompatible changes\n------------------------------\n\n- Dropped Python 2 and Django 1 compatibility.\n\n\n0.40.0 (2019-08-29)\n*******************\n\nNote worthy changes\n-------------------\n\n- The ``instagram`` provider now extracts the user's full name.\n\n- New provider: NextCloud (OAuth2)\n\n- Added an ``SDK_URL`` setting for customizing the loading of the Facebook\n  JavaScript SDK.\n\n- Updated Twitch provider to use new authentication endpoints\n  (``https://id.twitch.tv``) over deprecated v5 endpoints\n  (``https://api.twitch.tv/kraken``)\n\n- Added support for Patreon API v2, with API v1 set as default for\n  backwards compatibility.\n\n\nBackwards incompatible changes\n------------------------------\n\n- ``Twitch``: The new API's profile data is different in both\n  structure and content than the old V5 endpoint. Any project\n  that relies on data from ``SocialAccount.extra_data`` should\n  refer to the new API user endpoint documentation:\n  https://dev.twitch.tv/docs/api/reference/#get-users\n\n\n0.39.1 (2019-02-28)\n*******************\n\nNote worthy changes\n-------------------\n\n- The ``linkedin_oauth2`` provider now gracefully deals with old V1\n  data that might still be present in ``SocialAccount.extra_data``.\n\nBackwards incompatible changes\n------------------------------\n\n- The ``globus`` provider's ``extract_uid`` now uses the openid\n  required field ``sub`` instead of the ``create_time`` field.\n\n\n0.39.0 (2019-02-26)\n*******************\n\nNote worthy changes\n-------------------\n\n- New providers: JupyterHub (OAuth2), Steam (OpenID)\n\n- Refactor translations: Portuguese (Portugal).\n\n- Add testing for Django 2.2 (no code changes required)\n\nBackwards incompatible changes\n------------------------------\n\n- ``linkedin_oauth2``: As the LinkedIn V1 API is deprecated, the user info\n  endpoint has been moved over to use the API V2. The format of the user\n  ``extra_data`` is different and the profile picture is absent by default.\n"
  },
  {
    "path": "docs/release-notes/2020.rst",
    "content": "0.44.0 (2020-11-25)\n*******************\n\nSecurity notice\n---------------\n\nIn previous versions, the mechanism to prevent too many failed login attempts\n(``ACCOUNT_LOGIN_ATTEMPTS_LIMIT``) could be bypassed by changing the casing of\nthe login.\n\n\nBackwards incompatible changes\n------------------------------\n\n- The ``certificate`` key part of the ``SOCIALACCOUNT_PROVIDERS`` configuration has\n  been renamed to ``certificate_key``. This is done to prevent the key from being displayed\n  without being masked in Django debug pages.\n\n\n0.43.0 (2020-10-15)\n*******************\n\nNote worthy changes\n-------------------\n\n- New translation: Slovenian.\n\n- If ``ACCOUNT_LOGIN_ATTEMPTS_LIMIT`` is set and the user successfully\n  resets their password, the timeout is cleared to allow immediate login.\n\n- You can now limit the amount of email addresses a user can associate to his\n  account by setting ``ACCOUNT_MAX_EMAIL_ADDRESSES``.\n\n- New providers: Apple, Okta, Stocktwits, Zoho, Zoom.\n\n- If email verification is set to mandatory, the email address you use to login\n  with must now be verified as well. In previous versions, it was sufficient if\n  the account had at least one verified email address, not necessarily the one\n  used to login with.\n\n- Added a new setting: ``ACCOUNT_SIGNUP_REDIRECT_URL`` -- the URL (or URL\n  name) to redirect to directly after signing up.\n\n\nBackwards incompatible changes\n------------------------------\n\n- In previous versions, the ``allauth`` app included a ``base.html``\n  template. This template could conflict with an equally named template at\n  project level. Therefore, ``base.html`` has now been moved to\n  ``account/base.html`` -- you will need to check your templates and likely\n  override ``account/base.html`` within your project.\n\n\n0.42.0 (2020-05-24)\n*******************\n\nNote worthy changes\n-------------------\n\n- New providers: EDX, Yandex, Mixer.\n\n- Fixed Twitch ``get_avatar_url()`` method to use the profile picture retrieved\n  by new user details endpoint introduced in version 0.40.0.\n\n- The Facebook API version now defaults to v7.0.\n"
  },
  {
    "path": "docs/release-notes/2021.rst",
    "content": "0.47.0 (2021-12-09)\n*******************\n\nNote worthy changes\n-------------------\n\n- New providers: Gumroad.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Added a new setting ``SOCIALACCOUNT_LOGIN_ON_GET`` that controls whether or not\n  the endpoints for initiating a social login (for example,\n  \"/accounts/google/login/\") require a POST request to initiate the\n  handshake. As requiring a POST is more secure, the default of this new setting\n  is ``False``.\n\n\nSecurity notice\n---------------\n\nAutomatically signing in users into their account and connecting additional\nthird party accounts via a simple redirect (\"/accounts/facebook/login/\") can\nlead to unexpected results and become a security issue especially when the\nredirect is triggered from a malicious web site. For example, if an attacker\nprepares a malicious website that (ab)uses the Facebook password recovery\nmechanism to first sign into his/her own Facebook account, followed by a\nredirect to connect a new social account, you may end up with the attacker's\nFacebook account added to the account of the victim. To mitigate this,\n``SOCIALACCOUNT_LOGIN_ON_GET`` is introduced.\n\n\n0.46.0 (2021-11-15)\n*******************\n\nNote worthy changes\n-------------------\n\n- New providers: Gitea, MediaWiki.\n\n- New translations: Georgian, Mongolian.\n\n- Django 3.2 compatibility.\n\n\n0.45.0 (2021-07-11)\n*******************\n\n\nNote worthy changes\n-------------------\n\n- New providers: Feishu, NetIQ, Frontier, CILogin.\n"
  },
  {
    "path": "docs/release-notes/2022.rst",
    "content": "0.52.0 (2022-12-29)\n*******************\n\nNote worthy changes\n-------------------\n\n- Officially support Django 4.1.\n\n- New providers: OpenID Connect, Twitter (OAuth2), Wahoo, DingTalk.\n\n- Introduced a new provider setting ``OAUTH_PKCE_ENABLED`` that enables the\n  PKCE-enhanced Authorization Code Flow for OAuth 2.0 providers.\n\n- When ``ACCOUNT_PREVENT_ENUMERATION`` is turned on, enumeration is now also\n  prevented during signup, provided you are using mandatory email\n  verification. There is a new email template\n  (`templates/account/email/acccount_already_exists_message.txt`) that will be\n  used in this scenario.\n\n- Updated URLs of Google's endpoints to the latest version; removed a redundant\n  ``userinfo`` call.\n\n- Fixed Pinterest provider on new api version.\n\n\n0.51.0 (2022-06-07)\n*******************\n\nNote worthy changes\n-------------------\n\n- New providers: Snapchat, Hubspot, Pocket, Clever.\n\n\nSecurity notice\n---------------\n\nThe reset password form is protected by rate limits. There is a limit per IP,\nand per email. In previous versions, the latter rate limit could be bypassed by\nchanging the casing of the email address. Note that in that case, the former\nrate limit would still kick in.\n\n\n0.50.0 (2022-03-25)\n*******************\n\nNote worthy changes\n-------------------\n\n- Fixed compatibility issue with setuptools 61.\n\n- New providers: Drip.\n\n- The Facebook API version now defaults to v13.0.\n\n\n0.49.0 (2022-02-22)\n*******************\n\nNote worthy changes\n-------------------\n\n- New providers: LemonLDAP::NG.\n\n- Fixed ``SignupForm`` setting username and email attributes on the ``User`` class\n  instead of a dummy user instance.\n\n- Email addresses POST'ed to the email management view (done in order to resend\n  the confirmation email) were not properly validated. Yet, these email\n  addresses were still added as secondary email addresses. Given the lack of\n  proper validation, invalid email addresses could have entered the database.\n\n- New translations: Romanian.\n\n\nBackwards incompatible changes\n------------------------------\n\n- The Microsoft ``tenant`` setting must now be specified using uppercase ``TENANT``.\n\n- Changed naming of ``internal_reset_url_key`` attribute in\n  ``allauth.account.views.PasswordResetFromKeyView`` to ``reset_url_key``.\n\n\n0.48.0 (2022-02-03)\n*******************\n\nNote worthy changes\n-------------------\n- New translations: Catalan, Bulgarian.\n\n- Introduced a new setting ``ACCOUNT_PREVENT_ENUMERATION`` that controls whether\n  or not information is revealed about whether or not a user account exists.\n  **Warning**: this is a work in progress, password reset is covered, yet,\n  signing up is not.\n\n- The ``ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN`` is now also respected when using\n  HMAC based email confirmations. In earlier versions, users could trigger email\n  verification mails without any limits.\n\n- Added builtin rate limiting (see ``ACCOUNT_RATE_LIMITS``).\n\n- Added ``internal_reset_url_key`` attribute in\n  ``allauth.account.views.PasswordResetFromKeyView`` which allows specifying\n  a token parameter displayed as a component of password reset URLs.\n\n- It is now possible to use allauth without having ``sites`` installed. Whether or\n  not sites is used affects the data models. For example, the social app model\n  uses a many-to-many pointing to the sites model if the ``sites`` app is\n  installed. Therefore, enabling or disabling ``sites`` is not something you can\n  do on the fly.\n\n- The ``facebook`` provider no longer raises ``ImproperlyConfigured``\n  within ``{% providers_media_js %}`` when it is not configured.\n\n\nBackwards incompatible changes\n------------------------------\n\n- The newly introduced ``ACCOUNT_PREVENT_ENUMERATION`` defaults to ``True`` impacting\n  the current behavior of the password reset flow.\n\n- The newly introduced rate limiting is by default turned on. You will need to provide\n  a ``429.html`` template.\n\n- The default of ``SOCIALACCOUNT_STORE_TOKENS`` has been changed to\n  ``False``. Rationale is that storing sensitive information should be opt in, not\n  opt out. If you were relying on this functionality without having it\n  explicitly turned on, please add it to your ``settings.py``.\n"
  },
  {
    "path": "docs/release-notes/2023.rst",
    "content": "0.59.0 (2023-12-13)\n*******************\n\nNote worthy changes\n-------------------\n\n- The MFA authenticator model now features \"created at\" an \"last used \"at\"\n  timestamps.\n\n- The MFA authenticator model is now registered with the Django admin.\n\n- Added MFA signals emitted when authenticators are added, removed or (in case\n  of recovery codes) reset.\n\n- There is now an MFA adapter method ``can_delete_authenticator(authenticator)``\n  available that can be used to prevent users from deactivating e.g. their TOTP\n  authenticator.\n\n- Added a new app, user sessions, allowing users to view a list of all their\n  active sessions, as well as offering a means to end these sessions.\n\n- A configurable timeout (``SOCIALACCOUNT_REQUESTS_TIMEOUT``) is now applied to\n  all upstream requests.\n\n- Added a setting ``ACCOUNT_EMAIL_UNKNOWN_ACCOUNTS`` to disable sending of\n  emails to unknown accounts.\n\n- You can now override the MFA forms via the ``MFA_FORMS`` setting.\n\n\nBackwards incompatible changes\n------------------------------\n\n- The account adapter method ``should_send_confirmation_mail()`` signature\n  changed. It now takes an extra ``signup`` (boolean) parameter.\n\n- Removed OAuth 1.0 based Bitbucket provider and LinkedIn provider.\n\n\n0.58.2 (2023-11-06)\n*******************\n\nFixes\n-----\n\n- Added rate limiting to the MFA login form.\n\n\n0.58.1 (2023-10-29)\n*******************\n\nFixes\n-----\n\n- Fixed missing ``{% load allauth %}`` in the login cancelled and verified email\n  required template.\n\n\n0.58.0 (2023-10-26)\n*******************\n\nNote worthy changes\n-------------------\n\n- The ``SocialAccount.extra_data`` field was a custom JSON field that used\n  ``TextField`` as the underlying implementation. It was once needed because\n  Django had no ``JSONField`` support. Now, this field is changed to use the\n  official ``JSONField()``. Migrations are in place.\n\n- Officially support Django 5.0.\n\n- In previous versions, users could never remove their primary email address.\n  This is constraint is now relaxed. In case the email address is not required,\n  for example, because the user logs in by username, removal of the email\n  address is allowed.\n\n- Added a new setting ``ACCOUNT_REAUTHENTICATION_REQUIRED`` that, when enabled,\n  requires the user to reauthenticate before changes (such as changing the\n  primary email address, adding a new email address, etc.) can be performed.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Refactored the built-in templates, with the goal of being able to adjust the\n  look and feel of the whole project by only overriding a few core templates.\n  This approach allows you to achieve visual results fast, but is of course more\n  limited compared to styling all templates yourself. If your project provided\n  its own templates then this change will not affect anything, but if you rely\n  on (some of) the built-in templates your project may be affected.\n\n- The Azure provider has been removed in favor of keeping the Microsoft\n  provider. Both providers were targeting the same goal.\n\n\nSecurity notice\n---------------\n\n- Facebook: Using the JS SDK flow, it was possible to post valid access tokens\n  originating from other apps. Facebook user IDs are scoped per app. By default\n  that user ID (not the email address) is used as key while\n  authenticating. Therefore, such access tokens can not be abused by\n  default. However, in case ``SOCIALACCOUNT_EMAIL_AUTHENTICATION`` was\n  explicitly enabled for the Facebook provider, these tokens could be used to\n  login.\n\n\n0.57.0 (2023-09-24)\n*******************\n\nNote worthy changes\n-------------------\n\n- Added Django password validation help text to ``password1`` on\n  set/change/signup forms.\n\n- Microsoft: the tenant parameter can now be configured per app.\n\n- SAML: Added support for additional configuration parameters, such as contacts,\n  and support for certificate rotation.\n\n- The enumeration prevention behavior at signup is now configurable. Whether or\n  not enumeration can be prevented during signup depends on the email\n  verification method. In case of mandatory verification, enumeration can be\n  properly prevented because the case where an email address is already taken is\n  indistinguishable from the case where it is not.  However, in case of optional\n  or disabled email verification, enumeration can only be prevented by allowing\n  the signup to go through, resulting in multiple accounts sharing same email\n  address (although only one of the accounts can ever have it verified). When\n  enumeration is set to ``True``, email address uniqueness takes precedence over\n  enumeration prevention, and the issue of multiple accounts having the same\n  email address will be avoided, thus leaking information. Set it to\n  ``\"strict\"`` to allow for signups to go through.\n\n\nFixes\n=====\n\n- Fixed ``?next=`` URL handling in the SAML provider.\n\n- During 2FA, pending logins were incorrectly removed when e.g. Django was asked\n  to serve a ``/favicon.ico`` URL.\n\n\n0.56.1 (2023-09-08)\n*******************\n\nSecurity notice\n---------------\n\n- ``ImmediateHttpResponse`` exceptions were not handled properly when raised\n  inside ``adapter.pre_login()``.  If you relied on aborting the login using\n  this mechanism, that would not work. Most notably, django-allauth-2fa uses\n  this approach, resulting in 2FA not being triggered.\n\n\n0.56.0 (2023-09-07)\n*******************\n\nNote worthy changes\n-------------------\n\n- Added builtin support for Two-Factor Authentication via the ``allauth.mfa`` app.\n\n- The fact that ``request`` is not available globally has left its mark on the\n  code over the years. Some functions get explicitly passed a request, some do\n  not, and some constructs have it available both as a parameter and as\n  ``self.request``.  As having request available is essential, especially when\n  trying to implement adapter hooks, the request has now been made globally\n  available via::\n\n    from allauth.core import context\n    context.request\n\n- Previously, ``SOCIALACCOUNT_STORE_TOKENS = True`` did not work when the social\n  app was configured in the settings instead of in the database. Now, this\n  functionality works regardless of how you configure the app.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Dropped support for Django 3.1.\n\n- The ``\"allauth.account.middleware.AccountMiddleware\"`` middleware is required\n  to be present in your ``settings.MIDDLEWARE``.\n\n- Starting from September 1st 2023, CERN upgraded their SSO to a standard OpenID\n  Connect based solution. As a result, the previously builtin CERN provider is\n  no longer needed and has been removed. Instead, use the regular OpenID Connect\n  configuration::\n\n    SOCIALACCOUNT_PROVIDERS = {\n        \"openid_connect\": {\n            \"APPS\": [\n                {\n                    \"provider_id\": \"cern\",\n                    \"name\": \"CERN\",\n                    \"client_id\": \"<insert-id>\",\n                    \"secret\": \"<insert-secret>\",\n                    \"settings\": {\n                        \"server_url\": \"https://auth.cern.ch/auth/realms/cern/.well-known/openid-configuration\",\n                    },\n                }\n            ]\n        }\n    }\n\n- The Keycloak provider was added before the OpenID Connect functionality\n  landed. Afterwards, the Keycloak implementation was refactored to reuse the\n  regular OIDC provider. As this approach led to bugs (see 0.55.1), it was\n  decided to remove the Keycloak implementation altogether.  Instead, use the\n  regular OpenID Connect configuration::\n\n    SOCIALACCOUNT_PROVIDERS = {\n        \"openid_connect\": {\n            \"APPS\": [\n                {\n                    \"provider_id\": \"keycloak\",\n                    \"name\": \"Keycloak\",\n                    \"client_id\": \"<insert-id>\",\n                    \"secret\": \"<insert-secret>\",\n                    \"settings\": {\n                        \"server_url\": \"http://keycloak:8080/realms/master/.well-known/openid-configuration\",\n                    },\n                }\n            ]\n        }\n    }\n\n\n0.55.2 (2023-08-30)\n*******************\n\nFixes\n-----\n\n- Email confirmation: An attribute error could occur when following invalid\n  email confirmation links.\n\n\n0.55.1 (2023-08-30)\n*******************\n\nFixes\n-----\n\n- SAML: the lookup of the app (``SocialApp``) was working correctly for apps\n  configured via the settings, but failed when the app was configured via the\n  Django admin.\n\n- Keycloak: fixed reversal of the callback URL, which was reversed using\n  ``\"openid_connect_callback\"`` instead of ``\"keycloak_callback\"``. Although the\n  resulting URL is the same, it results in a ``NoReverseMatch`` error when\n  ``allauth.socialaccount.providers.openid_connect`` is not present in\n  ``INSTALLED_APPS``.\n\n\n0.55.0 (2023-08-22)\n*******************\n\nNote worthy changes\n-------------------\n\n- Introduced a new setting ``ACCOUNT_PASSWORD_RESET_TOKEN_GENERATOR`` that\n  allows you to specify the token generator for password resets.\n\n- Dropped support for Django 2.x and 3.0.\n\n- Officially support Django 4.2.\n\n- New providers: Miro, Questrade\n\n- It is now possible to manage OpenID Connect providers via the Django\n  admin. Simply add a `SocialApp` for each OpenID Connect provider.\n\n- There is now a new flow for changing the email address. When enabled\n  (``ACCOUNT_CHANGE_EMAIL``), users are limited to having exactly one email\n  address that they can change by adding a temporary second email address that,\n  when verified, replaces the current email address.\n\n- Changed spelling from \"e-mail\" to \"email\". Both are correct, however, the\n  trend over the years has been towards the simpler and more streamlined form\n  \"email\".\n\n- Added support for SAML 2.0. Thanks to `Dskrpt <https://dskrpt.de>`_\n  for sponsoring the development of this feature!\n\n- Fixed Twitter OAuth2 authentication by using basic auth and adding scope `tweet.read`.\n\n- Added (optional) support for authentication by email for social logins (see\n  ``SOCIALACCOUNT_EMAIL_AUTHENTICATION``).\n\n\nSecurity notice\n---------------\n\n- Even with account enumeration prevention in place, it was possible for a user\n  to infer whether or not a given account exists based by trying to add\n  secondary email addresses .  This has been fixed -- see the note on backwards\n  incompatible changes.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Data model changes: when ``ACCOUNT_UNIQUE_EMAIL=True`` (the default), there\n  was a unique constraint on set on the ``email`` field of the ``EmailAddress``\n  model. This constraint has been relaxed, now there is a unique constraint on\n  the combination of ``email`` and ``verified=True``. Migrations are in place to\n  automatically transition, but if you have a lot of accounts, you may need to\n  take special care using ``CREATE INDEX CONCURRENTLY``.\n\n- The method ``allauth.utils.email_address_exists()`` has been removed.\n\n- The Mozilla Persona provider has been removed. The project was shut down on\n  November 30th 2016.\n\n- A large internal refactor has been performed to be able to add support for\n  providers oferring one or more subproviders. This refactor has the following\n  impact:\n\n  - The provider registry methods ``get_list()``, ``by_id()`` have been\n    removed. The registry now only providers access to the provider classes, not\n    the instances.\n\n  - ``provider.get_app()`` has been removed -- use ``provider.app`` instead.\n\n  - ``SocialApp.objects.get_current()`` has been removed.\n\n  - The ``SocialApp`` model now has additional fields ``provider_id``, and\n    ``settings``.\n\n  - The OpenID Connect provider ``SOCIALACCOUNT_PROVIDERS`` settings structure\n    changed.  Instead of the OpenID Connect specific ``SERVERS`` construct, it\n    now uses the regular ``APPS`` approach. Please refer to the OpenID Connect\n    provider documentation for details.\n\n  - The Telegram provider settings structure, it now requires to app. Please\n    refer to the Telegram provider documentation for details.\n\n- The Facebook provider loaded the Facebook connect ``sdk.js`` regardless of the\n  value of the ``METHOD`` setting. To prevent tracking, now it only loads the\n  Javascript if ``METHOD`` is explicitly set to ``\"js_sdk\"``.\n\n\n\n0.54.0 (2023-03-31)\n*******************\n\nNote worthy changes\n-------------------\n\n- Dropped support for EOL Python versions (3.5, 3.6).\n\n\nSecurity notice\n---------------\n\n- Even when account enumeration prevention was turned on, it was possible for an\n  attacker to infer whether or not a given account exists based upon the\n  response time of an authentication attempt. Fixed.\n\n\n0.53.1 (2023-03-20)\n*******************\n\nNote worthy changes\n-------------------\n\n- Example base template was missing ``{% load i18n %}``, fixed.\n\n\n0.53.0 (2023-03-16)\n*******************\n\nNote worthy changes\n-------------------\n\n- You can now override the use of the ``UserTokenForm`` over at the\n  ``PasswordResetFromKeyView`` by configuring ``ACCOUNT_FORMS[\"user_token\"]`` to\n  allow the change of the password reset token generator.\n\n- The Google API URLs are now configurable via the provider setting which\n  enables use-cases such as overriding the endpoint during integration tests to\n  talk to a mocked version of the API.\n"
  },
  {
    "path": "docs/release-notes/2024.rst",
    "content": "65.3.1 (2024-12-25)\n*******************\n\nFixes\n-----\n\n- Headless: When using email verification by code, you could incorrectly\n  encounter a 409 when attempting to add a new email address while logged in.\n\n- Headless: In contrast to the headed version, it was possible to remove the\n  last 3rd party account from a user that has no usable password. Fixed.\n\n- Headless: The setting ``ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION`` was not respected,\n  and always assumed to be ``True``.\n\n\n65.3.0 (2024-11-30)\n*******************\n\nNote worthy changes\n-------------------\n\n- Added support for TOTP code tolerance (see ``MFA_TOTP_TOLERANCE``).\n\n\nSecurity notice\n---------------\n\n- Authentication by email/password was vulnerable to account enumeration by\n  means of a timing attack. Thanks to Julie Rymer for the report and the patch.\n\n\n65.2.0 (2024-11-08)\n*******************\n\nNote worthy changes\n-------------------\n\n- OIDC: You can now configure whether or not PKCE is enabled per app by\n  including ``\"oauth_pkce_enabled\": True`` in the app settings.\n\n- The OpenStreetMap provider is deprecated. You can set it up as an OpenID Connect provider instead.\n\n\nFixes\n-----\n\n- A ``NoReverseMatch`` could occur when using ``ACCOUNT_LOGIN_BY_CODE_REQUIRED =\n  True`` while ``ACCOUNT_LOGIN_BY_CODE_ENABLED = False``, fixed.\n\n- The ``PasswordResetDoneView`` did not behave correctly when using Django's\n  ``LoginRequiredMiddleware``, as it was not properly marked as\n  ``@login_not_required``.\n\n- When verifying an email address by code, the success URL was hardcoded to the\n  email management view, instead of calling the\n  ``get_email_verification_redirect_url()`` adapter method.\n\n\nSecurity notice\n---------------\n\n- Headless: ``settings.ACCOUNT_EMAIL_VERIFICATION_BY_CODE_MAX_ATTEMPTS`` was not\n  enforced, fixed.  Note that the related verification endpoint will return a\n  409 in case the maximum limit is exceeded, as at that point the pending email\n  verification stage is aborted.\n\n\n65.1.0 (2024-10-23)\n*******************\n\nNote worthy changes\n-------------------\n\n- OAuth2/OIDC: When setting up multiple apps for the same provider, you can now\n  configure a different scope per app by including ``\"scope\": [...]`` in the app\n  settings.\n\n- Facebook login: Facebook `Limited Login\n  <https://developers.facebook.com/docs/facebook-login/limited-login>`_ is now\n  supported via the Headless API. When you have a Limited Login JWT obtained\n  from the iOS SDK, you can use the Headless \"provider token\" flow to login with\n  it.\n\n\nFixes\n-----\n\n- When using ``HEADLESS_ONLY = True`` together with\n  ``ACCOUNT_REAUTHENTICATION_REQUIRED = True``, you could run into a\n  ``NoReverseMatch`` when connecting a social acount. Fixed.\n\n- In headless mode, submitting a login code when the login flow expired resulted\n  in a 500. Fixed -- it now returns a 409.\n\n\n65.0.2 (2024-09-27)\n*******************\n\nFixes\n-----\n\n- A regression occurred in the newly introduced support using\n  ``LoginRequiredMiddleware``, fixed.\n\n- For email verification by link, it is not an issue if the user runs into rate\n  limits. The reason is that the link is session independent. Therefore, if the\n  user hits rate limits, we can just silently skip sending additional\n  verification emails, as the previous emails that were already sent still\n  contain valid links. This is different from email verification by code.  Here,\n  the session contains a specific code, meaning, silently skipping new\n  verification emails is not an option, and we must block the login instead. The\n  latter was missing, fixed.\n\n\n65.0.1 (2024-09-23)\n*******************\n\nFixes\n-----\n\n- When email verification by code was used, adding additional email addresses\n  over at the email management page fired the ``email_added`` signal prematurely\n  as the email address instance was still unsaved. Fixed.\n\n- The newly introduced logic to redirect to pending login stages has now been\n  integrated in the ``RedirectAuthenticatedUserMixin`` so that the existing\n  behavior of invoking ``get_authenticated_redirect_url()`` when already\n  authenticated is respected.\n\n\n65.0.0 (2024-09-22)\n*******************\n\nNote worthy changes\n-------------------\n\n- Added transparent support for Django's ``LoginRequiredMiddleware`` (new since\n  Django 5.1).\n\n- The ``usersessions`` app now emits signals when either the IP address or user\n  agent for a session changes.\n\n- Added support for signup using a passkey. See\n  ``settings.MFA_PASSKEY_SIGNUP_ENABLED``.\n\n\nBackwards incompatible changes\n------------------------------\n\n- When the user is partially logged in (e.g. pending 2FA, or login by code),\n  accessing the login/signup page now redirects to the pending login stage. This\n  is similar to the redirect that was already in place when the user was fully\n  authenticated while accessing the login/signup page. As a result, cancelling\n  (logging out of) the pending stage requires an actual logout POST instead of\n  merely linking back to e.g. the login page. The builtin templates handle this\n  change transparently, but if you copied any of the templates involving the\n  login stages you will have to adjust the cancel link into a logout POST.\n\n\n64.2.1 (2024-09-05)\n*******************\n\nFixes\n-----\n\n- Verifying the email address by clicking on the link would no longer log you in, even\n  in case of ``ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = True``.\n\n\nSecurity notice\n---------------\n\n- It was already the case that you could not enable TOTP 2FA if your account had\n  unverified email addresses. This is necessary to stop a user from claiming\n  email addresses and locking other users out. This safety check is now added to\n  WebAuthn security keys as well.\n\n- In case a user signs in into an account using social account email\n  authentication (``SOCIALACCOUNT_EMAIL_AUTHENTICATION``) and the email used is\n  not verified, the password of the account is now wiped (made unusable) to\n  prevent the person that created the account (without verifying it) from\n  signing in.\n\n\n64.2.0 (2024-08-30)\n*******************\n\nNote worthy changes\n-------------------\n\n- Verifying email addresses by means of a code (instead of a link) is now supported.\n  See ``settings.ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED``.\n\n- Added support for requiring logging in by code, so that every user logging in\n  is required to input a login confirmation code sent by email. See\n  ``settings.ACCOUNT_LOGIN_BY_CODE_REQUIRED``.\n\n\nSecurity notice\n---------------\n\n- In case an ID token is used for authentication, the JTI is now respected to\n  prevent the possibility of replays instead of solely relying on the expiration\n  time.\n\n\n64.1.0 (2024-08-15)\n*******************\n\nNote worthy changes\n-------------------\n\n- Headless: When trying to login while a user is already logged in, you now get\n  a 409.\n\n- Limited the maximum allowed time for a login to go through the various login\n  stages. This limits, for example, the time span that the 2FA stage remains\n  available. See ``settings.ACCOUNT_LOGIN_TIMEOUT``.\n\n\nSecurity notice\n---------------\n\n- Headless: When a user was not fully logged in, for example, because (s)he was\n  in the process of completing the 2FA process, calling logout would not wipe\n  the session containing the partially logged in user.\n\n\n64.0.0 (2024-07-31)\n*******************\n\nNote worthy changes\n-------------------\n\n- The 0.x.y version numbers really did not do justice to the state of the\n  project, and we are way past the point where a version 1.0 would be\n  applicable. Additionally, 64 is a nice round number. Therefore, the version\n  numbering is changed from 0.x.y to x.y.z. We will use a loose form of semantic\n  versioning. However, please be aware that feature releases may occasionally\n  include minor documented backwards incompatibilities. Always read the release\n  notes before upgrading.\n\n- Added support for WebAuthn based security keys and passkey login. Note that\n  this is currently disabled by default.\n\n- Headless: The TOTP URI is now available in the MFA activation response.\n\n- Headless: When trying to sign up while a user is already logged in, you now get\n  a 409.\n\n- Headless: You can now alter the user data payload by overriding the newly\n  introduced ``serialize_user()`` adapter method.\n\n- Headless: The token strategy now allows for exposing refresh tokens and any\n  other information you may need (such as e.g. ``expires_in``).\n\n- Ensured that email address, given name and family name fields are stored in\n  the SocialAccount instance. This information was not previously saved in\n  Amazon Cognito, Edmodo, and MediaWiki SocialAccount instances.\n\n- When multiple third-party accounts of the same provider were connected, the\n  third-party account connections overview did not always provide a clear\n  recognizable distinction between those accounts. Now, the\n  ``SocialAccount.__str__()`` has been altered to return the unique username or\n  email address, rather than a non-unique display name.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Dropped support for Django 3.2, 4.0 and 4.1 (which all reached end of life).\n  As Django 3.2 was the last to support Python 3.7, support for Python 3.7 is\n  now dropped as well.\n\n\n0.63.6 (2024-07-12)\n*******************\n\nSecurity notice\n---------------\n\n- When the Facebook provider was configured to use the ``js_sdk`` method the\n  login page could become vulnerable to an XSS attack.\n\n\n0.63.5 (2024-07-11)\n*******************\n\nFixes\n-----\n\n- The security fix in 0.63.4 that altered the ``__str__()`` of ``SocialToken``\n  caused issues within the Amazon Cognito, Atlassian, JupyterHub, LemonLDAP,\n  Nextcloud and OpenID Connect providers. Fixed.\n\n\n0.63.4 (2024-07-10)\n*******************\n\nSecurity notice\n---------------\n\n- The ``__str__()`` method of the ``SocialToken`` model returned the access\n  token. As a consequence, logging or printing tokens otherwise would expose the\n  access token. Now, the method no longer returns the token. If you want to\n  log/print tokens, you will now have to explicitly log the ``token`` field of\n  the ``SocialToken`` instance.\n\n- Enumeration prevention: the behavior on the outside of an actual signup versus\n  a signup where the user already existed was not fully identical, fixed.\n\n\n0.63.3 (2024-05-31)\n*******************\n\nNote worthy changes\n-------------------\n\n- In ``HEADLESS_ONLY`` mode, the ``/accounts/<provider>/login/`` URLs were still\n  available, fixed.\n\n- The few remaining OAuth 1.0 providers were not compatible with headless mode,\n  fixed.\n\n- Depending on where you placed the ``secure_admin_login(admin.site.login)``\n  protection you could run into circular import errors, fixed.\n\n\nBackwards incompatible changes\n------------------------------\n\n- SAML: IdP initiated SSO is disabled by default, see security notice below.\n\n\nSecurity notice\n---------------\n\n- SAML: ``RelayState`` was used to keep track of whether or not the login flow\n  was IdP or SP initiated. As ``RelayState`` is a separate field, not part of\n  the ``SAMLResponse`` payload, it is not signed and thereby making the SAML\n  login flow vulnerable to CSRF/replay attacks. Now, ``InResponseTo`` is used\n  instead, addressing the issue for SP initiated SSO flows. IdP initiated SSO\n  remains inherently insecure, by design. For that reason, it is now disabled by\n  default. If you need to support IdP initiated SSO, you will need to opt-in to\n  that by adding ``\"reject_idp_initiated_sso\": False`` to your advanced SAML\n  provider settings.\n\n\n0.63.2 (2024-05-24)\n*******************\n\nNote worthy changes\n-------------------\n\n- ``allauth.headless`` now supports the ``is_open_for_signup()`` adapter method.\n  In case signup is closed, a 403 is returned during signup.\n\n- Connecting a third-party account in ``HEADLESS_ONLY`` mode failed if the\n  connections view could not be reversed, fixed.\n\n- In case a headless attempt was made to connect a third-party account that was already\n  connected to a different account, no error was communicated to the frontend. Fixed.\n\n- When the headless provider signup endpoint was called while that flow was not pending,\n  a crash would occur. This has been fixed to return a 409 (conflict).\n\n- Microsoft provider: the URLs pointing to the login and graph API are now\n  configurable via the app settings.\n\n\n0.63.1 (2024-05-17)\n*******************\n\nNote worthy changes\n-------------------\n\n- When only ``allauth.account`` was installed, you could run into an exception\n  stating \"allauth.socialaccount not installed, yet its models are\n  imported.\". This has been fixed.\n\n- When ``SOCIALACCOUNT_EMAIL_AUTHENTICATION`` was turned on, and a user would\n  connect a third-party account for which email authentication would kick in,\n  the connect was implicitly skipped. Fixed.\n\n- The recommendation from the documentation to protect the Django admin login\n  could cause an infinite redirect loop in case of\n  ``AUTHENTICATED_LOGIN_REDIRECTS``. A decorator ``secure_admin_login()`` is now\n  offered out of the box to ensure that the Django admin is properly secured by\n  allauth (e.g. rate limits, 2FA).\n\n- Subpackages from the ``tests`` package were packaged, fixed.\n\n\n0.63.0 (2024-05-14)\n*******************\n\nNote worthy changes\n-------------------\n\n- New providers: TikTok, Lichess.\n\n- Starting since version 0.62.0, new email addresses are always stored as lower\n  case. In this version, we take the final step and also convert existing data\n  to lower case, alter the database indices and perform lookups\n  accordingly. Migrations are in place.  For rationale, see the note about email\n  case sensitivity in the documentation.\n\n- An official API for single-page and mobile application support is now\n  available, via the new ``allauth.headless`` app.\n\n- Added support for a honeypot field on the signup form. Real users do not see\n  the field and therefore leave it empty. When bots do fill out the field\n  account creation is silently skipped.\n\n\n0.62.1 (2024-04-24)\n*******************\n\n- The ``tests`` package was accidentally packaged, fixed.\n\n\n0.62.0 (2024-04-22)\n*******************\n\nNote worthy changes\n-------------------\n\n- Added a dummy provider, useful for testing purposes: ``allauth.socialaccount.providers.dummy``.\n\n- Added a new provider, Atlassian\n\n- Next URL handling been streamlined to be consistently applied. Previously, the\n  password reset, change and email confirmation views only supported the\n  ``success_url`` class-level property.\n\n- Added support for logging in by email using a special code, also known as\n  \"Magic Code Login\"\n\n- Email addresses are now always stored as lower case. For rationale, see the\n  note about email case sensitivity in the documentation.\n\n- You can now alter the ``state`` parameter that is typically passed to the\n  provider by overriding the new ``generate_state_param()`` adapter method.\n\n- The URLs were not \"hackable\". For example, while ``/accounts/login/`` is valid\n  ``/accounts/`` was not. Similarly, ``/accounts/social/connections/`` was\n  valid, but ``/accounts/social/`` resulted in a 404. This has been\n  addressed. Now, ``/accounts/`` redirects to the login or email management\n  page, depending on whether or not the user is authenticated.  All\n  ``/accounts/social/*`` URLs are now below ``/accounts/3rdparty/*``, where\n  ``/accounts/social/connections`` is moved to the top-level\n  ``/accounts/3rdparty/``.  The old endpoints still work as redirects are in\n  place.\n\n- Added a new setting, ``SOCIALACCOUNT_ONLY``, which when set to ``True``,\n  disables all functionality with respect to local accounts.\n\n- The OAuth2 handshake was not working properly in case of\n  ``SESSION_COOKIE_SAMESITE = \"Strict\"``, fixed.\n\n- Facebook: the default Graph API version is now v19.0.\n\n\nBackwards incompatible changes\n------------------------------\n\n- The django-allauth required dependencies are now more fine grained.  If you do\n  not use any of the social account functionality, a ``pip install\n  django-allauth`` will, e.g., no longer pull in dependencies for handling\n  JWT. If you are using social account functionality, install using ``pip install\n  \"django-allauth[socialaccount]\"``.  That will install the dependencies covering\n  most common providers. If you are using the Steam provider, install using ``pip\n  install django-allauth[socialaccount,steam]``.\n\n\n0.61.1 (2024-02-09)\n*******************\n\nFixes\n-----\n\n- Fixed a ``RuntimeWarning`` that could occur when running inside an async\n  environment (``'SyncToAsync' was never awaited``).\n\n\nSecurity notice\n---------------\n\n- As part of the Google OAuth handshake, an ID token is obtained by direct\n  machine to machine communication between the server running django-allauth and\n  Google. Because of this direct communication, we are allowed to skip checking\n  the token signature according to the `OpenID Connect Core 1.0 specification\n  <https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation>`_.\n  However, as django-allauth is used and built upon by third parties, this is an\n  implementation detail with security implications that is easily overlooked. To\n  mitigate potential issues, verifying the signature is now only skipped if it\n  was django-allauth that actually fetched the access token.\n\n\n0.61.0 (2024-02-07)\n*******************\n\nNote worthy changes\n-------------------\n\n- Added support for account related security notifications. When\n  ``ACCOUNT_EMAIL_NOTIFICATIONS = True``, email notifications such as \"Your\n  password was changed\", including information on user agent / IP address from where the change\n  originated, will be emailed.\n\n- Google: Starting from 0.52.0, the ``id_token`` is being used for extracting\n  user information.  To accommodate for scenario's where django-allauth is used\n  in contexts where the ``id_token`` is not posted, the provider now looks up\n  the required information from the ``/userinfo`` endpoint based on the access\n  token if the ``id_token`` is absent.\n\n\nSecurity notice\n---------------\n\n- MFA: It was possible to reuse a valid TOTP code within its time window. This\n  has now been addressed. As a result, a user can now only login once per 30\n  seconds (``MFA_TOTP_PERIOD``).\n\n\nBackwards incompatible changes\n------------------------------\n\n- The rate limit mechanism has received an update. Previously, when specifying\n  e.g. ``\"5/m\"`` it was handled implicitly whether or not that limit was per IP,\n  per user, or per action specific key. This has now been made explicit:\n  ``\"5/m/user\"`` vs ``\"5/m/ip\"`` vs ``\"5/m/key\"``. Combinations are also supported\n  now: ``\"20/m/ip,5/m/key\"`` . Additionally, the rate limit mechanism is now used\n  throughout, including email confirmation cooldown as well as limitting failed login\n  attempts.  Therefore, the ``ACCOUNT_LOGIN_ATTEMPTS_LIMIT`` and\n  ``ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN`` settings are deprecated.\n  See :doc:`Rate Limits <../account/rate_limits>` for details.\n\n\n0.60.1 (2024-01-15)\n*******************\n\nFixes\n-----\n\n- User sessions: after changing your password in case of ``ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE = False``, the list of\n  sessions woud be empty instead of showing your current session.\n\n- SAML: accessing the SLS/ACS views using a GET request would result in a crash (500).\n\n- SAML: the login view did not obey the ``SOCIALACCOUNT_LOGIN_ON_GET = False`` setting.\n\n\nBackwards incompatible changes\n------------------------------\n\n- Formally, email addresses are case sensitive because the local part (the part\n  before the \"@\") can be a case sensitive user name.  To deal with this,\n  workarounds have been in place for a long time that store email addresses in\n  their original case, while performing lookups in a case insensitive\n  style. This approach led to subtle bugs in upstream code, and also comes at a\n  performance cost (``__iexact`` lookups). The latter requires case insensitive\n  index support, which not all databases support. Re-evaluating the approach in\n  current times has led to the conclusion that the benefits do not outweigh the\n  costs.  Therefore, email addresses are now always stored as lower case, and\n  migrations are in place to address existing records.\n\n\n\n0.60.0 (2024-01-05)\n*******************\n\nNote worthy changes\n-------------------\n\n- Google One Tap Sign-In is now supported.\n\n- You can now more easily change the URL to redirect to after a successful password\n  change/set via the newly introduced ``get_password_change_redirect_url()``\n  adapter method.\n\n- You can now configure the primary key of all models by configuring\n  ``ALLAUTH_DEFAULT_AUTO_FIELD``, for example to:\n  ``\"hashid_field.HashidAutoField\"``.\n\n\nBackwards incompatible changes\n------------------------------\n\n- You can now specify the URL path prefix that is used for all OpenID Connect\n  providers using ``SOCIALACCOUNT_OPENID_CONNECT_URL_PREFIX``. By default, it is\n  set to ``\"oidc\"``, meaning, an OpenID Connect provider with provider ID\n  ``foo`` uses ``/accounts/oidc/foo/login/`` as its login URL. Set it to empty\n  (``\"\"``) to keep the previous URL structure (``/accounts/foo/login/``).\n\n- The SAML default attribute mapping for ``uid`` has been changed to only\n  include ``urn:oasis:names:tc:SAML:attribute:subject-id``. If the SAML response\n  does not contain that, it will fallback to use ``NameID``.\n"
  },
  {
    "path": "docs/release-notes/history.rst",
    "content": "2024\n****\n\n.. toctree::\n   :maxdepth: 1\n\n   2024\n\n\n2023\n****\n\n.. toctree::\n   :maxdepth: 1\n\n   2023\n\n\n2022\n****\n\n.. toctree::\n   :maxdepth: 1\n\n   2022\n\n\n2021\n****\n\n.. toctree::\n   :maxdepth: 1\n\n   2021\n\n\n2020\n****\n\n.. toctree::\n   :maxdepth: 1\n\n   2020\n\n\n2019\n****\n\n.. toctree::\n   :maxdepth: 1\n\n   2019\n\n\n2018\n****\n\n.. toctree::\n   :maxdepth: 1\n\n   2018\n\n\n2017\n****\n\n.. toctree::\n   :maxdepth: 1\n\n   2017\n\n\n2016\n****\n\n.. toctree::\n   :maxdepth: 1\n\n   2016\n\n\n2015\n****\n\n.. toctree::\n   :maxdepth: 1\n\n   2015\n\n\n2014\n****\n\n.. toctree::\n   :maxdepth: 1\n\n   2014\n\n\n2013\n****\n\n.. toctree::\n   :maxdepth: 1\n\n   2013\n\n\n2012\n****\n\n.. toctree::\n   :maxdepth: 1\n\n   2012\n"
  },
  {
    "path": "docs/release-notes/index.rst",
    "content": "=============\nRelease Notes\n=============\n\n\nRecent\n******\n\n.. toctree::\n   :maxdepth: 1\n\n   recent\n\nHistory\n*******\n\n.. toctree::\n   :maxdepth: 1\n\n   history\n"
  },
  {
    "path": "docs/release-notes/recent.rst",
    "content": ".. include:: ../../ChangeLog.rst\n"
  },
  {
    "path": "docs/requirements.txt",
    "content": "Django==4.2.16\nsphinx_rtd_theme==1.3.0\n"
  },
  {
    "path": "docs/settings.py",
    "content": "SECRET_KEY = \"psst\"\nUSE_I18N = False\nUSE_TZ = True\n\n\nMIDDLEWARE = (\n    \"django.contrib.sessions.middleware.SessionMiddleware\",\n    \"django.middleware.common.CommonMiddleware\",\n    \"django.middleware.csrf.CsrfViewMiddleware\",\n    \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n    \"django.contrib.messages.middleware.MessageMiddleware\",\n    \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n    \"allauth.account.middleware.AccountMiddleware\",\n)\n\nINSTALLED_APPS = (\n    \"django.contrib.auth\",\n    \"django.contrib.contenttypes\",\n    \"django.contrib.sessions\",\n    \"django.contrib.sites\",\n    \"django.contrib.messages\",\n    \"django.contrib.staticfiles\",\n    \"django.contrib.admin\",\n    \"django.contrib.humanize\",\n    \"allauth\",\n    \"allauth.account\",\n    \"allauth.mfa\",\n    \"allauth.socialaccount\",\n    \"allauth.usersessions\",\n    \"allauth.headless\",\n)\n\nAUTHENTICATION_BACKENDS = (\n    \"django.contrib.auth.backends.ModelBackend\",\n    \"allauth.account.auth_backends.AuthenticationBackend\",\n)\n"
  },
  {
    "path": "docs/socialaccount/adapter.rst",
    "content": "Adapter\n=======\n\n.. autoclass:: allauth.socialaccount.adapter.DefaultSocialAccountAdapter\n   :members:\n"
  },
  {
    "path": "docs/socialaccount/advanced.rst",
    "content": "Advanced Usage\n==============\n\n\nCreating and Populating User instances\n--------------------------------------\n\nThe following adapter methods can be used to intervene in how User\ninstances are created and populated with data\n\n- ``allauth.socialaccount.adapter.DefaultSocialAccountAdapter``:\n\n  - ``is_open_for_signup(self, request, socialaccount)``: The default function\n    returns that is the same as ``ACCOUNT_ADAPTER`` in ``settings.py``.\n    You can override this method by returning ``True``/``False``\n    if you want to enable/disable socialaccount signup.\n\n  - ``new_user(self, request, sociallogin)``: Instantiates a new, empty\n    ``User``.\n\n  - ``save_user(self, request, sociallogin, form=None)``: Populates and\n    saves the ``User`` instance (and related social login data). The\n    signup form is not available in case of auto signup.\n\n  - ``populate_user(self, request, sociallogin, data)``: Hook that can\n    be used to further populate the user instance\n    (``sociallogin.account.user``). Here, ``data`` is a dictionary of\n    common user properties (``first_name``, ``last_name``, ``email``,\n    ``username``, ``name``) that the provider already extracted for you.\n\n\nCustom Redirects\n----------------\n\nIf redirecting to statically configurable URLs (as specified in your\nproject settings) is not flexible enough, then you can override the\nfollowing adapter methods:\n\n- ``allauth.socialaccount.adapter.DefaultSocialAccountAdapter``:\n\n  - ``get_connect_redirect_url(self, request, socialaccount)``\n\n\nCustomizing providers\n---------------------\n\nWhen an existing provider doesn't quite meet your needs, you might find yourself\nneeding to customize a provider.\n\nThis can be achieved by subclassing an existing provider and making your changes\nthere. Providers are defined as django applications, so typically customizing one\nwill mean creating a django application in your project.  This application will contain your customized\nurls.py, views.py and provider.py files. The behaviour that can be customized is beyond\nthe scope of this documentation.\n\n.. warning::\n\n    In your ``provider.py`` file, you will need to expose the provider class\n    by having a module level attribute called ``provider_classes`` with your custom\n    classes in a list. This allows your custom provider to be registered properly\n    on the basis of the ``INSTALLED_APPS`` setting.\n\n    Be sure to use a custom id property on your provider class such that its default\n    URLs do not clash with the provider you are subclassing.\n\n.. code-block:: python\n\n    class GoogleNoDefaultScopeProvider(GoogleProvider):\n        id = 'google_no_scope'\n\n        def get_default_scope(self):\n            return []\n\n    provider_classes = [GoogleNoDefaultScopeProvider]\n\n\nChanging provider scopes\n------------------------\n\nSome projects may need more scopes than the default required for authentication purposes.\n\nScopes can be modified via ``SOCIALACCOUNT_PROVIDERS`` in your project settings.py file.\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        '<ProviderNameHere>': {\n            'SCOPE': [...]\n        }\n    }\n\nYou need to obtain the default scopes that allauth uses by\nlooking in ``allauth/socialaccount/providers/<ProviderNameHere>/provider.py``\nand look for ``def get_default_scope(self):`` method. Copy those default scopes\ninto the SCOPE list shown above.\n\nExample of adding calendar.readonly scope to Google scopes::\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'google': {\n            'SCOPE': [\n                'profile',\n                'email',\n                'openid',\n                'https://www.googleapis.com/auth/calendar.readonly'\n            ],\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/configuration.rst",
    "content": "Configuration\n=============\n\nAvailable settings:\n\n``SOCIALACCOUNT_ADAPTER`` (default: ``\"allauth.socialaccount.adapter.DefaultSocialAccountAdapter\"``)\n  Specifies the adapter class to use, allowing you to alter certain\n  default behaviour.\n\n``SOCIALACCOUNT_AUTO_SIGNUP`` (default: ``True``)\n  Attempt to bypass the signup form by using fields (e.g. username,\n  email) retrieved from the social account provider. If a conflict\n  arises due to a duplicate email address the signup form will still\n  kick in.\n\n``SOCIALACCOUNT_EMAIL_AUTHENTICATION`` (default: ``False``)\n  Consider a scenario where a social login occurs, and the social account comes\n  with a verified email address (verified by the account provider), but that\n  email address is already taken by a local user account. Additionally, assume\n  that the local user account does not have any social account connected. Now,\n  if the provider can be fully trusted, you can argue that we should treat this\n  scenario as a login to the existing local user account even if the local\n  account does not already have the social account connected, because --\n  according to the provider -- the user logging in has ownership of the email\n  address.  This is how this scenario is handled when\n  ``SOCIALACCOUNT_EMAIL_AUTHENTICATION`` is set to ``True``. As this implies\n  that an untrustworthy provider can login to any local account by fabricating\n  social account data, this setting defaults to ``False``. Only set it to\n  ``True`` if you are using providers that can be fully trusted. Instead of\n  turning this on globally, you can also turn it on selectively per provider,\n  for example::\n\n      SOCIALACCOUNT_PROVIDERS = {\n        'google': {\n            'EMAIL_AUTHENTICATION': True\n        }\n      }\n\n``SOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT`` (default: ``False``)\n  In case email authentication is applied, this setting controls whether or not\n  the social account is automatically connected to the local account. In case of\n  ``False`` the local account remains unchanged during the login. In case of\n  ``True``, the social account for which the email matched, is automatically\n  added to the list of social accounts connected to the local account. As a\n  result, even if the user were to change the email address afterwards, social\n  login would still be possible when using ``True``, but not in case of\n  ``False``.\n\n``SOCIALACCOUNT_EMAIL_VERIFICATION`` (default: ``ACCOUNT_EMAIL_VERIFICATION``)\n  As ``ACCOUNT_EMAIL_VERIFICATION``, but for social accounts.\n\n``SOCIALACCOUNT_EMAIL_REQUIRED`` (default: ``\"email*\" in ACCOUNT_SIGNUP_FIELDS``)\n  The user is required to hand over an email address when signing up\n  using a social account.\n\n``SOCIALACCOUNT_FORMS``\n  Used to override forms. Defaults to::\n\n    SOCIALACCOUNT_FORMS = {\n        'disconnect': 'allauth.socialaccount.forms.DisconnectForm',\n        'signup': 'allauth.socialaccount.forms.SignupForm',\n    }\n\n``SOCIALACCOUNT_LOGIN_ON_GET`` (default: ``False``)\n  Controls whether or not the endpoints for initiating a social login (for\n  example, \"/accounts/google/login/\") require a POST request to initiate the\n  handshake. For security considerations, it is strongly recommended to\n  require POST requests.\n\n``SOCIALACCOUNT_PROVIDERS`` (default: ``{}``)\n  Dictionary containing `provider specific settings <provider_configuration.html>`__.\n\n``SOCIALACCOUNT_REQUESTS_TIMEOUT`` (default: ``5``)\n  The timeout applied when performing upstream requests.\n\n``SOCIALACCOUNT_QUERY_EMAIL`` (default: ``\"email*\" in ACCOUNT_SIGNUP_FIELDS``)\n  Request email address from 3rd party account provider? E.g. using\n  OpenID AX, or the Facebook \"email\" permission.\n\n``SOCIALACCOUNT_SOCIALACCOUNT_STR`` (default: ``str`` of user object)\n  Used to override the str value for the SocialAccount model.\n\n  Must be a function accepting a single parameter for the socialaccount object.\n\n``SOCIALACCOUNT_STORE_TOKENS`` (default: ``False``)\n  Indicates whether or not the access tokens are stored in the database. Note that\n  tokens can only be stored if the related social account is stored as well, which\n  is not the case when you are using ``SOCIALACCOUNT_EMAIL_AUTHENTICATION`` without\n  ``SOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT``.\n\n``SOCIALACCOUNT_ONLY`` (default: ``False``)\n  When enabled (``True``), all functionality with regard to local accounts is\n  disabled, and users will only be able to authenticate using third-party\n  providers.\n\n``SOCIALACCOUNT_OPENID_CONNECT_URL_PREFIX`` (default: ``\"oidc\"``)\n  The URL path prefix that is used for all OpenID Connect providers. By default,\n  it is set to ``\"oidc\"``, meaning, an OpenID Connect provider with provider ID\n  ``foo`` uses ``/accounts/oidc/foo/login/`` as its login URL.\n"
  },
  {
    "path": "docs/socialaccount/forms.rst",
    "content": "Forms\n=====\n\nSignup\n******\n\n*Path*:\n  ``allauth.socialaccount.forms.SignupForm``\n\n*Used on*:\n  ``socialaccount_signup`` view used when a user initially signs up\n  with a social account and needs to create an account.\n\nExample override::\n\n    from allauth.socialaccount.forms import SignupForm\n    class MyCustomSocialSignupForm(SignupForm):\n\n        def save(self, request):\n\n            # Ensure you call the parent class's save.\n            # .save() returns a User object.\n            user = super().save(request)\n\n            # Add your own processing here.\n\n            # You must return the original result.\n            return user\n\nYou have access to the following:\n\n- ``self.socialaccount``\n\n``settings.py``::\n\n    SOCIALACCOUNT_FORMS = {'signup': 'mysite.forms.MyCustomSocialSignupForm'}\n\nDisconnect\n**********\n\n*Path*:\n  ``allauth.socialaccount.forms.DisconnectForm``\n*Used on*:\n  ``socialaccount_connections`` view, used when removing a social account.\n\nExample override::\n\n    from allauth.socialaccount.forms import DisconnectForm\n    class MyCustomSocialDisconnectForm(DisconnectForm):\n\n        def save(self):\n\n            # Add your own processing here if you do need access to the\n            # socialaccount being deleted.\n\n            # Ensure you call the parent class's save.\n            # .save() does not return anything\n            super().save()\n\n            # Add your own processing here if you don't need access to the\n            # socialaccount being deleted.\n\nYou have access to the following:\n\n- ``self.request`` is the request object\n- ``self.accounts`` is a list containing all of the user's SocialAccount objects.\n- ``self.cleaned_data['account']`` contains the socialaccount being deleted. ``.save()``\n  issues the delete. So if you need access to the socialaccount beforehand, move your\n  code before ``.save()``.\n\n``settings.py``::\n\n    SOCIALACCOUNT_FORMS = {'disconnect': 'mysite.forms.MyCustomSocialDisconnectForm'}\n"
  },
  {
    "path": "docs/socialaccount/index.rst",
    "content": "Third-Party (\"Social\") Accounts\n===============================\n\n.. toctree::\n   :maxdepth: 1\n\n   introduction\n   configuration\n   provider_configuration\n   views\n   templates\n   forms\n   signals\n   providers/index\n   adapter\n   advanced\n"
  },
  {
    "path": "docs/socialaccount/introduction.rst",
    "content": "Introduction\n============\n\nA third-party (\"social\") account is a user account where authentication is\ndelegated to an external identity provider. The ``allauth.socialaccount`` app is\nresponsible for managing social accounts. It supports:\n\n- Connecting one or more social accounts to a local/regular account\n\n- Disconnecting a social account -- requires setting a password if\n  only the local account remains\n\n- Optional instant-signup for social accounts -- no questions asked\n\nNote that in order to use this functionality you need to install the ``socialaccount``\nextras of the ``django-allauth`` package::\n\n  pip install \"django-allauth[socialaccount]\"\n"
  },
  {
    "path": "docs/socialaccount/provider_configuration.rst",
    "content": "Provider Configuration\n======================\n\nProviders typically require various configuration parameters before your users\ncan authenticate with them. For example, for a regular OAuth provider you first\nneed to setup an OAuth app over on the provider developer portal. Then, you need\nto configure the resulting client ID and client secret in your application.\n\nEven though providers with other protocols may use different terminology, the\noverall idea remains the same. Throughout allauth the term \"social app\" (\"app\"\nfor short) refers to the unit of configuration of a provider. You provide the\napp configuration either in your project ``settings.py``, or, by means of\nsetting up ``SocialApp`` instances via the Django admin. When picking a method,\nconsider the following:\n\n- Using the Django admin to setup ``SocialApp`` instances effectively stores\n  secrets in your database, which has security implications.\n\n- The ``SocialApp`` approach has (optional) support for the Django sites\n  (``django.contrib.sites``). For example, it allows you to setup multiple apps\n  for one and the same provider, and assign an app to a specific\n  site/domain. This may be of use in a multi tenant setup.\n\n**Important**: While you can mix both methods, be aware you need to avoid\nconfiguring one and the same provider both via ``settings.py`` and a\n``SocialApp`` instance.  In that case, it is not clear what app to pick,\nresulting in a ``MultipleObjectsReturned`` exception.\n\nThe examples presented in this documentation are all settings based. If you\nprefer the ``SocialApp`` based approach, simply create an entry via the Django\nadmin and populate the fields exactly like listed in the example.\n\nThe ``SOCIALACCOUNT_PROVIDERS`` setting is used to configure providers and their\napps. Next to the secrets that are configured per app, there are also parameters\nsuch as ``VERIFIED_EMAIL`` that hold for all apps. The following is an example\nconfiguration::\n\n    SOCIALACCOUNT_PROVIDERS = {\n        \"github\": {\n            # For each provider, you can choose whether or not the\n            # email address(es) retrieved from the provider are to be\n            # interpreted as verified.\n            \"VERIFIED_EMAIL\": True\n        },\n        \"google\": {\n            # For each OAuth based provider, either add a ``SocialApp``\n            # (``socialaccount`` app) containing the required client\n            # credentials, or list them here:\n            \"APPS\": [\n                {\n                    \"client_id\": \"123\",\n                    \"secret\": \"456\",\n                    \"key\": \"\",\n                    \"settings\": {\n                        # You can fine tune these settings per app:\n                        \"scope\": [\n                            \"profile\",\n                            \"email\",\n                        ],\n                        \"auth_params\": {\n                            \"access_type\": \"online\",\n                        },\n                    },\n                },\n            ],\n            # The following provider-specific settings will be used for all apps:\n            \"SCOPE\": [\n                \"profile\",\n                \"email\",\n            ],\n            \"AUTH_PARAMS\": {\n                \"access_type\": \"online\",\n            },\n        }\n    }\n\nNote that provider-specific settings are documented `for each\nprovider separately <providers/index.html>`__.\n"
  },
  {
    "path": "docs/socialaccount/providers/23andme.rst",
    "content": "23andMe\n-------\n\nApp registration (get your key and secret here)\n    https://api.23andme.com/dev/\n\nDevelopment callback URL\n    http://localhost:8000/accounts/23andme/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/500px.rst",
    "content": "500px\n-----\n\nApp registration (get your key and secret here)\n    https://500px.com/settings/applications\n\nDevelopment callback URL\n    http://localhost:8000/accounts/500px/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/agave.rst",
    "content": "AgaveAPI\n--------\n\nAccount Signup\n    https://public.agaveapi.co/create_account\n\nApp registration\n    Run ``client-create`` from the cli: https://bitbucket.org/agaveapi/cli/overview\n\nDevelopment callback URL\n    http://localhost:8000/accounts/agave/login/callback/\n    *May require https url, even for localhost*\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'agave': {\n            'API_URL': 'https://api.tacc.utexas.edu',\n        }\n    }\n\nIn the absence of a specified API_URL, the default Agave tenant is\n    https://public.agaveapi.co/\n"
  },
  {
    "path": "docs/socialaccount/providers/amazon.rst",
    "content": "Amazon\n------\n\nAmazon requires secure OAuth callback URLs (``redirect_uri``), please\nsee the section on HTTPS about how this is handled.\n\nApp registration (get your key and secret here)\n    http://login.amazon.com/manageApps\n\nDevelopment callback URL\n    https://example.com/accounts/amazon/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/amazon_cognito.rst",
    "content": "Amazon Cognito\n--------------\n\nApp registration (get your key and secret here)\n  1. Go to your https://console.aws.amazon.com/cognito/ and create a Cognito User Pool if you haven't already.\n  2. Go to General Settings > App Clients section and create a new App Client if you haven't already. Please make sure you select the option to generate a secret key.\n  3. Go to App Integration > App Client Settings section and:\n\n    1. Enable Cognito User Pool as an identity provider.\n    2. Set the callback and sign-out URLs. (see next section for development callback URL)\n    3. Enable Authorization Code Grant OAuth flow.\n    4. Select the OAuth scopes you'd like to allow.\n\n  4. Go to App Integration > Domain Name section and create a domain prefix for your Cognito User Pool.\n\nDevelopment callback URL:\n  http://localhost:8000/accounts/amazon-cognito/login/callback/\n\nIn addition, you'll need to specify your user pool's domain like so:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'amazon_cognito': {\n            'DOMAIN': 'https://<domain-prefix>.auth.us-east-1.amazoncognito.com',\n        }\n    }\n\nYour domain prefix is the value you specified in step 4 of the app registration process.\nIf you provided a custom domain such as accounts.example.com provide that instead.\n"
  },
  {
    "path": "docs/socialaccount/providers/angellist.rst",
    "content": "AngelList\n---------\n\nApp registration (get your key and secret here)\n    https://angel.co/api/oauth/clients\n\nDevelopment callback URL\n    http://localhost:8000/accounts/angellist/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/apple.rst",
    "content": "Apple\n-----\n\nApp registration (create an App ID and then a related Service ID here)\n    https://developer.apple.com/account/resources/identifiers/list\n\nPrivate Key registration (be sure to save it)\n    https://developer.apple.com/account/resources/authkeys/list\n\nDevelopment callback URL\n    http://domain.com/accounts/apple/login/callback/\n\nAdd the following configuration to your settings:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        \"apple\": {\n            \"APPS\": [{\n                # Your service identifier.\n                \"client_id\": \"your.service.id\",\n\n                # The Key ID (visible in the \"View Key Details\" page).\n                \"secret\": \"KEYID\",\n\n                 # Member ID/App ID Prefix -- you can find it below your name\n                 # at the top right corner of the page, or it’s your App ID\n                 # Prefix in your App ID.\n                \"key\": \"MEMAPPIDPREFIX\",\n\n                \"settings\": {\n                    # The certificate you downloaded when generating the key.\n                    \"certificate_key\": \"\"\"-----BEGIN PRIVATE KEY-----\n    s3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr\n    3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3\n    c3ts3cr3t\n    -----END PRIVATE KEY-----\n    \"\"\"\n                }\n            }]\n        }\n    }\n\nApple offers two distinct client IDs: a \"Bundle ID\" and a \"Services ID\". When\nthe flow is started from a mobile iOS device the bundle ID is used, whereas a\nweb authorization flow uses the services ID as the client ID. If you need to\nsupport both client IDs within one project, add an app entry (over at ``APPS``)\nfor each client ID. For the app specifying the bundle ID, add the following to\nthe settings so that this app does not show up on the web::\n\n    \"settings\": { \"hidden\": True, ... }\n\n\nNote: Sign In With Apple uses a slight variation of OAuth2, which uses a POST\ninstead of a GET. Unlike a GET with SameSite=Lax, the session cookie will not\nget sent along with a POST. If you encounter 'PermissionDenied' errors during\nApple log in, check that you don't have any 3rd party middleware that is\ngenerating a new session on this cross-origin POST, as this will prevent the\nlogin process from being able to access the original session after the POST\ncompletes.\n"
  },
  {
    "path": "docs/socialaccount/providers/atlassian.rst",
    "content": "Atlassian\n---------\n\nAtlassian OAuth 2.0 (3LO) apps provider.\n\nMore info:\n    https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/\n\n\nEnabling OAuth 2.0 (3LO)\n************************\nBefore you can implement OAuth 2.0 (3LO) for your app, you need to enable it for your app using the developer console.\n\nAtlassian developer console\n    https://developer.atlassian.com/console/myapps/\n\n1. From any page on developer.atlassian.com, select your profile icon in the top-right corner, and from the dropdown, select Developer console.\n2. Select your app from the list (or create one if you don't already have one).\n3. Select Authorization in the left menu.\n4. Next to OAuth 2.0 (3LO), select Configure.\n5. Enter the Callback URL. Ex. ``http://127.0.0.1:8000/accounts/atlassian/login/callback/``\n6. Click Save changes.\n\nNote, if you haven't already added an API to your app, you should do this now:\n\n1. Select Permissions in the left menu.\n2. Next to the API you want to add, select Add.\n\n\nDjango setup\n************\nThe app credentials are configured for your Django installation via the admin\ninterface. Create a new socialapp through ``/admin/socialaccount/socialapp/``.\n\nFill in the form as follows:\n\n* Provider, \"Atlassian\"\n* Name, your pick, suggest \"Atlassian\"\n* Client id, is called \"Client ID\" by Atlassian\n* Secret key, is called \"Secret\" by Atlassian\n* Key, is not needed, leave blank.\n\nOptionally, you can specify the scope to use as follows:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'atlassian': {\n            'SCOPE': [\n                'read:me',\n                'write:jira-work',\n            ],\n        }\n    }\n\n.. note:: By default (if you do not specify ``SCOPE``), ``read:me`` scope is requested.\n"
  },
  {
    "path": "docs/socialaccount/providers/auth0.rst",
    "content": "Auth0\n-----\n\nApp registration (get your key and secret here)\n    https://manage.auth0.com/#/clients\n\nDevelopment callback URL\n    http://localhost:8000/accounts/auth0/login/callback/\n\n\nYou'll need to specify the base URL for your Auth0 domain:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'auth0': {\n            'AUTH0_URL': 'https://your.auth0domain.auth0.com',\n            'OAUTH_PKCE_ENABLED': True,\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/authelia.rst",
    "content": "Authelia\n--------\n\nAt the time of writing, `Authelia <https://www.authelia.com/>`__ supports OpenID Connect (OIDC) as a beta feature. Detailed information about the available configuration options can be found on their `website <https://www.authelia.com/configuration/identity-providers/open-id-connect/>`__.\n\nAs documented at https://www.authelia.com/integration/openid-connect/introduction/ the Well Known Discovery Endpoint that can be used as the server url is ``https://auth.example.com/.well-known/openid-configuration`` where ``https://auth.example.com/`` should be replaced by the specific url of your instance of Authelia.\n\nAn example configuration for authelia would look like this::\n\n\n    SOCIALACCOUNT_PROVIDERS = {\n        \"openid_connect\": {\n            \"APPS\": [\n                {\n                    \"provider_id\": \"authelia\",\n                    \"name\": \"Authelia SSO\",\n                    \"client_id\": \"<insert-id>\",\n                    \"secret\": \"<insert-secret>\",\n                    \"settings\": {\n                        \"server_url\": \"https://auth.example.com/.well-known/openid-configuration\"\n                    }\n                }\n            ]\n        }\n    }\n\nNote that the client id and the secret must match the configuration in Authelia for this django-allauth app.\n"
  },
  {
    "path": "docs/socialaccount/providers/authentiq.rst",
    "content": "Authentiq\n---------\n\nBrowse to https://www.authentiq.com/developers to get started.\n\nApp registration\n    https://dashboard.authentiq.com/\n\nSign in or register with your Authentiq ID (select ``Download the app`` while signing in if you don't have Authentiq ID yet).\n\nDevelopment redirect URL\n    http://localhost:8000/accounts/authentiq/login/callback/\n\nWhile testing you can leave the ``Redirect URIs`` field empty in the dashboard. You can specify what identity details to request via the ``SCOPE`` parameter.\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'authentiq': {\n          'SCOPE': ['email', 'aq:name']\n        }\n    }\n\nValid scopes include: ``email``, ``phone``, ``address``, ``aq:name``, ``aq:location``. The default is to request a user's name, and email address if ``SOCIALACCOUNT_QUERY_EMAIL=True``. You can request and require a verified email address by setting ``SOCIALACCOUNT_EMAIL_VERIFICATION=True`` and ``SOCIALACCOUNT_EMAIL_REQUIRED=True``.\n"
  },
  {
    "path": "docs/socialaccount/providers/baidu.rst",
    "content": "Baidu\n-----\n\nThe Baidu OAuth2 authentication documentation:\n    http://developer.baidu.com/wiki/index.php?title=docs/oauth/refresh\n    http://developer.baidu.com/wiki/index.php?title=docs/oauth/rest/file_data_apis_lista\n"
  },
  {
    "path": "docs/socialaccount/providers/basecamp.rst",
    "content": "Basecamp\n--------\n\nApp registration (get your key and secret here)\n    https://integrate.37signals.com/\n\nThe Basecamp OAuth2 authentication documentation\n    https://github.com/basecamp/api/blob/master/sections/authentication.md#oauth-2\n\nDevelopment callback URL\n    https://localhost:8000/accounts/basecamp/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/battlenet.rst",
    "content": "Battle.net\n----------\n\nThe Battle.net OAuth2 authentication documentation\n    https://develop.battle.net/documentation/guides/using-oauth\n\nRegister your app here (Blizzard account required)\n    https://develop.battle.net/access/clients/create\n\nDevelopment callback URL\n    https://localhost:8000/accounts/battlenet/login/callback/\n\nNote that in order to use battletags as usernames, you are expected to override\neither the ``username`` field on your User model, or to pass a custom validator\nwhich will accept the ``#`` character using the ``ACCOUNT_USERNAME_VALIDATORS``\nsetting. Such a validator is available in\n``socialaccount.providers.battlenet.validators.BattletagUsernameValidator``.\n\nThe following Battle.net settings are available:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'battlenet': {\n            'SCOPE': ['wow.profile', 'sc2.profile'],\n            'REGION': 'us',\n        }\n    }\n\nSCOPE:\n    Scope can be an array of the following options: ``wow.profile`` allows\n    access to the user's World of Warcraft characters. ``sc2.profile`` allows\n    access to the user's StarCraft 2 profile. The default setting is ``[]``.\n\nREGION:\n    Either ``apac``, ``cn``, ``eu``, ``kr``, ``sea``, ``tw`` or ``us``\n\n    Sets the default region to use, can be overridden using query parameters\n    in the URL, for example: ``?region=eu``. Defaults to ``us``.\n"
  },
  {
    "path": "docs/socialaccount/providers/bitbucket.rst",
    "content": "Bitbucket\n---------\n\nApp registration (get your key and secret here)\n    https://bitbucket.org/account/user/{{yourusername}}/oauth-consumers/new\n\nMake sure you select the Account:Read permission.\n\nDevelopment callback URL\n    http://127.0.0.1:8000/accounts/bitbucket_oauth2/login/callback/\n\nNote that Bitbucket calls the ``client_id`` *Key* in their user interface.\nDon't get confused by that; use the *Key* value for your ``client_id`` field.\n"
  },
  {
    "path": "docs/socialaccount/providers/box.rst",
    "content": "Box\n---\n\nApp registration (get your key and secret here)\n    https://app.box.com/developers/services/edit/\n\nDevelopment callback URL\n    http://localhost:8000/accounts/box/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/cern.rst",
    "content": "CERN\n----\n\nMembers of the scientific commmunity affiliated with CERN (https://home.cern/about)\ncan put their applications behind CERN SSO, which supports OIDC and SAML protocols.\nFor OIDC, use the regular OpenID Connect configuration:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        \"openid_connect\": {\n            \"APPS\": [\n                {\n                    \"provider_id\": \"cern\",\n                    \"name\": \"CERN\",\n                    \"client_id\": \"<insert-id>\",\n                    \"secret\": \"<insert-secret>\",\n                    \"settings\": {\n                        \"server_url\": \"https://auth.cern.ch/auth/realms/cern/.well-known/openid-configuration\"\n                    }\n                }\n            ]\n        }\n    }\n\nApp registration (get your key and secret here)\n    https://application-portal.web.cern.ch/\n\nDocumentation\n    https://auth.docs.cern.ch/applications/application-configuration/\n"
  },
  {
    "path": "docs/socialaccount/providers/cilogon.rst",
    "content": "CILogon\n-------\n\nCILogon is a federated identity provider for hundreds of universities and research institutions around the world.\n\nApp registration (get your key and secret here)\n    https://cilogon.org/oauth2/register\n\nCILogon OIDC/OAuth2 Documentation\n    https://www.cilogon.org/oidc\n"
  },
  {
    "path": "docs/socialaccount/providers/clever.rst",
    "content": "Clever\n------\n\nSingle sign-on for education\n\nClever OAUth2 Documentation\n    https://dev.clever.com/docs/classroom-with-oauth\n"
  },
  {
    "path": "docs/socialaccount/providers/dataporten.rst",
    "content": "Dataporten\n----------\nApp registration (get your key and secret here)\n    https://docs.dataporten.no/docs/gettingstarted/\n\nDevelopment callback URL\n    http://localhost:8000/accounts/dataporten/login/callback\n"
  },
  {
    "path": "docs/socialaccount/providers/daum.rst",
    "content": "daum\n----\n\nApp registration (get your key and secret here)\n    https://developers.daum.net/console\n\nDevelopment callback URL\n    http://127.0.0.1:8000/accounts/daum/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/digitalocean.rst",
    "content": "DigitalOcean\n------------\n\nApp registration (get your key and secret here)\n    https://cloud.digitalocean.com/settings/applications\n\nDevelopment callback URL\n    http://127.0.0.1:8000/accounts/digitalocean/login/callback/\n\nWith the acquired access token you will have read permissions on the API by\ndefault.  If you also need write access specify the scope as follows.  See\nhttps://developers.digitalocean.com/documentation/oauth/#scopes for details.\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'digitalocean': {\n            'SCOPE': [\n                'read write',\n            ],\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/dingtalk.rst",
    "content": "DingTalk\n--------\n\nThe DingTalk OAuth2 documentation:\n\n    https://open.dingtalk.com/document/orgapp-server/obtain-identity-credentials\n\nYou can optionally specify additional scope to use. If no ``SCOPE`` value\nis set, will use ``openapi`` by default(for Open Platform Account, need\nregistration). Other ``SCOPE`` options are: corpid.\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'dingtalk': {\n            'APP': {\n                'client_id': 'xxxx',\n                'secret': 'xxxx',\n           },\n    }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/discogs.rst",
    "content": "Discogs (OAuth 1a)\n------------------\n\nYou will need to register a Discogs app to obain a consumer key and secret.\n\nApp registration\n****************\n\nTo register an app you will need a Discogs account.\n\nWith an account, you can create a new app at::\n\n    https://www.discogs.com/settings/developers\n\nIn the app creation form (optionally) fill in the development callback URL::\n\n    http://127.0.0.1:8000/accounts/discogs/login/callback/\n\nFor production use a callback URL such as::\n\n   https://{{yourdomain}}.com/accounts/discogs/login/callback/\n\n\nSetting up provider\n*******************\n\n* 'name', up to you to choose (optional)\n* 'client_id', is called \"Consumer Key\"\n* 'secret', is called \"Consumer Secret\"\n"
  },
  {
    "path": "docs/socialaccount/providers/discord.rst",
    "content": "Discord\n-------\n\nApp registration and management (get your key and secret here)\n    https://discordapp.com/developers/applications/me\n\nMake sure to Add Redirect URI to your application.\n\nDevelopment callback (redirect) URL\n    http://127.0.0.1:8000/accounts/discord/login/callback/\n\nIt's required to request the `identify` scope to fetch the user ID.\n"
  },
  {
    "path": "docs/socialaccount/providers/doximity.rst",
    "content": "Doximity\n--------\n\nDoximity OAuth2 implementation documentation\n    https://www.doximity.com/developers/documentation#oauth\n\nRequest API keys here\n    https://www.doximity.com/developers/api_signup\n\nDevelopment callback URL\n    http://localhost:8000/accounts/doximity/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/draugiem.rst",
    "content": "Draugiem\n--------\n\nApp registration (get your key and secret here)\n    https://www.draugiem.lv/applications/dev/create/?type=4\n\nAuthentication documentation\n    https://www.draugiem.lv/applications/dev/docs/passport/\n\nDevelopment callback URL\n    http://localhost:8000/accounts/draugiem/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/drip.rst",
    "content": "Drip\n--------\n\nApp registration (get your key and secret here)\n    https://www.getdrip.com/user/applications\n\nAuthentication documentation\n    https://developer.drip.com/?shell#oauth\n\nDevelopment callback URL\n    https://localhost:8000/accounts/drip/login/callback/\n\nMake sure the registered application is active.\n"
  },
  {
    "path": "docs/socialaccount/providers/dropbox.rst",
    "content": "Dropbox\n-------\n\nApp registration (get your key and secret here)\n    https://www.dropbox.com/developers/apps/\n\nDevelopment callback URL\n    http://localhost:8000/accounts/dropbox/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/dwolla.rst",
    "content": "Dwolla\n------------\n\nApp registration (get your key and secret here)\n    https://dashboard-uat.dwolla.com/applications\n\nDevelopment callback URL\n    http://127.0.0.1:8000/accounts/dwolla/login/callback/\n\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'dwolla': {\n            'SCOPE': [\n                'Send',\n                'Transactions',\n                'Funding',\n                'AccountInfoFull',\n            ],\n            'ENVIROMENT':'sandbox',\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/edmodo.rst",
    "content": "Edmodo\n------\n\nEdmodo OAuth2 documentation\n    https://developers.edmodo.com/edmodo-connect/edmodo-connect-overview-getting-started/\n\nYou can optionally specify additional permissions to use. If no ``SCOPE``\nvalue is set, the Edmodo provider will use ``basic`` by default:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'edmodo': {\n            'SCOPE': [\n                'basic',\n                'read_groups',\n                'read_connections',\n                'read_user_email',\n                'create_messages',\n                'write_library_items',\n            ]\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/edx.rst",
    "content": "Edx\n------\n\nOpen Edx OAuth2 documentation\n    https://course-catalog-api-guide.readthedocs.io/en/latest/authentication/\n\nIt is necessary to set ``EDX_URL`` to your open edx installation. If no ``EDX_URL``\nvalue is set, the Edx provider will use ``https://edx.org`` which does not work:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n      'edx': {\n          'EDX_URL': \"https://openedx.local\",\n      }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/eventbrite.rst",
    "content": "Eventbrite\n------------------\n\nLog in and click your profile name in the top right navigation, then select\n``Account Settings``. Choose ``App Management`` near the bottom of the left\nnavigation column. You can then click ``Create A New App`` on the upper left\ncorner.\n\nApp registration\n    https://www.eventbrite.com/myaccount/apps/\n\nFill in the form with the following link\n\nDevelopment callback URL\n    http://127.0.0.1:8000/accounts/eventbrite/login/callback/\n\nfor both the ``Application URL`` and ``OAuth Redirect URI``.\n"
  },
  {
    "path": "docs/socialaccount/providers/eveonline.rst",
    "content": "Eve Online\n----------\n\nRegister your application at ``https://developers.eveonline.com/applications/create``.\nNote that if you have ``STORE_TOKENS`` enabled (the default), you will need to\nset up your application to be able to request an OAuth scope. This means you\nwill need to set it as having \"CREST Access\". The least obtrusive scope is\n\"publicData\".\n"
  },
  {
    "path": "docs/socialaccount/providers/evernote.rst",
    "content": "Evernote\n--------\n\nRegister your OAuth2 application at ``https://dev.evernote.com/doc/articles/authentication.php``:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'evernote': {\n            'EVERNOTE_HOSTNAME': 'evernote.com'  # defaults to sandbox.evernote.com\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/exist.rst",
    "content": "Exist\n-----\n\nRegister your OAuth2 app in apps page:\n\n    https://exist.io/account/apps/\n\nDuring development set the callback url to:\n\n    http://localhost:8000/accounts/exist/login/callback/\n\nIn production replace localhost with whatever domain you're hosting your app on.\n\nIf your app is writing to certain attributes you need to specify this during the\ncreation of the app. For a full list of scopes see:\n\nhttps://developer.exist.io/reference/authentication/oauth2/#scopes\n\nThe following Exist settings are available:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'exist': {\n            'SCOPE': ['mood_read', 'health_read', 'productivity_read'],\n        }\n    }\n\nSCOPE:\n    The default scopes are listed above. For reading additional attributes or writing data see\n    https://developer.exist.io/reference/authentication/oauth2/#scopes.\n\nFor more information:\nOAuth documentation: https://developer.exist.io/reference/authentication/oauth2\nAPI documentation: https://developer.exist.io/reference/important_values/\n"
  },
  {
    "path": "docs/socialaccount/providers/facebook.rst",
    "content": "Facebook\n--------\n\nFor Facebook both OAuth2, Facebook Connect Javascript SDK and even\n`Limited Login <https://developers.facebook.com/docs/facebook-login/limited-login>`_\nare supported. You can even mix and match.\n\nAn advantage of the Javascript SDK may be a more streamlined user\nexperience as you do not leave your site. Furthermore, you do not need\nto worry about tailoring the login dialog depending on whether or not\nyou are using a mobile device. Yet, relying on Javascript may not be\neverybody's cup of tea.\n\nTo initiate a login use:\n\n.. code-block:: python\n\n    {% load socialaccount %}\n    {% providers_media_js %}\n    <a href=\"{% provider_login_url \"facebook\" %}\">Facebook Connect</a>\n\nThe following Facebook settings are available:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'facebook': {\n            'METHOD': 'oauth2',  # Set to 'js_sdk' to use the Facebook connect SDK\n            'SDK_URL': '//connect.facebook.net/{locale}/sdk.js',\n            'SCOPE': ['email', 'public_profile'],\n            'AUTH_PARAMS': {'auth_type': 'reauthenticate'},\n            'INIT_PARAMS': {'cookie': True},\n            'FIELDS': [\n                'id',\n                'first_name',\n                'last_name',\n                'middle_name',\n                'name',\n                'name_format',\n                'picture',\n                'short_name'\n            ],\n            'EXCHANGE_TOKEN': True,\n            'LOCALE_FUNC': 'path.to.callable',\n            'VERIFIED_EMAIL': False,\n            'VERSION': 'v13.0',\n            'GRAPH_API_URL': 'https://graph.facebook.com/v13.0',\n        }\n    }\n\nMETHOD:\n    Either ``js_sdk`` or ``oauth2``. The default is ``oauth2``.\n\nSDK_URL:\n    If needed, use ``SDK_URL`` to override the default Facebook JavaScript SDK\n    URL, ``//connect.facebook.net/{locale}/sdk.js``. This may be necessary, for\n    example, when using the `Customer Chat Plugin <https://developers.facebook.com/docs/messenger-platform/discovery/customer-chat-plugin/sdk#install>`_.\n    If the ``SDK_URL`` contains a ``{locale}`` format string named argument,\n    the locale given by the ``LOCALE_FUNC`` will be used to generate the\n    ``SDK_URL``.\n\nSCOPE:\n    By default, the ``email`` scope is required depending on whether or not\n    ``SOCIALACCOUNT_QUERY_EMAIL`` is enabled.\n    Apps using permissions beyond ``email`` and ``public_profile``\n    require review by Facebook.\n    See `Permissions with Facebook Login <https://developers.facebook.com/docs/facebook-login/permissions>`_\n    for more information.\n\nAUTH_PARAMS:\n    Use ``AUTH_PARAMS`` to pass along other parameters to the ``FB.login``\n    JS SDK call.\n\nFIELDS:\n    The fields to fetch from the Graph API ``/me/?fields=`` endpoint.\n    For example, you could add the ``'friends'`` field in order to\n    capture the user's friends that have also logged into your app using\n    Facebook (requires ``'user_friends'`` scope).\n\nEXCHANGE_TOKEN:\n    The JS SDK returns a short-lived token suitable for client-side use. Set\n    ``EXCHANGE_TOKEN = True`` to make a server-side request to upgrade to a\n    long-lived token before storing in the ``SocialToken`` record. See\n    `Expiration and Extending Tokens <https://developers.facebook.com/docs/facebook-login/access-tokens#extending>`_.\n\nLOCALE_FUNC:\n    The locale for the JS SDK is chosen based on the current active language of\n    the request, taking a best guess. This can be customized using the\n    ``LOCALE_FUNC`` setting, which takes either a callable or a path to a callable.\n    This callable must take exactly one argument, the request, and return `a\n    valid Facebook locale <http://developers.facebook.com/docs/\n    internationalization/>`_ as a string, e.g. US English:\n\n    .. code-block:: python\n\n        SOCIALACCOUNT_PROVIDERS = {\n            'facebook': {\n                'LOCALE_FUNC': lambda request: 'en_US'\n            }\n        }\n\nVERIFIED_EMAIL:\n    It is not clear from the Facebook documentation whether or not the fact\n    that the account is verified implies that the email address is verified\n    as well. For example, verification could also be done by phone or credit\n    card. To be on the safe side, the default is to treat email addresses\n    from Facebook as unverified. But, if you feel that is too paranoid, then\n    use this setting to mark them as verified. Due to lack of an official\n    statement from the side of Facebook, attempts have been made to\n    `reverse engineer the meaning of the verified flag <https://stackoverflow.com/questions/14280535/is-it-possible-to-check-if-an-email-is-confirmed-on-facebook>`_.\n    Do know that by setting this to ``True`` you may be introducing a security\n    risk.\n\nVERSION:\n    The Facebook Graph API version to use. The default is ``v13.0``.\n\nApp registration (get your key and secret here)\n    A key and secret key can be obtained by\n    `creating an app <https://developers.facebook.com/apps>`_.\n    After registration you will need to make it available to the public.\n    In order to do that your app first has to be\n    `reviewed by Facebook <https://developers.facebook.com/docs/apps/review>`_.\n\nDevelopment callback URL\n    Leave your App Domains empty and put ``http://localhost:8000`` in the\n    section labeled ``Website with Facebook Login``. Note that you'll need to\n    add your site's actual domain to this section once it goes live.\n\nFor Limited Login, it is exclusively supported via the Headless API's \"provider\ntoken\" flow.\n\nPass your Limited Login JWT (obtained from the Facebook iOS SDK) to that\nendpoint as an ``id_token``.\n\nNote that Limited Login is purely used for login and does not allow access to\nthe user's Facebook account - no ``SocialToken`` is created.\n"
  },
  {
    "path": "docs/socialaccount/providers/feishu.rst",
    "content": "Feishu\n------\n\nApp Registration\n  https://open.feishu.cn/app\n\nAuthorized Redirect URI\n    http://127.0.0.1:8000/accounts/feishu/login/callback/\n\nInto the developer background https://open.feishu.cn/app, click on the create self-built application, obtain app_id and app_secret.\nIn the configuration of application security domain name added to redirect URL, such as https://open.feishu.cn/document.\nRedirect URL is the interface through which the application obtains the user's identity by using the user login pre-authorization code after the user has logged in.\nIf it is not configured or configured incorrectly, the open platform will prompt the request to be illegal.\n"
  },
  {
    "path": "docs/socialaccount/providers/figma.rst",
    "content": "Figma\n------------------\n\nApp registration (get your key and secret here)\n    https://www.figma.com/developers/apps\n\nDevelopment callback URL\n    http://localhost:8000/accounts/figma/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/flickr.rst",
    "content": "Flickr\n------\n\nApp registration (get your key and secret here)\n    https://www.flickr.com/services/apps/create/\n\nYou can optionally specify the application permissions to use. If no ``perms``\nvalue is set, the Flickr provider will use ``read`` by default.\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'flickr': {\n            'AUTH_PARAMS': {\n                'perms': 'write',\n            }\n        }\n    }\n\nMore info:\n    https://www.flickr.com/services/api/auth.oauth.html#authorization\n"
  },
  {
    "path": "docs/socialaccount/providers/frontier.rst",
    "content": "Frontier\n--------\n\nThe Frontier provider is OAuth2 based.\n\nClient registration\n*******************\nFrontier Developments switched to OAuth2 based authentication in early 2019.\nBefore a developer can use the authentication and CAPI (Companion API) service\nfrom Frontier, they must first apply for access.\n\nGo to https://user.frontierstore.net/ and apply for access. Once your application\nis approved for access. Under \"Developer Zone\", you will see a list of authorized\nclients granted access. To add access for your client, click on the \"Create Client\"\nbutton and fill out the form and submit the form.\n\nAfter creating the client access, click on \"View\" to reveal your Client ID and\nShared Key. You can also regenerate the key in an event that your shared key is\ncompromised.\n\nConfiguring Django\n******************\nThe app credentials are configured for your Django installation via the admin\ninterface. Create a new socialapp through ``/admin/socialaccount/socialapp/``.\n\nFill in the form as follows:\n\n* Provider, \"Frontier\"\n* Name, your pick, suggest \"Frontier\"\n* Client id, is called \"Client ID\" by Frontier\n* Secret key, is called \"Shared Key\" by Frontier\n* Key, is not needed, leave blank.\n\nOptionally, you can specify the scope to use as follows:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n      'frontier': {\n        'SCOPE': ['auth', 'capi'],\n        'VERIFIED_EMAIL': True\n      },\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/fxa.rst",
    "content": "Firefox Accounts\n----------------\n\nThe Firefox Accounts provider is currently limited to Mozilla relying services\nbut there is the intention, in the future, to allow third-party services to\ndelegate authentication. There is no committed timeline for this.\n\nThe provider is OAuth2 based. More info:\n    https://developer.mozilla.org/en-US/Firefox_Accounts\n\nThe following Firefox Accounts settings are available:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'fxa': {\n            'SCOPE': ['profile'],\n            'OAUTH_ENDPOINT': 'https://oauth.accounts.firefox.com/v1',\n            'PROFILE_ENDPOINT': 'https://profile.accounts.firefox.com/v1',\n        }\n    }\n\nSCOPE:\n    Requested OAuth2 scope. Default is ['profile'], which will work for\n    applications on the Mozilla trusted whitelist. If your application is not\n    on the whitelist, then define SCOPE to be ['profile:email', 'profile:uid'].\n\nOAUTH_ENDPOINT:\n    Explicitly set the OAuth2 endpoint. Default is the production endpoint\n    \"https://oauth.accounts.firefox.com/v1\".\n\nPROFILE_ENDPOINT:\n    Explicitly set the profile endpoint. Default is the production endpoint\n    and is \"https://profile.accounts.firefox.com/v1\".\n"
  },
  {
    "path": "docs/socialaccount/providers/gitea.rst",
    "content": "Gitea\n-----\n\nApp registration (get your key and secret here)\n    https://gitea.com/user/settings/applications\n\nDevelopment callback URL\n    http://127.0.0.1:8000/accounts/gitea/login/callback/\n\n\nSelf-hosted Support\n*******************\n\nIf you use a self-hosted Gitea instance add your server URL to your Django settings as\nfollows:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'gitea': {\n            'GITEA_URL': 'https://your.gitea-server.domain',\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/github.rst",
    "content": "GitHub\n------\n\nApp registration (get your key and secret here)\n    https://github.com/settings/applications/new\n\nDevelopment callback URL\n    http://127.0.0.1:8000/accounts/github/login/callback/\n\nIf you want more than just read-only access to public data, specify the scope\nas follows. See https://developer.github.com/v3/oauth/#scopes for details.\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'github': {\n            'SCOPE': [\n                'user',\n                'repo',\n                'read:org',\n            ],\n        }\n    }\n\nEnterprise Support\n******************\n\nIf you use GitHub Enterprise add your server URL to your Django settings as\nfollows:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'github': {\n            'GITHUB_URL': 'https://your.github-server.domain',\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/gitlab.rst",
    "content": "GitLab\n------\n\nThe GitLab provider works by default with https://gitlab.com. It allows you\nto connect to your private GitLab server and use GitLab as an OAuth2\nauthentication provider as described in GitLab docs at\nhttps://docs.gitlab.com/integration/oauth_provider/\n\nThe following GitLab settings are available, if unset https://gitlab.com will\nbe used, with a ``read_user`` scope.\n\nGITLAB_URL:\n    Override endpoint to request an authorization and access token. For your\n    private GitLab server you use: ``https://your.gitlab.server.tld``\n\nSCOPE:\n    The ``read_user`` scope is required for the login procedure, and is the default.\n    If more access is required, the scope should be set here.\n\nExample:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        \"gitlab\": {\n            \"SCOPE\": [\"api\"],\n            \"APPS\": [\n                {\n                    \"client_id\": \"<insert-id>\",\n                    \"secret\": \"<insert-secret>\",\n                    \"settings\": {\n                        \"gitlab_url\": \"https://your.gitlab.server.tld\",\n                    }\n                }\n            ]\n        },\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/globus.rst",
    "content": "Globus\n------\n\nRegistering an application:\n    https://developers.globus.org/\n\nBy default, you will have access to the openid, profile, and offline_access\nscopes.  With the offline_access scope, the API will provide you with a\nrefresh token.  For additional scopes, see the Globus API docs:\n\n https://docs.globus.org/api/auth/reference/\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'globus': {\n            'SCOPE': [\n                'openid',\n                'profile',\n                'email',\n                'urn:globus:auth:scope:transfer.api.globus.org:all'\n            ]\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/google.rst",
    "content": "Google\n------\n\nThe Google provider is OAuth2 based.\n\nMore info:\n    https://developers.google.com/identity/protocols/OAuth2\n\n\nApp registration\n****************\nCreate a google app to obtain a key and secret through the developer console.\n\nGoogle Developer Console\n    https://console.developers.google.com/\n\nAfter you create a project, you will have to create an OAuth client ID and fill\nin some project details for the consent form that will be presented to the\nclient:\n\n#. Under \"APIs & Services\", go to \"Credentials\", click \"Create credentials\" and\n   create a new \"OAuth client ID\". Probably you will want to choose \"Web\n   application\" as the application type. Provide your domain name or test\n   domain name in \"Authorized JavaScript origins\". Finally, fill in the\n   \"Authorized redirect URIs\" field with URLs like\n   ``http://example.com/accounts/google/login/callback/`` , replacing the\n   domain name with your domain name, or with ``127.0.0.1:8000`` for testing.\n   After creating the OAuth client ID, make a note of the client ID and the\n   client secret, as you will need it later.\n\n#. Users that log in using the app will be presented a consent form. For this\n   to work, additional information is required. Under \"APIs & Services\", go to\n   \"OAuth consent screen\" and at least provide an email address and a product\n   name.\n\n\nDjango configuration\n********************\n\nDon't forget to add the Google provider to your ``INSTALLED_APPS`` setting:\n\n.. code-block:: python\n\n    INSTALLED_APPS = [\n        ...\n        'allauth.socialaccount.providers.google',\n    ]\n\nThe app credentials are configured for your Django installation via the admin\ninterface. Create a new socialapp through ``/admin/socialaccount/socialapp/``.\n\nFill in the form as follows:\n\n* Provider, \"Google\"\n* Name, your pick, suggest \"Google\"\n* Client id, is called \"Client ID\" by Google\n* Secret key, is called \"Client secret\" by Google\n* Key, is not needed, leave blank.\n\nOptionally, you can specify the scope to use as follows:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'google': {\n            'SCOPE': [\n                'profile',\n                'email',\n            ],\n            'AUTH_PARAMS': {\n                'access_type': 'online',\n            },\n            'OAUTH_PKCE_ENABLED': True,\n        }\n    }\n\nBy default (if you do not specify ``SCOPE``), ``profile`` scope is\nrequested, and optionally ``email`` scope depending on whether or not\n``SOCIALACCOUNT_QUERY_EMAIL`` is enabled.\n\nYou must set ``AUTH_PARAMS['access_type']`` to ``offline`` in order to\nreceive a refresh token on first login and on reauthentication requests\n(which is needed to refresh authentication tokens in the background,\nwithout involving the user's browser). When unspecified, Google defaults\nto ``online``.\n\nBy default, the userinfo endpoint will not be fetched. In most cases,\nthis will be fine, as most in scope user data is gained via decoding\nthe JWT. However if users have a private style of avatar_url\nthen this will not ordinarily be returned in the JWT and\nas such, subsequent calls to get_avatar_url will return None.\n\nYou can optionally specify the following setting so that the userinfo\nendpoint will be used to populate the avatar_url for those users\nwho have a private style of avatar_url.\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'google': {\n            'FETCH_USERINFO' : True\n        }\n    }\n\nOne Tap Sign-In\n***************\n\nOne Tap Sign-In can be enabled by adding a snippet like this snippet to your\ntemplate::\n\n    <script src=\"//accounts.google.com/gsi/client\" async></script>\n    <div id=\"g_id_onload\"\n         data-client_id=\"123-secret.apps.googleusercontent.com\"\n         data-login_uri=\"{% url 'google_login_by_token' %}\">\n    </div>\n\nFollow the `Sign In with Google for Web`_ guide for more information.\n\n.. _Sign In with Google for Web: https://developers.google.com/identity/gsi/web/guides/overview\n"
  },
  {
    "path": "docs/socialaccount/providers/gumroad.rst",
    "content": "Gumroad\n---------\n\nApp registration (get your key and secret here)\n    https://help.gumroad.com/article/280-create-application-api\n\nDevelopment callback URL\n    http://localhost:8000/accounts/instagram/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/hubspot.rst",
    "content": "Hubspot\n--------\n\nApp registration (get your key and secret here)\n    https://developers.hubspot.com/docs/api/creating-an-app\n\nAuthentication documentation\n    https://developers.hubspot.com/docs/api/working-with-oauth\n\nDevelopment callback URL\n    https://localhost:8000/accounts/hubspot/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/index.rst",
    "content": "Providers\n=========\n\nIntroduction\n************\n\nMost providers require you to sign up for a so called API client or app,\ncontaining a client ID and API secret. You must add a ``SocialApp``\nrecord per provider via the Django admin containing these app\ncredentials.\n\nWhen creating the OAuth app on the side of the provider pay special\nattention to the callback URL (sometimes also referred to as redirect\nURL). If you do not configure this correctly, you will receive login\nfailures when attempting to log in, such as::\n\n    An error occurred while attempting to login via your social network account.\n\nUse a callback URL of the form::\n\n    http://example.com/accounts/twitter/login/callback/\n    http://example.com/accounts/soundcloud/login/callback/\n    ...\n\nFor local development, use the following::\n\n    http://127.0.0.1:8000/accounts/twitter/login/callback/\n\n\nProtocol Specifics\n******************\n\n.. toctree::\n   :maxdepth: 1\n\n   oauth2\n\n\nProvider Specifics\n******************\n\n.. toctree::\n   :maxdepth: 1\n\n   23andme\n   500px\n   agave\n   amazon_cognito\n   amazon\n   angellist\n   apple\n   atlassian\n   auth0\n   authelia\n   authentiq\n   baidu\n   basecamp\n   battlenet\n   bitbucket\n   box\n   cern\n   cilogon\n   clever\n   dataporten\n   daum\n   digitalocean\n   dingtalk\n   discogs\n   discord\n   doximity\n   draugiem\n   drip\n   dropbox\n   dwolla\n   edmodo\n   edx\n   eventbrite\n   eveonline\n   evernote\n   exist\n   facebook\n   feishu\n   figma\n   flickr\n   frontier\n   fxa\n   gitea\n   github\n   gitlab\n   globus\n   google\n   gumroad\n   hubspot\n   instagram\n   jupyterhub\n   kakao\n   keycloak\n   lemonldap\n   lichess\n   line\n   linkedin\n   mailchimp\n   mailcow\n   mediawiki\n   microsoft\n   miro\n   naver\n   netiq\n   nextcloud\n   notion\n   odnoklassniki\n   okta\n   openid_connect\n   openid\n   openstreetmap\n   orcid\n   patreon\n   paypal\n   pinterest\n   pocket\n   questrade\n   quickbooks\n   reddit\n   saml\n   salesforce\n   sharefile\n   shopify\n   slack\n   snapchat\n   soundcloud\n   stackexchange\n   steam\n   stocktwits\n   strava\n   stripe\n   telegram\n   tiktok\n   trainingpeaks\n   trello\n   tumblr_oauth2\n   twitch\n   untappd\n   vimeo_oauth2\n   vimeo\n   vk\n   wahoo\n   weibo\n   weixin\n   windowslive\n   twitter\n   twitter_oauth2\n   xing\n   yahoo\n   yandex\n   ynab\n   zoho\n   zoom\n"
  },
  {
    "path": "docs/socialaccount/providers/instagram.rst",
    "content": "Instagram\n---------\n\nApp registration (get your key and secret here)\n    https://www.instagram.com/developer/clients/manage/\n\nDevelopment callback URL\n    http://localhost:8000/accounts/instagram/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/jupyterhub.rst",
    "content": "JupyterHub\n----------\n\nDocumentation on configuring a key and secret key\n    https://jupyterhub.readthedocs.io/en/stable/api/services.auth.html\n\nDevelopment callback URL\n    http://localhost:800/accounts/jupyterhub/login/callback/\n\nSpecify the URL of your JupyterHub server as follows:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'jupyterhub': {\n            'API_URL': 'https://jupyterhub.example.com',\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/kakao.rst",
    "content": "Kakao\n-----\n\nApp registration (get your key here)\n    https://developers.kakao.com/apps\n\nDevelopment callback URL\n    http://localhost:8000/accounts/kakao/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/keycloak.rst",
    "content": "Keycloak\n--------\n\nStarting since version 0.56.0, the builtin Keycloak provider has been removed in\nfavor of relying on the :doc:`openid_connect` provider as is:\n\n.. code-block:: python\n\n  SOCIALACCOUNT_PROVIDERS = {\n      \"openid_connect\": {\n          \"APPS\": [\n              {\n                  \"provider_id\": \"keycloak\",\n                  \"name\": \"Keycloak\",\n                  \"client_id\": \"<insert-id>\",\n                  \"secret\": \"<insert-secret>\",\n                  \"settings\": {\n                      \"server_url\": \"http://keycloak:8080/realms/master/.well-known/openid-configuration\",\n                  },\n              }\n          ]\n      }\n  }\n\nAdditional Authorization Request Parameters\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nSee :ref:`oauth2-authorization-request-parameters`.\n"
  },
  {
    "path": "docs/socialaccount/providers/lemonldap.rst",
    "content": "LemonLDAP::NG\n-------------\n\nCreate a new OpenID Connect Relying Party with the following settings:\n\n* Exported attributes:\n\n    * ``email``\n    * ``name``\n    * ``preferred_username``\n\n* Basic options:\n\n    * Development Redirect URI: http://localhost:8000/accounts/lemonldap/login/callback/\n\nThe following LemonLDAP::NG settings are available.\n\nLEMONLDAP_URL:\n    The base URL of your LemonLDAP::NG portal. For example: ``https://auth.example.com``\n\nExample:\n\n.. code-block:: python\n\n  SOCIALACCOUNT_PROVIDERS = {\n      'lemonldap': {\n          'LEMONLDAP_URL': 'https://auth.example.com'\n      }\n  }\n"
  },
  {
    "path": "docs/socialaccount/providers/lichess.rst",
    "content": "Lichess\n-------\n\nYou do not need to create a new application on Lichess to use this provider.\nThe Client ID and Client Secret should be a secure random string that you generate yourself to identify your application.\n\nDevelopment callback URL\n    http://127.0.0.1:8000/accounts/lichess/login/callback/\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n              'lichess': {\n                  'APP': {\n                      'client_id': 'LICHESS_CLIENT_ID',\n                      'secret': 'LICHESS_CLIENT_SECRET'\n                  },\n              }\n          }\n"
  },
  {
    "path": "docs/socialaccount/providers/line.rst",
    "content": "Line\n----\n\nscope options\n  https://developers.line.biz/en/docs/line-login/integrate-line-login/#scopes\n\nApp registration, create a Line login channel (get your channel_id and channel_secret here)\n    https://developers.line.biz/console/\n\nDevelopment callback URL\n    http://127.0.0.1:8000/accounts/line/login/callback/\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n              'line': {\n                  'APP': {\n                      'client_id': 'LINE_LOGIN_CHANNEL_ID',\n                      'secret': 'LINE_LOGIN_CHANNEL_SECRET'\n                  },\n                  \"SCOPE\": ['profile', 'openid', 'email']\n              }\n          }\n"
  },
  {
    "path": "docs/socialaccount/providers/linkedin.rst",
    "content": "LinkedIn\n--------\n\nLinkedIn has become an OpenID Connect compliant provider, avoiding the need for\na custom OAuth2 implementation. Therefore, the ``linkedin_oauth2`` provider is\nnow deprecated. You can setup LinkedIn, like any other OpenID Connect provider,\nas follows:\n\n.. code-block:: python\n\n  SOCIALACCOUNT_PROVIDERS = {\n      \"openid_connect\": {\n          \"APPS\": [\n              {\n                  \"provider_id\": \"linkedin\",\n                  \"name\": \"LinkedIn\",\n                  \"client_id\": \"<insert-id>\",\n                  \"secret\": \"<insert-secret>\",\n                  \"settings\": {\n                      \"server_url\": \"https://www.linkedin.com/oauth\",\n                  },\n              }\n          ]\n      }\n  }\n\n\nApp registration (get your key and secret here)\n    https://www.linkedin.com/secure/developer?newapp=\n"
  },
  {
    "path": "docs/socialaccount/providers/mailchimp.rst",
    "content": "MailChimp (OAuth 2)\n-------------------\n\nMailChimp has a simple API for working with your own data and a `good library`_\nalready exists for this use. However, to allow other MailChimp users to use an\napp you develop, the OAuth2 API allows those users to give or revoke access\nwithout creating a key themselves.\n\n.. _good library: https://pypi.python.org/pypi/mailchimp3\n\nRegistering a new app\n*********************\n\nInstructions for generating your own OAuth2 app can be found at\nhttps://developer.mailchimp.com/documentation/mailchimp/guides/how-to-use-oauth2/.\nIt is worth reading that carefully before following the instructions below.\n\nLogin via https://login.mailchimp.com/, which will redirect you to\n``https://usX.admin.mailchimp.com/`` where the prefix ``usX`` (``X`` is an\ninteger) is the subdomain you need to connect to. Click on your username in the\ntop right corner and select *Profile*. On the next page select *Extras* then\nclick API keys, which should lead you to:\n\nApp registration (where ``X`` is dependent on your account)\n    https://usX.admin.mailchimp.com/account/oauth2/\n\nFill in the form with the following URL for local development:\n\nDevelopment callback URL\n    https://127.0.0.1:8000/accounts/mailchimp/login/callback/\n\nTesting Locally\n***************\n\nNote the requirement of **https**. If you would like to test OAuth2\nauthentication locally before deploying a default django project will raise\nerrors because development mode does not support ``https``. One means of\ncircumventing this is to install ``django-extensions``::\n\n    pip install django-extensions\n\nadd it to your ``INSTALLED_APPS``\n\n.. code-block:: python\n\n    INSTALLED_APPS = (\n        ...\n        'django_extensions',\n        ...\n    )\n\nand then run::\n\n    ./manage.py runserver_plus --cert cert\n\nwhich should allow you to test locally via https://127.0.0.1:8000. Some\nbrowsers may require enabling this on localhost and not support by default and\nask for permission.\n"
  },
  {
    "path": "docs/socialaccount/providers/mailcow.rst",
    "content": "Mailcow\n-------\n\nTo register the app with Mailcow, follow the applicable sections of the guide\nfor Nextcloud authentication in the Mailcow documentation::\n\n   https://docs.mailcow.email/third_party/nextcloud/third_party-nextcloud/\n\nThe scope ``profile`` is used automatically and not configurable.\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        \"mailcow\": {\n            # Server to which to authenticate. Default value: https://hosted.mailcow.de\n            \"SERVER\": \"https://<mailcow-hostname>\",\n            # Definition of the app with the client ID and secret configured in Mailcow\n            \"APP\": {\n                # ...\n            }\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/mediawiki.rst",
    "content": "MediaWiki\n---------\n\nMediaWiki OAuth2 documentation:\n    https://www.mediawiki.org/wiki/OAuth/For_Developers\n\nThe following MediaWiki settings are available:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'mediawiki': {\n            'REST_API': 'https://meta.wikimedia.org/w/rest.php',\n            'USERPAGE_TEMPLATE': 'https://meta.wikimedia.org/wiki/{username}',\n            # Identify your application with a descriptive user agent.\n            # Format (generic template):\n            #   <client>/<version> (<contact info>) [<extra lib>/<version> ...]\n            # Contact info can be a user page URL, project URL, or email.\n            # Example (bot):\n            'USER_AGENT': 'CoolBot/1.2 (+https://example.org/coolbot/; operator@example.org) django-allauth',\n        }\n    }\n\nREST_API:\n    Base URL of the MediaWiki site's REST API.\nUSERPAGE_TEMPLATE:\n    Link template for linking to users. Must have a ``{username}`` format field.\nUSER_AGENT:\n    Custom User-Agent header sent with API requests. Wikimedia requires that\n    automated clients send a descriptive User-Agent string with contact\n    information. Generic defaults (e.g. ``python-requests/x``) or absent\n    headers may be blocked or heavily rate limited. The recommended pattern is::\n\n        <client>/<version> (<contact>) [<library>/<version> ...]\n\n    where ``<contact>`` lets site operators reach you (URL or email). If you\n    run a bot, consider including the word ``bot`` (any case) so traffic can be\n    classified correctly. Do not spoof browser user agents.\n\n    If not set, a generic ``django-allauth`` value is used; you should override\n    this for production.\n\nWith the default settings, Wikimedia user identities (meta.wikimedia.org) will be used.\n\nApp registration for Wikimedia wikis:\n    https://meta.wikimedia.org/wiki/Special:OAuthConsumerRegistration/propose\n"
  },
  {
    "path": "docs/socialaccount/providers/microsoft.rst",
    "content": "Microsoft\n---------\n\n.. _ms-graph:\n\nMicrosoft Graph\n^^^^^^^^^^^^^^^\n\n\nMicrosoft Graph API is the gateway to connect to mail, calendar, contacts,\ndocuments, directory, devices and more.\n\nApps can be registered (for consumer key and secret) here\n    https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade\n\nBy default, ``common`` (``organizations`` and ``consumers``) tenancy is configured\nfor the login. To restrict it, change the ``tenant`` setting as shown below.\n\n.. code-block:: python\n\n  SOCIALACCOUNT_PROVIDERS = {\n      \"microsoft\": {\n          \"APPS\": [\n              {\n                  \"client_id\": \"<insert-id>\",\n                  \"secret\": \"<insert-secret>\",\n                  \"settings\": {\n                      \"tenant\": \"organizations\",\n                      # Optional: override URLs (use base URLs without path)\n                      \"login_url\": \"https://login.microsoftonline.com\",\n                      \"graph_url\": \"https://graph.microsoft.com\",\n                  }\n              }\n          ]\n      }\n  }\n\n.. note:: When you have configured your application to use single tenant authentication make sure to use the fragment above to set the ``\"tenant\"`` value to ``\"organizations\"`` in order to prevent the following error:\n\n   .. error:: AADSTS50194: Application 'application id' (application name) is not configured as a multi-tenant application. Usage of the /common endpoint is not supported for such applications created after '10/15/2018'. Use a tenant-specific endpoint or configure the application to be multi-tenant.\n\n\nMicrosoft Azure Entra (OpenID Connect)\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nFor single instances of Microsoft Azure Entra, you should follow the\ninstructions at :ref:`ms-graph`.\n\nIf you want to use Microsoft Azure Entra as an OpenID Connect provider, e.g. to\nsupport multiple Entra instances, follow the OpenID Connect provider\ninstructions, and configure the following in the settings:\n\n.. code-block:: python\n\n    {\n        \"server_url\": \"https://login.microsoftonline.com/common/v2.0\",\n        \"token_auth_method\": \"client_secret_basic\"\n    }\n\n- Make sure you change the ``common`` to your tenant id if you are using a single tenant.\n- Make sure you added the ``v2.0`` to the end of the URL. Otherwise the email address won't be passed back.\n"
  },
  {
    "path": "docs/socialaccount/providers/miro.rst",
    "content": "Miro\n----\n\nCreate your app here and acquire Client ID and Client Secret\n    https://miro.com/app/settings/user-profile/apps\n\nDevelopment callback URL\n    http://localhost:8000/accounts/miro/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/naver.rst",
    "content": "Naver\n-----\n\nApp registration (get your key and secret here)\n    https://developers.naver.com/appinfo\n\nDevelopment callback URL\n    http://localhost:8000/accounts/naver/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/netiq.rst",
    "content": "NetIQ/Microfocus AccessManager (NAM)\n------------------------------------\n\nThe following AccessManager settings are available:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'netiq': {\n            'NETIQ_URL': 'https://my.identity.provider.example.org',\n        }\n    }\n\n\nApp registration (get your key and secret here) is done by the administrator of your NetIQ/Microfocus AccessManager.\n"
  },
  {
    "path": "docs/socialaccount/providers/nextcloud.rst",
    "content": "NextCloud\n---------\n\nThe following NextCloud settings are available:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        \"nextcloud\": {\n            \"APPS\": [\n                {\n                    \"client_id\": \"<insert-id>\",\n                    \"secret\": \"<insert-secret>\",\n                    \"settings\": {\n                        \"server\": \"https://nextcloud.example.org\",\n                    }\n                }\n            ]\n          }\n    }\n\n\nApp registration (get your key and secret here)\n\n    https://nextcloud.example.org/settings/admin/security\n"
  },
  {
    "path": "docs/socialaccount/providers/notion.rst",
    "content": "Notion\n------\n\nAfter creating an integration perform the following steps:\n\n1. Navigate to your integration then Capabilities, User Capabilities, and select 'Read user information including email addresses.' \n2. Click 'Distribution' and check 'yes' on 'Do you want to make this integration public?'.\n3. In the 'Redirect URL' paste the callback URL below. Notion only allows using 'http' for 'localhost' - do not use 127.0.0.1.\n\nApp registration (get your key and secret here)\n    https://www.notion.so/my-integrations\n\nDevelopment callback URL\n    http://localhost:8000/accounts/notion/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/oauth2.rst",
    "content": "OAuth 2.0\n---------\n\nThis section documents OAuth 2.0 specifics that are shared across all OAuth 2.0\nbased providers, including (but not limited to):\n\n- :doc:`google`\n- :doc:`tumblr_oauth2`\n- :doc:`twitter_oauth2`\n- :doc:`vimeo_oauth2`\n- :doc:`openid_connect`\n  - :doc:`keycloak`\n\n.. _oauth2-authorization-request-parameters:\n\nAuthorization Request Parameters\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nOptional parameters can be provided as a dictionary under the key ``auth_params``.\n\n.. attention::\n\n    Some providers might not support each of these parameters.\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        \"<oauth2 based provider>\": {\n            \"APPS\": [\n                {\n                    \"provider_id\": \"my-server\",\n                    \"name\": \"My Login Server\",\n                    \"client_id\": \"your.service.id\",\n                    \"secret\": \"your.service.secret\",\n                    \"settings\": {\n                        \"server_url\": \"https://my.server.example.com\",\n                        \"auth_params\": {\n                          \"prompt\": \"login\",\n                        }\n                    },\n                },\n            ]\n        }\n    }\n\nThis configuration example will tell the provider instance, ``My Login Server``,\nto prompt the user for reauthentication.\n"
  },
  {
    "path": "docs/socialaccount/providers/odnoklassniki.rst",
    "content": "Odnoklassniki\n-------------\n\nApp registration (get your key and secret here)\n    http://apiok.ru/wiki/pages/viewpage.action?pageId=42476486\n\nDevelopment callback URL\n    http://example.com/accounts/odnoklassniki/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/okta.rst",
    "content": "Okta\n-----\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'okta': {\n            'OKTA_BASE_URL': 'example.okta.com',\n            'OAUTH_PKCE_ENABLED': True,\n        }\n    }\n\nOkta OIDC\n    https://developer.okta.com/docs/reference/api/oidc/\n"
  },
  {
    "path": "docs/socialaccount/providers/openid.rst",
    "content": "OpenID\n------\n\nThe OpenID provider requires dependencies that are not installed by\ndefault. Install using::\n\n    $ pip install \"django-allauth[socialaccount,openid]\"\n\nThe provider does not require any settings per se. However, a typical OpenID\nlogin page presents the user with a predefined list of OpenID providers and\nallows the user to input their own OpenID identity URL in case their provider is\nnot listed by default. The list of providers displayed by the builtin templates\ncan be configured as follows:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'openid': {\n            'SERVERS': [\n                {\n                    'id': 'yahoo',\n                    'name': 'Yahoo',\n                    'openid_url': 'http://me.yahoo.com',\n                },\n                {\n                    'id': 'hyves',\n                    'name': 'Hyves',\n                    'openid_url': 'http://hyves.nl',\n                },\n                {\n                    'id': 'google',\n                    'name': 'Google',\n                    'openid_url': 'https://www.google.com/accounts/o8/id',\n                },\n            ]\n        }\n    }\n\nYou can manually specify extra_data you want to request from server as follows::\n\n    SOCIALACCOUNT_PROVIDERS = \\\n        { 'openid':\n            { 'SERVERS':\n                [\n                    {\n                        'id': 'mojeid',\n                        'name': 'MojeId',\n                        'openid_url': 'https://mojeid.cz/endpoint/',\n                        'extra_attributes': [\n                            ('phone', ''http://axschema.org/contact/phone/default', False),\n                            ('birth_date', 'http://axschema.org/birthDate', False),\n                        ]\n                    },\n                ]\n            }\n        }\n\nAttributes are in form (id, name, required) where id is key in extra_data field of socialaccount,\nname is identifier of requested attribute and required specifies whether attribute is required.\n\nIf you want to manually include login links yourself, you can use the\nfollowing template tag:\n\n.. code-block:: python\n\n    {% load socialaccount %}\n    <a href=\"{% provider_login_url \"openid\" openid=\"https://www.google.com/accounts/o8/id\" next=\"/success/url/\" %}\">Google</a>\n\nThe OpenID provider can be forced to operate in stateless mode as follows::\n\n    SOCIALACCOUNT_PROVIDERS = \\\n        { 'openid':\n            { 'SERVERS':\n                [\n                    {\n                        'id': 'steam',\n                        'name': 'Steam',\n                        'openid_url': 'https://steamcommunity.com/openid',\n                        'stateless': True,\n                    },\n                ]\n            }\n        }\n"
  },
  {
    "path": "docs/socialaccount/providers/openid_connect.rst",
    "content": "OpenID Connect\n--------------\n\nThe OpenID Connect provider provides access to multiple independent OpenID\nConnect (sub)providers. You configure these (sub)providers by adding apps to the\nconfiguration of the overall OpenID connect provider. Each app represents a\nstandalone OpenID Connect provider:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        \"openid_connect\": {\n            # Optional PKCE defaults to False, but may be required by your provider\n            # Can be set globally, or per app (settings).\n            \"OAUTH_PKCE_ENABLED\": True,\n            \"APPS\": [\n                {\n                    \"provider_id\": \"my-server\",\n                    \"name\": \"My Login Server\",\n                    \"client_id\": \"your.service.id\",\n                    \"secret\": \"your.service.secret\",\n                    \"settings\": {\n                        # When enabled, an additional call to the userinfo\n                        # endpoint takes place. The data returned is stored in\n                        # `SocialAccount.extra_data`. When disabled, the (decoded) ID\n                        # token payload is used instead.\n                        \"fetch_userinfo\": True,\n                        \"oauth_pkce_enabled\": True,\n                        \"server_url\": \"https://my.server.example.com\",\n                        # Optional token endpoint authentication method.\n                        # May be one of \"client_secret_basic\", \"client_secret_post\"\n                        # If omitted, a method from the the server's\n                        # token auth methods list is used\n                        \"token_auth_method\": \"client_secret_basic\",\n                        # The field to be used as the account ID.\n                        \"uid_field\": \"sub\",\n                    },\n                },\n                {\n                    \"provider_id\": \"other-server\",\n                    \"name\": \"Other Login Server\",\n                    \"client_id\": \"your.other.service.id\",\n                    \"secret\": \"your.other.service.secret\",\n                    \"settings\": {\n                        \"server_url\": \"https://other.server.example.com\",\n                    },\n                },\n            ]\n        }\n    }\n\nThis configuration example will create two independent provider instances,\n``My Login Server`` and ``Other Login Server``.\n\nThe OpenID Connect callback URL for each configured server is at\n``/accounts/oidc/{id}/login/callback/`` where ``{id}`` is the configured app's\n``provider_id`` value (``my-server`` or ``other-server`` in the above example).\n\nAuthentication Request's Optional Parameters\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nSee :ref:`oauth2-authentication-optional-parameters`.\n"
  },
  {
    "path": "docs/socialaccount/providers/openstreetmap.rst",
    "content": "OpenStreetMap\n-------------\n\nThe builtin OpenStreetMap provider is using the now deprecated OAuth 1.0\nprotocol.  You can no longer create OAuth 1.0 clients, meaning this provider is\nthere for legacy reasons only.\n\nIn order to make use of the new OSM OAuth 2.0 protocol, you can simply configure an OpenID Connect app.\n\nFirst, register your client application here: https://www.openstreetmap.org/oauth2/applications\n\nThen, configure the settings (or, setup a ``SocialApp``) using the client ID/secret you received while registering the application:\n\n.. code-block:: python\n\n  SOCIALACCOUNT_PROVIDERS = {\n    \"openid_connect\": {\n        \"APPS\": [\n            {\n                \"provider_id\": \"openstreetmap\",\n                \"name\": \"OpenStreetMap\",\n                \"client_id\": \"<insert-id>\",\n                \"secret\": \"<insert-secret>\",\n                \"settings\": {\n                    \"server_url\": \"https://www.openstreetmap.org/.well-known/oauth-authorization-server\",\n                    \"scope\": [\"openid\", \"read_prefs\"],\n                },\n            },\n        ]\n    },\n  },\n\n\nFor more information, consult the OpenStreetMap OAuth documentation: https://wiki.openstreetmap.org/wiki/OAuth\n"
  },
  {
    "path": "docs/socialaccount/providers/orcid.rst",
    "content": "ORCID\n-----\n\nThe ORCID provider should work out of the box provided that you are using the\nProduction ORCID registry and the public API. In other settings, you will need\nto define the API you are using in your site's settings, as follows:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'orcid': {\n            # Base domain of the API. Default value: 'orcid.org', for the production API\n            'BASE_DOMAIN':'sandbox.orcid.org',  # for the sandbox API\n            # Member API or Public API? Default: False (for the public API)\n            'MEMBER_API': True,  # for the member API\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/patreon.rst",
    "content": "Patreon\n-------\n\nThe following Patreon settings are available:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'patreon': {\n            'VERSION': 'v1',\n            'SCOPE': ['pledges-to-me', 'users', 'my-campaign'],\n        }\n    }\n\nVERSION:\n    API version. Either ``v1`` or ``v2``. Defaults to ``v1``.\n\nSCOPE:\n    Defaults to the scope above if using API v1. If using v2, the scope defaults to ``['identity', 'identity[email]', 'campaigns', 'campaigns.members']``.\n\nAPI documentation:\n    https://www.patreon.com/platform/documentation/clients\n\nApp registration (get your key and secret for the API here):\n    https://www.patreon.com/portal/registration/register-clients\n\nDevelopment callback URL\n    http://127.0.0.1:8000/accounts/patreon/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/paypal.rst",
    "content": "Paypal\n------\n\nThe following Paypal settings are available:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'paypal': {\n            'SCOPE': ['openid', 'email'],\n            'MODE': 'live',\n        }\n    }\n\nSCOPE:\n    In the Paypal developer site, you must also check the required attributes\n    for your application. For a full list of scope options, see\n    https://developer.paypal.com/docs/integration/direct/identity/attributes/\n\nMODE:\n    Either ``live`` or ``test``. Set to test to use the Paypal sandbox.\n\nApp registration (get your key and secret here)\n    https://developer.paypal.com/webapps/developer/applications/myapps\n\nDevelopment callback URL\n    http://example.com/accounts/paypal/login/callback\n"
  },
  {
    "path": "docs/socialaccount/providers/pinterest.rst",
    "content": "Pinterest\n---------\n\nThe Pinterest OAuth2 documentation:\n\n    # v1  # has been deprecated\n    https://developers.pinterest.com/docs/api/overview/#authentication\n\n    # v3  # plan to enforce an end of life on June 30, 2023.\n    https://developers.pinterest.com/docs/redoc/#section/User-Authorization\n\n    # v5\n    https://developers.pinterest.com/docs/getting-started/authentication/\n\nYou can optionally specify additional permissions to use. If no ``SCOPE``\nvalue is set, the Pinterest provider will use reading scope by default.\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'pinterest': {\n            'SCOPE': ['user_accounts:read'],\n            \"API_VERSION\": \"v5\",\n        }\n    }\n\nSCOPE:\n    For a full list of scope options, see\n\n    # v1\n    https://developers.pinterest.com/docs/api/overview/#scopes\n\n    # v3\n    https://developers.pinterest.com/docs/redoc/#section/User-Authorization/OAuth-scopes\n\n    # v5\n    https://developers.pinterest.com/docs/getting-started/scopes/\n"
  },
  {
    "path": "docs/socialaccount/providers/pocket.rst",
    "content": "Pocket\n-------------\n\nApp registration (get your consumer key here)\n    https://getpocket.com/developer/apps/\n"
  },
  {
    "path": "docs/socialaccount/providers/questrade.rst",
    "content": "Questrade\n---------\n\nApp registration (get your key here, follow \"Creating your first personal app\")\n    https://www.questrade.com/api/documentation/getting-started\n    https://apphub.questrade.com/UI/UserApps.aspx\n\nDevelopment callback URL (HTTPS is required).\n    https://example.com/accounts/questrade/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/quickbooks.rst",
    "content": "QuickBooks\n----------\n\nApp registration (get your key and secret here)\n    https://developers.intuit.com/v2/ui#/app/startcreate\n\nDevelopment callback URL\n    http://localhost:8000/accounts/quickbooks/login/callback/\n\nYou can specify sandbox mode by adding the following to the SOCIALACCOUNT_PROVIDERS in your settings.\n\nYou can also add space-delimited scope to utilize the QuickBooks Payments and Payroll API\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'quickbooks': {\n            'SANDBOX': TRUE,\n            'SCOPE': [\n              'openid',\n              'com.intuit.quickbooks.accounting com.intuit.quickbooks.payment',\n              'profile',\n              'phone',\n            ]\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/reddit.rst",
    "content": "Reddit\n------\n\nApp registration (get your key and secret here)\n    https://www.reddit.com/prefs/apps/\n\nDevelopment callback URL\n    http://localhost:8000/accounts/reddit/login/callback/\n\nBy default, access to Reddit is temporary. You can specify the ``duration``\nauth parameter to make it ``permanent``.\n\nYou can optionally specify additional permissions to use. If no ``SCOPE``\nvalue is set, the Reddit provider will use ``identity`` by default.\n\nIn addition, you should override your user agent to comply with Reddit's API\nrules, and specify something in the format\n``<platform>:<app ID>:<version string> (by /u/<reddit username>)``. Otherwise,\nyou will risk additional rate limiting in your application.\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'reddit': {\n            'AUTH_PARAMS': {'duration': 'permanent'},\n            'SCOPE': ['identity', 'submit'],\n            'USER_AGENT': 'django:myappid:1.0 (by /u/yourredditname)',\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/salesforce.rst",
    "content": "Salesforce\n----------\n\nThe Salesforce provider requires you to set the login VIP as the provider\nmodel's 'key' (in addition to client id and secret). Production environments\nuse https://login.salesforce.com/. Sandboxes use https://test.salesforce.com/.\n\nHTTPS is required for the callback.\n\nDevelopment callback URL\n    https://localhost:8000/accounts/salesforce/login/callback/\n\nSalesforce OAuth2 documentation\n    https://developer.salesforce.com/page/Digging_Deeper_into_OAuth_2.0_on_Force.com\n\nTo Use:\n\n- Include allauth.socialaccount.providers.salesforce in INSTALLED_APPS\n- In a new Salesforce Developer Org, create a Connected App\n  with OAuth (minimum scope id, openid), and a callback URL\n- Create a Social application in Django admin, with client id,\n  client key, and login_url (in \"key\" field)\n"
  },
  {
    "path": "docs/socialaccount/providers/saml.rst",
    "content": "SAML\n----\n\nSAML 2.0 is supported out of the box. However, the required dependencies are not\ninstalled by default. Therefore, you will need to specifcy the ``saml`` extra when\ninstalling the package::\n\n    $ pip install \"django-allauth[saml]\"\n\nNote that it will use some python wrappers for ``xml``. System packages may need\nto be installed (see `dependencies of Python3-SAML\n<https://github.com/SAML-Toolkits/python3-saml?tab=readme-ov-file#dependencies>`_).\n\nWhen you need to support SAML based authentication, often you need to support\nmultiple organizations, each having their own SAML based Identity Provider\n(IdP). The way this translates to allauth is as follows:\n\n- The allauth SAML endpoints all include an organization slug. For example,\n  ``/accounts/saml/<organization_slug>/login/`` is used to initiate the SAML login\n  flow.\n\n- The organization slug is used to lookup the SAML IdP configuration, which is\n  stored in a ``SocialApp``, or, its settings based\n  ``SOCIALACCOUNT_PROVIDERS['saml']['APPS']`` counterpart.\n\n- As per the SAML specification, each IdP is identified by an entity ID. Entity\n  IDs typically use a URI based notation, and are therefore not suitable to be\n  used as the organization slug.  So, you need to be aware that allauth has two\n  ways of identifying the ``SocialApp`` -- via the SAML entity ID, and, via the\n  organization slug.\n\n- For each user signing in via the SAML provider, a ``SocialAccount`` record is\n  created. Here, the combination of ``SocialAccount.provider`` and\n  ``SocialAccount.uid`` is expected to be unique. The ``uid`` identifier is the\n  SAML account ID which is locally unique within the IdP. Therefore, if you are\n  using multiple IdP's ``SocialAccount.provider`` cannot be set to\n  ``\"saml\"``. Instead, the IdP entity ID would be a good candidate.\n\n- The SAML account attributes can differ per IdP. Therefore, additional\n  configuration is needed to be able to extract relevant account attributes,\n  such as the ``uid`` and ``email``. This is done by setting up an attribute\n  mapping.\n\nHow all of the above is configured in practice is shown below. Note that here we\nare using the settings based configuration, but you can setup the ``SocialApp``\nvia the Django admin as well:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        \"saml\": {\n            # Here, each app represents the SAML provider configuration of one\n            # organization.\n            \"APPS\": [\n                {\n                    # Used for display purposes, e.g. over by: {% get_providers %}\n                    \"name\": \"Acme Inc\",\n\n                    # Accounts signed up via this provider will have their\n                    # `SocialAccount.provider` value set to this ID. The combination\n                    # of this value and the `uid` must be unique. The IdP entity ID is a\n                    # good choice for this.\n                    \"provider_id\": \"urn:example.com\",\n\n                    # The organization slug is configured by setting the\n                    # `client_id` value. In this example, the SAML login URL is:\n                    #\n                    #     /accounts/saml/acme-inc/login/\n                    \"client_id\": \"acme-inc\",\n\n                    # The fields above are common `SocialApp` fields. For SAML,\n                    # additional configuration is needed, which is placed in\n                    # `SocialApp.settings`:\n                    \"settings\": {\n\n                        # Mapping account attributes to upstream (IdP specific) attributes.\n                        # If left empty, an attempt will be done to map the attributes using\n                        # built-in defaults.\n                        \"attribute_mapping\": {\n                            \"uid\": \"http://schemas.auth0.com/clientID\",\n                            \"email_verified\": \"http://schemas.auth0.com/email_verified\",\n                            \"email\": \"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress\",\n                        },\n\n                        # The following setting allows you to force the use of nameID as email.\n                        # This can be useful if you are using a SAML IdP that is broken in some way and\n                        # does not allow use of the emailAddress nameid format\n                        \"use_nameid_for_email\": False,\n\n                        # The configuration of the IdP.\n                        \"idp\": {\n                            # The entity ID of the IdP is required.\n                            \"entity_id\": \"urn:example.com\",\n\n                            # Then, you can either specify the IdP's metadata URL:\n                            \"metadata_url\": \"https://example.com/saml2/metadata\",\n\n                            # Or, you can inline the IdP parameters here as follows:\n                            \"sso_url\": \"https://example.com/saml2/sso\",\n                            \"slo_url\": \"https://example.com/saml2/slo\",\n                            \"x509cert\": \"\"\"\n    -----BEGIN CERTIFICATE-----\n    MIIDHTCCAgWgAwIBAgIJLogff5x+S0BlMA0GCSqGSIb3DQEBCwUAMCwxKjAoBgNV\n    BAMTIWRldi1uYXAybWY1ZTFwMXR3Z2Rv................................\n    ................................G7qmyqcXRaf9HAuL/MvWz6zd96Ay6WHM\n    pXk92/DyUV48JxK/Bl7Bj8qjl5w5R7Dwps6wj+69PIAg\n    -----END CERTIFICATE-----\n    \"\"\",\n                        },\n                        # The configuration of the SP.\n                        \"sp\": {\n                            # Optional entity ID of the SP. If not set, defaults to the `saml_metadata` urlpattern\n                            \"entity_id\": \"https://serviceprovider.com/sso/sp/metadata.xml\",\n                        },\n\n                        # Advanced settings.\n                        \"advanced\": {\n                            \"allow_repeat_attribute_name\": True,\n                            \"allow_single_label_domains\": False,\n                            \"authn_request_signed\": False,\n                            \"digest_algorithm\": \"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\",\n                            \"logout_request_signed\": False,\n                            \"logout_response_signed\": False,\n                            \"metadata_signed\": False,\n                            \"name_id_encrypted\": False,\n                            \"name_id_format\": \"urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified\",\n                            \"private_key\": \"MIID/zCCAuegAwIBAg...VGgdy+xoA==\",\n                            \"reject_deprecated_algorithm\": True,\n                            # Due to security concerns, IdP initiated SSO is rejected by default.\n                            \"reject_idp_initiated_sso\": True,\n                            \"signature_algorithm\": \"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\",\n                            \"want_assertion_encrypted\": False,\n                            \"want_assertion_signed\": False,\n                            \"want_attribute_statement\": True,\n                            \"want_message_signed\": False,\n                            \"want_name_id\": False,\n                            \"want_name_id_encrypted\": False,\n                            \"x509cert\": \"MIIEvQIBADANB...oddbXECo=\",\n                            \"metadata_valid_until\": None,\n                            \"metadata_cache_duration\": None\n                        },\n                        \"contact_person\": {\n                            \"technical\": {\n                                \"givenName\": \"Alice\",\n                                \"emailAddress\": \"alice@example.com\",\n                            },\n                            \"administrative\": {\n                                \"givenName\": \"Bob\",\n                                \"emailAddress\": \"bob@example.com\",\n                            },\n                        },\n                    },\n                },\n            ]\n        }\n    }\n\n\nThe ``advanced`` configuration corresponds to the SP. In particular, the ``x509cert``\nis the public cert of the SP and ``private_key`` is the corresponding private key\n(this should remain secret, do not commit it or revoke it).\nBy setting them, the messages are automatically signed. In order to use encryption,\nthe attributes ``want_assertion_encrypted`` or ``want_name_id_encrypted`` should be\nset to ``True``. Encryption will use the same certificate as the signing. If signing\nor encryption are active, they will automatically appear in the metadata URL.\n\nIn your templates, you can construct login URLs using the following template tag::\n\n    {% load socialaccount %}\n    {% provider_login_url \"<provider_id>\" %}\n\n\nThe SAML provider has the following endpoints:\n\n- ``/accounts/saml/<organization_slug>/login/``: Initiate a login.\n\n- ``/accounts/saml/<organization_slug>/acs/``: Assertion Consumer Service URL.\n\n- ``/accounts/saml/<organization_slug>/sls/``: Single Logout Service URL.\n\n- ``/accounts/saml/<organization_slug>/metadata/``: Metadata URL.\n\nGuidelines\n**********\n\n- Most SAML IdPs require TLS (formerly SSL) to be used, making testing with\n  ``runserver`` challenging. Make sure to configure Django to use HTTPS.\n- If using a reverse proxy, be sure to set Django settings\n  ``USE_X_FORWARDED_HOST = True``,\n  ``SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')``, and\n  ``SECURE_SSL_REDIRECT = True``. In your web server's reverse proxy\n  configuration, ensure that you set request headers\n  ``X_FORWARDED_PROTO 'https' env=HTTPS`` and ``X-Forwarded-Ssl on``.\n- Cookies must also be secure; ensure that ``CSRF_COOKIE_DOMAIN`` and\n  ``SESSION_COOKIE_DOMAIN`` are set to ``yourdomain.com``, and that\n  ``CSRF_COOKIE_SECURE``  and ``SESSION_COOKIE_SECURE`` are ``True`` in your Django\n  settings.\n- Test with your browser in privacy / incognito mode, check your developer\n  console to ensure that cookies are being set correctly, and use a tool like\n  SAML Tracer\n  (`Firefox <https://addons.mozilla.org/en-US/firefox/addon/saml-tracer/>`_\n  / `Chromium <https://chromewebstore.google.com/detail/saml-tracer/mpdajninpobndbfcldcmbpnnbhibjmch>`_)\n  to inspect the SAML messages being exchanged. SAML Tracer is also useful for\n  looking up the IdP SAML values to map to ``uid``, ``email``, and ``email_verified``\n  in the ``attribute_mapping`` configuration.\n"
  },
  {
    "path": "docs/socialaccount/providers/sharefile.rst",
    "content": "ShareFile\n---------\n\nThe following ShareFile settings are available.\n  https://api.sharefile.com/rest/\n\nSUBDOMAIN:\n Subdomain of your organization with ShareFile.  This is required.\n\n Example:\n      ``test`` for ``https://test.sharefile.com``\n\nAPICP:\n Defaults to ``secure``.  Refer to the ShareFile documentation if you\n need to change this value.\n\nDEFAULT_URL:\n Defaults to ``https://secure.sharefile.com``  Refer to the ShareFile\n documentation if you need to change this value.\n\n\nExample:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n    'sharefile': {\n        'SUBDOMAIN': 'TEST',\n        'APICP': 'sharefile.com',\n        'DEFAULT_URL': 'https://secure.sharefile.com',\n                 }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/shopify.rst",
    "content": "Shopify\n-------\n\nThe Shopify provider requires a ``shop`` parameter to login. For\nexample, for a shop ``petstore.myshopify.com``, use this::\n\n    /accounts/shopify/login/?shop=petstore\n\nYou can create login URLs like these as follows:\n\n.. code-block:: python\n\n    {% provider_login_url \"shopify\" shop=\"petstore\" %}\n\nFor setting up authentication in your app, use this url as your ``App URL``\n(if your server runs at localhost:8000)::\n\n    http://localhost:8000/accounts/shopify/login/\n\nAnd set ``Redirection URL`` to::\n\n    http://localhost:8000/accounts/shopify/login/callback/\n\n**Embedded Apps**\n\nIf your Shopify app is embedded you will want to tell allauth to do the required JS (rather than server) redirect.::\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'shopify': {\n            'IS_EMBEDDED': True,\n        }\n    }\n\nNote that there is more an embedded app creator must do in order to have a page work as an iFrame within\nShopify (building the x_frame_exempt landing page, handing session expiration, etc...).\nHowever that functionality is outside the scope of django-allauth.\n\n**Online/per-user access mode**\nShopify has two access modes, offline (the default) and online/per-user. Enabling 'online' access will\ncause all-auth to tie the logged in Shopify user to the all-auth account (rather than the shop as a whole).::\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'shopify': {\n            'AUTH_PARAMS': {'grant_options[]': 'per-user'},\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/slack.rst",
    "content": "Slack\n-----\n\nApp registration (get your key and secret here)\n    https://api.slack.com/apps/new\n\nDevelopment callback URL\n    http://example.com/accounts/slack/login/callback/\n\nAPI documentation\n    https://api.slack.com/docs/sign-in-with-slack\n"
  },
  {
    "path": "docs/socialaccount/providers/snapchat.rst",
    "content": "Snapchat\n--------\n\nApp registration (get your key and secret here)\n    https://kit.snapchat.com/manage/\n\nDevelopment callback URL\n    http://example.com/accounts/snap/login/callback/\n\nAPI documentation\n    https://docs.snap.com/docs/snap-kit/login-kit/overview\n"
  },
  {
    "path": "docs/socialaccount/providers/soundcloud.rst",
    "content": "SoundCloud\n----------\n\nSoundCloud allows you to choose between OAuth1 and OAuth2. Choose the latter.\n\nApp registration (get your key and secret here)\n    http://soundcloud.com/you/apps/new\n\nDevelopment callback URL\n    http://example.com/accounts/soundcloud/login/callback/\n\n\nID to URN Migration\n^^^^^^^^^^^^^^^^^^^\n\nMid 2025, Soundcloud migrated away from using IDs for user accounts to URNs,\nsee: https://developers.soundcloud.com/blog/urn-num-to-string\n\nTherefore, starting from 65.10.0, the allauth provider now uses the user ``urn``\ninstead of the ``id`` as the ID for social accounts.  If you have SoundCloud\nalready up and running, and are migration to allauth 65.10.0 or higher, you will\nhave to address this breaking change.  Consider migrating existing Soundcloud\nSocialAccount records manually, for example, using::\n\n    from django.db.models import F, Value\n    from django.db.models.functions import Concat\n\n    from allauth.socialaccount.models import SocialAccount\n\n\n    SocialAccount.objects.filter(\n        provider=\"soundcloud\"\n    ).exclude(\n        uid__startswith=\"soundcloud:users:\"\n    ).update(\n        uid=Concat(Value(\"soundcloud:users:\"), F(\"uid\"))\n    )\n"
  },
  {
    "path": "docs/socialaccount/providers/stackexchange.rst",
    "content": "Stack Exchange\n--------------\n\nRegister your OAuth2 app over at ``http://stackapps.com/apps/oauth/register``.\nDo not enable \"Client Side Flow\". For local development you can simply use\n\"localhost\" for the OAuth domain.\n\nAs for all providers, provider specific data is stored in\n``SocialAccount.extra_data``. For Stack Exchange we need to choose what data to\nstore there by choosing the Stack Exchange site (e.g. Stack Overflow, or\nServer Fault). This can be controlled by means of the ``SITE`` setting:\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'stackexchange': {\n            'SITE': 'stackoverflow',\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/steam.rst",
    "content": "Steam\n-----\n\nSteam is an OpenID-compliant provider. However, the `steam` provider allows\naccess to more of the user's details such as username, full name, avatar, etc.\n\nIts implementation requires dependencies that are not installed by\ndefault. Install using::\n\n    $ pip install \"django-allauth[socialaccount,steam]\"\n\nYou need to register an API key here:\n    https://steamcommunity.com/dev/apikey\n\nCopy the Key supplied by the website above into BOTH Client ID and Secret\nKey fields of the Social Application.\n"
  },
  {
    "path": "docs/socialaccount/providers/stocktwits.rst",
    "content": "Stocktwits\n----------\n\nApp Registration\n  https://api.stocktwits.com/developers/apps/new\n\n- Site Domain, Must be an external url (127.0.0.1 and localhost do not work).\n- Consumer key is your ``client id``\n- Consumer secret is your ``secret key``\n"
  },
  {
    "path": "docs/socialaccount/providers/strava.rst",
    "content": "Strava\n------\n\nRegister your OAuth2 app in api settings page:\n\n    https://strava.com/settings/api\n\nIn this page you will get your key and secret\n\nDevelopment callback URL (only the domain is required on strava.com/settings/api)\n\n    http://example.com/accounts/strava/login/callback/\n\nFor more information:\nStrava auth documentation: https://developers.strava.com/docs/authentication/\nAPI documentation: https://developers.strava.com/docs/reference/\n"
  },
  {
    "path": "docs/socialaccount/providers/stripe.rst",
    "content": "Stripe\n------\n\nYou register your OAUth2 app via the Connect->Settings page of the Stripe\ndashboard:\n\n https://dashboard.stripe.com/account/applications/settings\n\nThis page will provide you with both a Development and Production `client_id`.\n\nYou can also register your OAuth2 app callback on the Settings page in the\n\"Website URL\" box, e.g.:\n\n http://example.com/accounts/stripe/login/callback/\n\nHowever, the OAuth2 secret key is not on this page. The secret key is the same\nsecret key that you use with the Stripe API generally. This can be found on the\nStripe dashboard API page:\n\n https://dashboard.stripe.com/account/apikeys\n\nSee more in documentation\n https://stripe.com/docs/connect/standalone-accounts\n"
  },
  {
    "path": "docs/socialaccount/providers/telegram.rst",
    "content": "Telegram\n--------\n\nTelegram does not strictly regulate the authorization expiration\ntime, so you may need to set your own expiration time, which can be\nless than the default value.\nYou can also set this parameter in Social applications settings as\njson ``{\"auth_date_validity\": 100}``.\nThe default value of the ``auth_date_validity`` is 30 seconds.\n\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'telegram': {\n            'APP': {\n                'client_id': '<bot_id>',\n\n                # NOTE: For the secret, be sure to provide the complete bot token,\n                # which typically includes the bot ID as a prefix.\n                'secret': '<bot token>',\n            },\n            'AUTH_PARAMS': {'auth_date_validity': 30},\n        }\n    }\n\n.. code-block:: python\n\n\nAttention! If your server time is different from the telegram\nserver time, you need NTP.\n"
  },
  {
    "path": "docs/socialaccount/providers/tiktok.rst",
    "content": "TikTok\n------\n\nIf your app is still in testing/development please complete the Integration Assessment for Unreleased Apps instead, and submit it to be reviewed by our team.\n\nHow to Submit a Integration Assessment for Unreleased App:\n\n1. Sign up for a TikTok for Developer account here: https://developers.tiktok.com/\n2. After logging into your account select the icon in the upper right hand corner and select \"Manage Apps\"\n3. Select \"Connect an app\" and fill out the app review. Do not submit the application at this time\n4. Complete your Integration Assessment for Unreleased App here: https://developers.tiktok.com/application/unreleased-app-integration\n5. Our team will notify you via email if you have been approved.\n6. Upon approval, please submit your TikTok for Developer App Review, and sure to include the products and scopes that you are requesting access to.\n7. Receive an email confirmation that your TikTok for Developer App Review has been approved and you now have access to the APIs and scopes.\n\n\nDevelopment callback URL\n\nTikTok only support https callback url, so you need to use ngrok to create a https tunnel to your localhost. In\naddition, the url needs to be fixed (paid) because it is taked into account by TikTok after submission and upon\nvalidation by TikTok.\n"
  },
  {
    "path": "docs/socialaccount/providers/trainingpeaks.rst",
    "content": "TrainingPeaks\n-------------\n\nYou need to request an API Partnership to get your OAth credentials:\n\n https://api.trainingpeaks.com/request-access\n\nMake sure to request scope `athlete:profile` to be able to use OAuth\nfor user login (default if setting `SCOPE` is omitted).\n\nIn development you should only use the sandbox services, which is the\ndefault unless you set `USE_PRODUCTION` to `True`.\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'trainingpeaks': {\n            'SCOPE': ['athlete:profile'],\n            'USE_PRODUCTION': False,\n        }\n    }\n\nAPI documentation:\n\n https://github.com/TrainingPeaks/PartnersAPI/wiki\n"
  },
  {
    "path": "docs/socialaccount/providers/trello.rst",
    "content": "Trello\n------\n\nRegister the application at\n\n https://trello.com/app-key\n\nYou get one application key per account.\n\nSave the \"Key\" to \"Client id\", the \"Secret\" to \"Secret Key\" and \"Key\" to the \"Key\"\nfield.\n\nVerify which scope you need at\n\n https://developers.trello.com/page/authorization\n\nNeed to change the default scope? Add or update the `trello` setting to\n`settings.py`\n\n.. code-block:: python\n\n  SOCIALACCOUNT_PROVIDERS = {\n      'trello': {\n          'AUTH_PARAMS': {\n              'scope': 'read,write',\n          },\n      },\n  }\n"
  },
  {
    "path": "docs/socialaccount/providers/tumblr_oauth2.rst",
    "content": "Tumblr (OAuth 2)\n----------------\n\nYou will need to create a Tumblr app and configure the Tumblr provider for\nyour Django application via the admin interface.\n\nApp registration\n****************\n\nTo register an app on Tumblr you will need a Tumblr account. With an account, you\ncan create a new app via::\n\n    https://www.tumblr.com/oauth/register\n\nIn the app creation form fill in the development callback URL::\n\n    http://127.0.0.1:8000/accounts/tumblr_oauth2/login/callback/\n\nFor production use a callback URL such as::\n\n   https://{{yourdomain}}.com/accounts/tumblr_oauth2/login/callback/\n\n\nApp database configuration through admin\n****************************************\n\nThe second part of setting up the Tumblr provider requires you to configure\nyour Django application. Configuration is done by creating a SocialApp object\nin the admin. Add a social app on the admin page::\n\n    /admin/socialaccount/socialapp/\n\nUse the tumblr keys tab of your application to fill in the form. It's located::\n\n    https://www.tumblr.com/oauth/apps\n\nThe configuration is as follows:\n\n* Provider, \"Tumblr\"\n* Name, your pick, suggest \"Tumblr\"\n* Client id, is called \"OAuth2.0 Client ID\" on Tumblr\n* Secret key, is called \"OAuth2.0 Client Secret\" on Tumblr\n* Key, is not needed, leave blank\n\n\nYou can also set up the provider in `settings.py`::\n\n    SOCIALACCOUNT_PROVIDERS = {\n        \"tumblr\": {\n            \"SCOPE\": [\"basic\", \"write\"],\n            \"APP\": {\n                \"client_id\": os.environ.get(\"TUMBLR_CLIENT_ID\", \"\"),\n                \"secret\": os.environ.get(\"TUMBLR_CLIENT_SECRET\", \"\"),\n                \"key\": \"\",\n            },\n        },\n    }\n\nFor more information about the Tumblr API, see::\n\n    https://www.tumblr.com/docs/en/api/v2\n"
  },
  {
    "path": "docs/socialaccount/providers/twitch.rst",
    "content": "Twitch\n------\n\nApp registration (get your key and secret here)\n    http://dev.twitch.tv/console\n\nDevelopment callback URL\n    http://localhost:8000/accounts/twitch/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/twitter.rst",
    "content": "X/Twitter (OAuth 1)\n-------------------\n\nYou will need to create an X app and configure the X provider for your Django\napplication via the admin interface.\n\nApp registration\n****************\n\nTo register an app on X you will need an X account. With an account, you can\ncreate a new app via::\n\n    https://developer.x.com/en/portal/apps/new\n\nIn the app creation form fill in the development callback URL::\n\n    http://127.0.0.1:8000/accounts/twitter/login/callback/\n\nX won't allow using http://localhost:8000.\n\nFor production use a callback URL such as::\n\n   http://{{yourdomain}}.com/accounts/twitter/login/callback/\n\nTo allow users to login without authorizing each session, select \"Allow this\napplication to be used to Sign in with X\" under the application's\n\"Settings\" tab.\n\nApp database configuration through admin\n****************************************\n\nThe second part of setting up the X provider requires you to configure\nyour Django application. Configuration is done by creating a Socialapp object\nin the admin. Add a social app on the admin page::\n\n    /admin/socialaccount/socialapp/\n\nUse the X keys tab of your application to fill in the form. It's located::\n\n    https://developer.x.com/en/portal/apps/{{yourappid}}/keys\n\nThe configuration is as follows:\n\n* Provider ID: \"twitter\"\n* Name, your pick, suggest \"X\"\n* Client id, is called \"Consumer Key (API Key)\" on X\n* Secret key, is called \"Consumer Secret (API Secret)\" on X\n* Key, is not needed, leave blank\n"
  },
  {
    "path": "docs/socialaccount/providers/twitter_oauth2.rst",
    "content": "X/Twitter (OAuth 2)\n-------------------\n\nYou will need to create an X app with OAuth 2.0 enabled and configure the X provider for\nyour Django application via the admin interface.\n\nApp registration\n****************\n\nTo register an app on X you will need an X account. With an account, you can\ncreate a new app via::\n\n    https://developer.x.com/en/portal/dashboard\n\nIn the app creation form fill in the development callback URL::\n\n    http://127.0.0.1:8000/accounts/twitter_oauth2/login/callback/\n\nFor production use a callback URL such as::\n\n   http://{{yourdomain}}.com/accounts/twitter_oauth2/login/callback/\n\n\nApp database configuration through admin\n****************************************\n\nThe second part of setting up the X provider requires you to configure\nyour Django application. Configuration is done by creating a SocialApp object\nin the admin. Add a social app on the admin page::\n\n    /admin/socialaccount/socialapp/\n\nUse the X keys tab of your application to fill in the form. It's located::\n\n    https://developer.x.com/en/portal/projects/{project-id}/apps/{app-id}/keys\n\nThe configuration is as follows:\n\n* Provider ID: \"twitter_oauth2\"\n* Name, your pick, suggest \"X\"\n* Client id, is called \"OAuth2.0 Client ID\" on X\n* Secret key, is called \"OAuth2.0 Client Secret\" on X\n* Key, is not needed, leave blank\n"
  },
  {
    "path": "docs/socialaccount/providers/untappd.rst",
    "content": "Untappd\n-------\n\nApp registration\n****************\n\n    https://untappd.com/api/register?register=new\n\nIn the app creation form fill in the development callback URL, e.g.::\n\n    http://127.0.0.1:8000/accounts/untappd/login/callback/\n\nFor production, make it your production host, e.g.::\n\n   http://yoursite.com/accounts/untappd/login/callback/\n\nSocialApp configuration\n***********************\n\nThe configuration values come from your API dashboard on Untappd:\n\n    https://untappd.com/api/dashboard\n\n* Provider: \"Untappd\"\n* Name: \"Untappd\"\n* Client id: \"Client ID\" from Untappd\n* Secret key: \"Client Secret\" from Untappd\n* Sites: choose your site\n\nIn addition, you should override your user agent to comply with Untappd's API\nrules, and specify something in the format\n``<platform>:<app ID>:<version string>``. Otherwise,\nyou will risk additional rate limiting in your application.\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'untappd': {\n            'USER_AGENT': 'django:myappid:1.0',\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/vimeo.rst",
    "content": "Vimeo\n-----\n\nApp registration (get your key and secret here)\n    https://developer.vimeo.com/apps\n\nDevelopment callback URL\n    http://localhost:8000/a\n"
  },
  {
    "path": "docs/socialaccount/providers/vimeo_oauth2.rst",
    "content": "Vimeo (OAuth 2)\n---------------\n\nApp registration (get your key and secret here)\n    https://developer.vimeo.com/apps\n\nDevelopment callback URL\n    http://localhost:8000/accounts/vimeo_oauth2/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/vk.rst",
    "content": "VK\n--\n\nApp registration\n    https://vk.com/editapp?act=create\n\nDevelopment callback URL (\"Site address\")\n    http://localhost\n    https://localhost\n\n    Note: You have to use ports 80 or 443 to test VK locally, VK doesn't\n    support other ports for now\n\n\nDjango configuration\n********************\n\nUse the following settings example to login via VK (full name - VK ID).\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'vk': {\n            \"APPS\": [\n                {\n                    \"client_id\": \"YOUR_CLIENT_ID\",\n                    \"secret\": \"YOUR_CLIENT_SECRET\",\n                    \"key\": \"\",\n                },\n            ],\n            'SCOPE': [\n                'email',\n            ],\n        }\n    }\n\n\nDon't forget to add VK provider into Django installed apps:\n\n.. code-block:: python\n\n    INSTALLED_APPS = [\n        ...\n        'allauth.socialaccount.providers.vk',\n        ...\n    ]\n"
  },
  {
    "path": "docs/socialaccount/providers/wahoo.rst",
    "content": "Wahoo\n-----\n\nRegister your OAuth2 app here:\n\n    https://developers.wahooligan.com/applications/new\n\nThe API documentation can be found here:\n\n    https://cloud-api.wahooligan.com/#introduction\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'wahoo': {\n            'SCOPE': ['user_read'],\n        }\n    }\n\nSCOPE:\n    The default scope is ``user_read`` which allows you to read profile data. If\n    ``SOCIALACCOUNT_QUERY_EMAIL`` is set to True the ``email`` scope is also requested.\n\n    In order to read or write workout history data you must request additional scopes.\n\n    The available scopes are: ``user_read``, ``user_write``, ``workouts_read``, ``workouts_write``,\n    ``offline_data``.\n"
  },
  {
    "path": "docs/socialaccount/providers/weibo.rst",
    "content": "Weibo\n-----\n\nRegister your OAuth2 app over at ``http://open.weibo.com/apps``. Unfortunately,\nWeibo does not allow for specifying a port number in the authorization\ncallback URL. So for development purposes you have to use a callback url of\nthe form ``http://127.0.0.1/accounts/weibo/login/callback/`` and run\n``runserver 127.0.0.1:80``.\n"
  },
  {
    "path": "docs/socialaccount/providers/weixin.rst",
    "content": "Weixin\n------\n\nThe Weixin OAuth2 documentation:\n\n    https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN\n\nWeixin supports two kinds of oauth2 authorization, one for open platform and\none for media platform, AUTHORIZE_URL is the only difference between them, you\ncan specify ``AUTHORIZE_URL`` in setting, If no ``AUTHORIZE_URL`` value is set\nwill support open platform by default, which value is\n``https://open.weixin.qq.com/connect/qrconnect``.\n\nYou can optionally specify additional scope to use. If no ``SCOPE`` value\nis set, will use ``snsapi_login`` by default(for Open Platform Account, need\nregistration). Other ``SCOPE`` options are: snsapi_base, snsapi_userinfo.\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'weixin': {\n            'AUTHORIZE_URL': 'https://open.weixin.qq.com/connect/oauth2/authorize',  # for media platform\n            'SCOPE': ['snsapi_base'],\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/windowslive.rst",
    "content": "Windows Live\n------------\n\nThe Windows Live provider currently does not use any settings in\n``SOCIALACCOUNT_PROVIDERS``.\n\nApp registration (get your key and secret here)\n    https://apps.dev.microsoft.com/#/appList\n\nDevelopment callback URL\n    http://localhost:8000/accounts/windowslive/login/callback/\n\nMicrosoft calls the \"client_id\" an \"Application Id\" and it is a UUID. Also,\nthe \"client_secret\" is not created by default, you must edit the application\nafter it is created, then click \"Generate New Password\" to create it.\n"
  },
  {
    "path": "docs/socialaccount/providers/xing.rst",
    "content": "Xing\n----\n\nApp registration (get your key and secret here)\n    https://dev.xing.com/applications\n\nDevelopment callback URL\n    http://localhost:8000\n"
  },
  {
    "path": "docs/socialaccount/providers/yahoo.rst",
    "content": "Yahoo\n-----\n\nRegister your OAuth2 app below and enter the resultant client id and secret into admin\n    https://developer.yahoo.com/apps/create/\n\nThe Redirect URL requires secure URLs, please see the section on HTTPS about how this is handled.\n\nWhen you register the app within yahoo, ensure you select the following API Permissions\n\n- OpenID Connect Permissions\n\n - Email\n\n - Profile\n\nWhen copying the supplied Client ID and Client Secret, do not include the 4 starting spaces.\n"
  },
  {
    "path": "docs/socialaccount/providers/yandex.rst",
    "content": "Yandex\n------\n\nApp registration (get key and secret here)\n    https://oauth.yandex.com/client/new\n\nDevelopment callback URL\n    https://oauth.yandex.com/verification_code\n\nYandex OAuth app has many different access rights for its services. For the basic access level,\nyou just need to a choose \"Yandex.Passport API\" section and check \"Access to email address\" and\n\"Access to username, first name and surname, gender\". Everything else is optional.\n"
  },
  {
    "path": "docs/socialaccount/providers/ynab.rst",
    "content": "YNAB\n------\n\nApp Registration\n    https://app.youneedabudget.com/settings/developer\n\nDevelopment callback URL\n    http://127.0.0.1:8000/accounts/ynab/login/callback/\n\n\n\nDefault SCOPE permissions are 'read-only'. If this is the desired functionality, do not add SCOPE entry with ynab app\nin SOCIALACCOUNT_PROVIDERS. Otherwise, adding SCOPE and an empty string will give you read / write.\n\n.. code-block:: python\n\n    SOCIALACCOUNT_PROVIDERS = {\n        'ynab': {\n            'SCOPE': ''\n        }\n    }\n"
  },
  {
    "path": "docs/socialaccount/providers/zoho.rst",
    "content": "Zoho\n----\n\nApp Registration\n  https://api-console.zoho.com/add\n\n  Select \"Server-base Applications\"\n\nAuthorized Redirect URI\n    http://127.0.0.1:8000/accounts/zoho/login/callback/\n"
  },
  {
    "path": "docs/socialaccount/providers/zoom.rst",
    "content": "Zoom\n----\n\nApp Registration\n  https://marketplace.zoom.us/develop/create\n\nDevelopment callback URL\n    http://127.0.0.1:8000/accounts/zoom/login/callback/\n\nSelect scope user:read during app registration.\n"
  },
  {
    "path": "docs/socialaccount/signals.rst",
    "content": "Signals\n=======\n\nThere are several signals emitted during authentication flows. You can\nhook to them for your own needs.\n\n- ``allauth.socialaccount.signals.pre_social_login(request, sociallogin)``\n    Sent after a user successfully authenticates via a social provider,\n    but before the login is fully processed. This signal is emitted as\n    part of the social login and/or signup process, as well as when\n    connecting additional social accounts to an existing account. Access\n    tokens and profile information, if applicable for the provider, is\n    provided.\n\n- ``allauth.socialaccount.signals.social_account_added(request, sociallogin)``\n    Sent after a user connects a social account to their local account. This\n    is an explicit action and does not get called for the creation of a\n    socialaccount.\n\n- ``allauth.socialaccount.signals.social_account_updated(request, sociallogin)``\n    Sent after a social account has been updated. This happens when a user\n    logs in using an already connected social account, or completes a `connect`\n    flow for an already connected social account. Useful if you need to\n    unpack extra data for social accounts as they are updated.\n\n- ``allauth.socialaccount.signals.social_account_removed(request, socialaccount)``\n    Sent after a user disconnects a social account from their local\n    account.\n"
  },
  {
    "path": "docs/socialaccount/templates.rst",
    "content": "Template Tags\n=============\n\nUse the ``provider_login_url`` tag to generate provider specific login URLs::\n\n    {% load socialaccount %}\n\n    <a href=\"{% provider_login_url \"openid\" openid=\"https://www.google.com/accounts/o8/id\" next=\"/success/url/\" %}\">Google</a>\n    <a href=\"{% provider_login_url \"twitter\" %}\">Twitter</a>\n\nHere, you can pass along an optional ``process`` parameter that\nindicates how to process the social login. You can choose between\n``login`` and ``connect``::\n\n    <a href=\"{% provider_login_url \"twitter\" process=\"connect\" %}\">Connect a Twitter account</a>\n\nFurthermore, you can pass along an ``action`` parameter with value\n``reauthenticate`` to indicate that you want the user to be re-prompted\nfor authentication even if they already signed in before. For now, this\nis supported by Facebook, Google, Twitter, and Discord only.\n\nFor Javascript based logins (e.g. when you enable the Facebook JS\nSDK), you will need to make sure that the required Javascript is\nloaded. The following tag loads all scripts for the enabled\nproviders::\n\n    {% providers_media_js %}\n\nFor easy access to the social accounts for a user use::\n\n    {% get_social_accounts user as accounts %}\n\nThen::\n\n    {{accounts.twitter}} -- a list of connected Twitter accounts\n    {{accounts.twitter.0}} -- the first Twitter account\n    {% if accounts %} -- if there is at least one social account\n\n\nFinally, social authentication providers configured for the current site\ncan be retrieved via::\n\n    {% get_providers as socialaccount_providers %}\n\nWhich will populate the ``socialaccount_providers`` variable in the\ntemplate context with a list of configured social authentication\nproviders. This supersedes the context processor used in version 0.21 and\nbelow.\n"
  },
  {
    "path": "docs/socialaccount/views.rst",
    "content": "Views\n=====\n\nSocial Connections\n------------------\n\n*URL name*:\n  ``socialaccount_connections``\n\nThe ``allauth.socialaccount.views.ConnectionsView`` view over at\n``/accounts/social/connections/`` (URL name ``socialaccount_connections``) allows\nusers to manage the social accounts tied to their local account.\n"
  },
  {
    "path": "docs/usersessions/adapter.rst",
    "content": "Adapter\n=======\n\n.. autoclass:: allauth.usersessions.adapter.DefaultUserSessionsAdapter\n   :members:\n"
  },
  {
    "path": "docs/usersessions/configuration.rst",
    "content": "Configuration\n=============\n\nAvailable settings:\n\n``USERSESSIONS_ADAPTER`` (default: ``\"allauth.usersessions.adapter.DefaultUserSessionsAdapter\"``)\n  Specifies the adapter class to use, allowing you to alter certain\n  default behaviour.\n\n``USERSESSIONS_TRACK_ACTIVITY`` (default: ``False``)\n  Whether or not user sessions are kept updated. User sessions are created at\n  login time, but as the user continues to access the site the IP address might\n  change. Enabling this setting makes sure that the session is kept track of,\n  meaning, the IP address, user agent and last seen timestamp are all kept up to\n  date. Requires ``allauth.usersessions.middleware.UserSessionsMiddleware`` to\n  be installed.\n"
  },
  {
    "path": "docs/usersessions/index.rst",
    "content": "User Sessions\n=============\n\n.. toctree::\n\n   introduction\n   installation\n   configuration\n   signals\n   adapter\n"
  },
  {
    "path": "docs/usersessions/installation.rst",
    "content": "Installation\n============\n\nOn top of the standard installation, add the following::\n\n    INSTALLED_APPS = [\n        ...\n        'django.contrib.humanize',\n        'allauth.usersessions',\n        ...\n    ]\n\n    MIDDLEWARE = [\n        ...\n        # Optional -- needed when: USERSESSIONS_TRACK_ACTIVITY = True\n        'allauth.usersessions.middleware.UserSessionsMiddleware',\n        ...\n    ]\n"
  },
  {
    "path": "docs/usersessions/introduction.rst",
    "content": "Introduction\n============\n\nThe purpose of the optional ``allauth.usersessions`` app is to keep track of\n(authenticated) user sessions, allowing users to view a list of all their active\nsessions, as well as offering a means to end these sessions.\n"
  },
  {
    "path": "docs/usersessions/signals.rst",
    "content": "Signals\n=======\n\nThe following signal is emitted while handling user sessiond.\n\n- ``allauth.usersessions.signals.session_client_changed(request, from_session, to_session)``\n    This signal is emitted when the IP or user agent changes during the lifetime of a user\n    session. Note that it only fires when ``USERSESSIONS_TRACK_ACTIVITY`` is turned on.\n"
  },
  {
    "path": "examples/react-spa/Makefile",
    "content": ".PHONY: runserver\nrunserver:\n\tdocker-compose exec backend sh -c  'python manage.py migrate && python manage.py runserver 0.0.0.0:8000'\n\n.PHONY: shell\nshell:\n\tdocker-compose exec backend sh -c  'python manage.py shell'\n"
  },
  {
    "path": "examples/react-spa/README.org",
    "content": "* React Single-Page Application\n\nThis directory contains an example React application demonstrating the use of\nthe headless functionality of django-allauth. The example consists of two parts,\na backend running allauth in =HEADLESS_ONLY= mode, and a frontend containing the\nReact application itself.\n\nThis example can be found up and running over at [[https://react.demo.allauth.org/][react.demo.allauth.org]]. You can\nrun it locally as well, as is documented below.\n\n\n** Backend\n\nThe example backend Django project can be found in the =backend/= directory.  It\nis running in =HEADLESS_ONLY= mode, meaning, no frontend facing functionality of\nallauth is used. Hence, there are no templates or additional apps/views to be\nfound in this example Django project. The only points of interest of this\nproject are:\n\n- The configuration of =HEADLESS_ONLY = True= over at =settings.py=.\n\n- Configuring =HEADLESS_FRONTEND_URLS= so that allauth can construct links pointing\n  to the single-page React application.\n\n- The inclusion of =path(\"_allauth/\", include(\"allauth.headless.urls\"))= over at\n  =urls.py=.\n\n\n** Frontend\n\nThe frontend can be found in the =frontend/= directory. It is a fairly minimal\nexample React project created using =create-react-app=, extended with\n=react-(router-)dom= for implementing routing within the single-page\napplication.\n\nThe sole purpose of this project is to demonstrate the technical integration of\nheadless allauth within a Javascript single-page application. A pretty look and\nfeel is not a goal, and hence, minimal effort has been spent on making the\nfrontend visually appealing.\n\nPoints of interest of this project:\n\n- [[file:frontend/src/lib/allauth.js][frontend/src/lib/allauth.js]]: This is a (React independent) file offering\n  wrapper methods for the various allauth endpoints.\n\n- [[file:frontend/src/auth/AuthContext.js][frontend/src/auth/AuthContext.js]]: This file offers a React context provider\n  that is able to expose the authentication state to other React components.\n\n- [[file:frontend/src/auth/hooks.js][frontend/src/auth/hooks.js]]: Offers various hooks that use the context provider above to make\n  the current user (=useUser()=), allauth configuration (=useConfig()=) and authentication state (=useAuth()=)\n  easily consumable in components.\n\n- [[file:frontend/src/auth/routing.js][frontend/src/auth/routing.js]]: When the authentication state changes, the user\n  typically needs to be redirected to a different page. That logic is contained\n  within this file.\n\n- [[file:frontend/src/account/][frontend/src/account/]]: This directory contains all components related towards\n  the regular account functionality (e.g. login and signup using a local\n  account, as well as changing your password and email verification). This functionality corresponds\n  with the functionality of the =allauth.account= Django app.\n\n- [[file:frontend/src/socialaccount/][frontend/src/socialaccount/]]: This directory contains all components related\n  towards the logging in with third-party accounts. This functionality corresponds\n  with the functionality of the =allauth.socialaccount= Django app.\n\n- [[file:frontend/src/mfa/][frontend/src/mfa/]]: This directory contains all components related towards\n  Two-Factor Authentication. This functionality corresponds with the\n  functionality of the =allauth.mfa= Django app.\n\n- [[file:frontend/src/usersessions/][frontend/src/usersessions/]]: This directory contains user session management\n  component. This functionality corresponds with the functionality of the\n  =allauth.usersessions= Django app.\n\n- [[file:frontend/src/Router.js][frontend/src/Router.js]]: All routing is containing within this file.\n\n\n** Running\n\nA =docker-compose.yml= file is offered using which you can easily run the\nexample project locally. It consists of the following services:\n\n- =backend=: The Django backend application running =allauth.headless=.\n  The backend runs on port 8000.\n\n- =frontend=:  The frontend (React) project, running on port 3000.\n\n- =proxy=: A proxy service (Traefik), running on port 10000, that depending on the URL\n  forwards either to the backend or frontend service.\n\n- =mail=: A dummy email (SMTP) service (MailCatcher) that you can use to test\n  e.g. email verification and password reset flows.\n\nTo spin up these services, run:\n\n#+begin_src bash\n  docker-compose up\n#+end_src\n\nThen, visit the app over at http://localhost:10000.\n"
  },
  {
    "path": "examples/react-spa/backend/Dockerfile",
    "content": "FROM python:3.12\n\nWORKDIR /code/\nCOPY requirements.txt .\nRUN pip install -r requirements.txt\nCOPY manage.py .\nCOPY ./backend ./backend/\nEXPOSE 8000\n\nCMD [\"sh\", \"-c\", \"python manage.py migrate && python manage.py runserver 0.0.0.0:8000\"]\n"
  },
  {
    "path": "examples/react-spa/backend/backend/__init__.py",
    "content": ""
  },
  {
    "path": "examples/react-spa/backend/backend/asgi.py",
    "content": "\"\"\"\nASGI config for backend project.\n\nIt exposes the ASGI callable as a module-level variable named ``application``.\n\nFor more information on this file, see\nhttps://docs.djangoproject.com/en/4.2/howto/deployment/asgi/\n\"\"\"\n\nimport os\n\nfrom django.core.asgi import get_asgi_application\n\n\nos.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"backend.settings\")\n\napplication = get_asgi_application()\n"
  },
  {
    "path": "examples/react-spa/backend/backend/drf_demo/__init__.py",
    "content": ""
  },
  {
    "path": "examples/react-spa/backend/backend/drf_demo/serializers.py",
    "content": "from rest_framework import serializers\n\n\nclass AddSerializer(serializers.Serializer):\n    x = serializers.FloatField()\n    y = serializers.FloatField()\n"
  },
  {
    "path": "examples/react-spa/backend/backend/drf_demo/urls.py",
    "content": "from django.urls import path\n\nfrom drf_spectacular.views import (\n    SpectacularAPIView,\n    SpectacularRedocView,\n    SpectacularSwaggerView,\n)\n\nfrom .views import AddAPIView\n\n\nurlpatterns = [\n    path(\"api/add/\", AddAPIView.as_view()),\n    path(\"api/schema/\", SpectacularAPIView.as_view(), name=\"schema\"),\n    path(\n        \"api/schema/swagger-ui/\",\n        SpectacularSwaggerView.as_view(url_name=\"schema\"),\n        name=\"swagger-ui\",\n    ),\n    path(\n        \"api/schema/redoc/\",\n        SpectacularRedocView.as_view(url_name=\"schema\"),\n        name=\"redoc\",\n    ),\n]\n"
  },
  {
    "path": "examples/react-spa/backend/backend/drf_demo/views.py",
    "content": "from rest_framework import authentication, permissions\nfrom rest_framework.response import Response\nfrom rest_framework.views import APIView\n\nfrom allauth.headless.contrib.rest_framework.authentication import (\n    XSessionTokenAuthentication,\n)\n\nfrom .serializers import AddSerializer\n\n\nclass AddAPIView(APIView):\n    authentication_classes = [\n        authentication.SessionAuthentication,\n        XSessionTokenAuthentication,\n    ]\n    permission_classes = [permissions.IsAuthenticated]\n\n    def get(self, request):\n        serializer = AddSerializer(data=request.GET)\n        serializer.is_valid(raise_exception=True)\n        return Response(\n            data={\n                \"result\": serializer.validated_data[\"x\"]\n                + serializer.validated_data[\"y\"]\n            }\n        )\n"
  },
  {
    "path": "examples/react-spa/backend/backend/ninja_demo/__init__.py",
    "content": ""
  },
  {
    "path": "examples/react-spa/backend/backend/ninja_demo/urls.py",
    "content": "from django.urls import path\n\nfrom backend.ninja_demo import views\n\n\nurlpatterns = [\n    path(\"api/\", views.api.urls),\n]\n"
  },
  {
    "path": "examples/react-spa/backend/backend/ninja_demo/views.py",
    "content": "from ninja import NinjaAPI\nfrom ninja.security import django_auth\n\nfrom allauth.headless.contrib.ninja.security import x_session_token_auth\n\n\napi = NinjaAPI()\n\n\n@api.get(\"/add\", auth=[django_auth, x_session_token_auth])\ndef add(request, x: float, y: float):\n    return {\"result\": x + y}\n"
  },
  {
    "path": "examples/react-spa/backend/backend/settings.py",
    "content": "from pathlib import Path\n\n\n# Build paths inside the project like this: BASE_DIR / 'subdir'.\nBASE_DIR = Path(__file__).resolve().parent.parent\n\n\n# Quick-start development settings - unsuitable for production\n# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/\n\n# SECURITY WARNING: keep the secret key used in production secret!\nSECRET_KEY = \"dummy-secret-key\"\n\n# SECURITY WARNING: don't run with debug turned on in production!\nDEBUG = True\n\nALLOWED_HOSTS = [\"localhost\", \"backend\", \"127.0.0.1\"]\n\n\n# Application definition\n\nINSTALLED_APPS = [\n    \"django.contrib.admin\",\n    \"django.contrib.auth\",\n    \"django.contrib.contenttypes\",\n    \"django.contrib.sessions\",\n    \"django.contrib.messages\",\n    \"django.contrib.staticfiles\",\n    \"allauth\",\n    \"allauth.account\",\n    \"allauth.socialaccount\",\n    \"allauth.socialaccount.providers.dummy\",\n    \"allauth.mfa\",\n    \"allauth.headless\",\n    \"allauth.usersessions\",\n    \"drf_spectacular\",\n    \"backend.drf_demo\",\n    \"backend.ninja_demo\",\n]\n\nMIDDLEWARE = [\n    \"django.middleware.security.SecurityMiddleware\",\n    \"django.contrib.sessions.middleware.SessionMiddleware\",\n    \"django.middleware.common.CommonMiddleware\",\n    \"django.middleware.csrf.CsrfViewMiddleware\",\n    \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n    \"django.contrib.messages.middleware.MessageMiddleware\",\n    \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n    \"allauth.account.middleware.AccountMiddleware\",\n]\n\nROOT_URLCONF = \"backend.urls\"\n\nTEMPLATES = [\n    {\n        \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n        \"DIRS\": [],\n        \"APP_DIRS\": True,\n        \"OPTIONS\": {\n            \"context_processors\": [\n                \"django.template.context_processors.debug\",\n                \"django.template.context_processors.request\",\n                \"django.contrib.auth.context_processors.auth\",\n                \"django.contrib.messages.context_processors.messages\",\n            ],\n        },\n    },\n]\n\nWSGI_APPLICATION = \"backend.wsgi.application\"\n\n\n# Database\n# https://docs.djangoproject.com/en/4.2/ref/settings/#databases\n\nDATABASES = {\n    \"default\": {\n        \"ENGINE\": \"django.db.backends.sqlite3\",\n        \"NAME\": BASE_DIR / \"db.sqlite3\",\n    }\n}\n\n\n# Password validation\n# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators\n\nAUTH_PASSWORD_VALIDATORS = [\n    {\n        \"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\",\n    },\n    {\n        \"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\",\n    },\n    {\n        \"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\",\n    },\n    {\n        \"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\",\n    },\n]\n\n\n# Internationalization\n# https://docs.djangoproject.com/en/4.2/topics/i18n/\n\nLANGUAGE_CODE = \"en-us\"\n\nTIME_ZONE = \"UTC\"\n\nUSE_I18N = True\n\nUSE_TZ = True\n\n\n# Static files (CSS, JavaScript, Images)\n# https://docs.djangoproject.com/en/4.2/howto/static-files/\n\nSTATIC_URL = \"static/\"\n\n# Default primary key field type\n# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field\n\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nEMAIL_HOST = \"mail\"\nEMAIL_PORT = 1025\n\nAUTHENTICATION_BACKENDS = (\"allauth.account.auth_backends.AuthenticationBackend\",)\n\nACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\nACCOUNT_LOGIN_METHODS = {\"email\"}\nACCOUNT_LOGOUT_ON_PASSWORD_CHANGE = False\nACCOUNT_LOGIN_BY_CODE_ENABLED = True\nACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True\nACCOUNT_SIGNUP_FIELDS = [\"email*\", \"password1*\", \"password2*\"]\n\nHEADLESS_ONLY = True\nHEADLESS_FRONTEND_URLS = {\n    \"account_confirm_email\": \"/account/verify-email/{key}\",\n    \"account_reset_password\": \"/account/password/reset\",\n    \"account_reset_password_from_key\": \"/account/password/reset/key/{key}\",\n    \"account_signup\": \"/account/signup\",\n    \"socialaccount_login_error\": \"/account/provider/callback\",\n}\nHEADLESS_SERVE_SPECIFICATION = True\n\nMFA_SUPPORTED_TYPES = [\"totp\", \"recovery_codes\", \"webauthn\"]\nMFA_PASSKEY_LOGIN_ENABLED = True\nMFA_PASSKEY_SIGNUP_ENABLED = True\n\nREST_FRAMEWORK = {\n    \"DEFAULT_SCHEMA_CLASS\": \"drf_spectacular.openapi.AutoSchema\",\n}\nSPECTACULAR_SETTINGS = {\n    \"EXTERNAL_DOCS\": {\"description\": \"allauth\", \"url\": \"/_allauth/openapi.html\"},\n}\n\n\ntry:\n    from .local_settings import *  # noqa\nexcept ImportError:\n    pass\n"
  },
  {
    "path": "examples/react-spa/backend/backend/urls.py",
    "content": "from django.contrib import admin\nfrom django.urls import include, path\n\n\nurlpatterns = [\n    path(\"admin/\", admin.site.urls),\n    path(\"accounts/\", include(\"allauth.urls\")),\n    path(\"_allauth/\", include(\"allauth.headless.urls\")),\n    path(\"drf/\", include(\"backend.drf_demo.urls\")),\n    path(\"ninja/\", include(\"backend.ninja_demo.urls\")),\n]\n"
  },
  {
    "path": "examples/react-spa/backend/backend/wsgi.py",
    "content": "import os\n\nfrom django.core.wsgi import get_wsgi_application\n\n\nos.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"backend.settings\")\n\napplication = get_wsgi_application()\n"
  },
  {
    "path": "examples/react-spa/backend/manage.py",
    "content": "#!/nix/store/qp5zys77biz7imbk6yy85q5pdv7qk84j-python3-3.11.6/bin/python\n\"\"\"Django's command-line utility for administrative tasks.\"\"\"\nimport os\nimport sys\n\n\ndef main():\n    \"\"\"Run administrative tasks.\"\"\"\n    os.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"backend.settings\")\n    try:\n        from django.core.management import execute_from_command_line\n    except ImportError as exc:\n        raise ImportError(\n            \"Couldn't import Django. Are you sure it's installed and \"\n            \"available on your PYTHONPATH environment variable? Did you \"\n            \"forget to activate a virtual environment?\"\n        ) from exc\n    execute_from_command_line(sys.argv)\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "examples/react-spa/backend/requirements.txt",
    "content": "django-allauth[mfa,socialaccount]>=65.15.0\nqrcode >= 7.0.0\ndrf-spectacular == 0.28.0\ndjangorestframework >= 3.15.2,<4\ndjango-ninja >= 1.3.0,<2\n"
  },
  {
    "path": "examples/react-spa/docker-compose.dev.yml",
    "content": "services:\n  backend:\n    command:\n      sleep infinity\n"
  },
  {
    "path": "examples/react-spa/docker-compose.yml",
    "content": "version: \"3\"\nservices:\n  frontend:\n    container_name: frontend\n    build:\n      context: ./frontend/\n      dockerfile: Dockerfile\n    volumes:\n      - ./frontend/src:/code/src/\n      - ./frontend/public:/code/public/\n\n  backend:\n    container_name: backend\n    build:\n      context: ./backend/\n      dockerfile: Dockerfile\n    volumes:\n      - ./backend/backend:/code/backend/\n      - ../../allauth:/code/allauth\n    ports:\n      - 8000:8000\n\n  proxy:\n    image: traefik:v3.0\n    container_name: proxy\n    ports:\n      - 10000:10000\n    volumes:\n      - ./traefik.toml:/etc/traefik/traefik.toml\n\n  mail:\n    container_name: mail\n    image: schickling/mailcatcher\n    ports:\n      - 1080:1080\n      - 1025:1025\n"
  },
  {
    "path": "examples/react-spa/e2e.spec.js",
    "content": "import { test, expect } from '@playwright/test'\n\nconst MAILCATCHER_URL = 'http://localhost:1080'\nconst BASE_URL = 'http://localhost:10000'\n\nfunction emailFactory () {\n  return `test-${Math.round(Math.random() * 100000000000)}@test.allauth.org`\n}\n\nfunction passwordFactory () {\n  return `pw!${new Date().valueOf()}`\n}\n\nfunction socialAccountUIDFactory () {\n  return '' + Math.round(Math.random() * 100000000)\n}\n\nasync function clearMailcatcher (page) {\n  await page.goto(MAILCATCHER_URL)\n  async function acceptDialog (dialog) {\n    await dialog.accept()\n    page.removeListener('dialog', acceptDialog)\n  }\n  page.on('dialog', acceptDialog)\n  await page.getByTitle('Clear all messages').click()\n}\n\nasync function getLinkFromMail (page) {\n  await page.waitForTimeout(500)\n  await page.goto(MAILCATCHER_URL + '/messages/1.plain')\n  const txt = await page.content()\n  const link = txt.match(/https?:\\/\\/[^\\s]+/)[0]\n  return link\n}\n\nasync function login (page, email, password) {\n  await page.goto(BASE_URL + '/account/login')\n  await page.getByLabel('Email').fill(email)\n  await page.getByLabel('Password:').fill(password)\n  await page.getByRole('button', { name: 'Login' }).click()\n  await page.waitForURL(BASE_URL + '/dashboard')\n}\n\nasync function logout (page) {\n  // Logout\n  await page.goto(BASE_URL + '/account/logout')\n  await page.getByRole('button').click()\n  await page.waitForURL(BASE_URL)\n}\n\ntest('complete flow', async ({ page }) => {\n  await clearMailcatcher(page)\n\n  // Dashboard redirects to login\n  await page.goto(BASE_URL + '/dashboard')\n  await page.waitForURL(BASE_URL + '/account/login?next=%2Fdashboard')\n\n  // No account yet, so signup.\n  await page.goto(BASE_URL + '/account/signup')\n  const email = emailFactory()\n  await page.getByLabel('Email').fill(email)\n  const password = passwordFactory()\n  await page.getByLabel('Password:').fill(password)\n  await page.getByLabel('Password (again)').fill(password)\n  await page.getByRole('button', { name: 'Sign Up' }).click()\n\n  // Signup requires email verification\n  await page.waitForURL(BASE_URL + '/account/verify-email')\n  const verifyLink = await getLinkFromMail(page)\n  await page.goto(verifyLink)\n  await page.getByRole('button').click()\n  await page.waitForURL(BASE_URL + '/dashboard')\n\n  // Logout\n  await logout(page)\n\n  // Password reset\n  await clearMailcatcher(page)\n  await page.goto(BASE_URL + '/account/password/reset')\n  await page.getByLabel('Email').fill(email)\n  await page.getByRole('button').click()\n  const resetLink = await getLinkFromMail(page)\n  await page.goto(resetLink)\n  const newPassword = passwordFactory()\n  await page.getByLabel('Password:').fill(newPassword)\n  await page.getByLabel('Password (again)').fill(newPassword)\n  await page.getByRole('button', { name: 'Reset' }).click()\n  await page.waitForURL(BASE_URL + '/account/login')\n\n  // Login using new password\n  await login(page, email, newPassword)\n})\n\ntest('complete socialaccount flow', async ({ page }) => {\n  await clearMailcatcher(page)\n\n  // Dashboard redirects to login\n  await page.goto(BASE_URL + '/dashboard')\n  await page.waitForURL(BASE_URL + '/account/login?next=%2Fdashboard')\n  await page.getByRole('button', { name: 'Dummy' }).click()\n\n  // Dummy authenticate\n  await page.waitForURL(BASE_URL + '/accounts/dummy/authenticate/*')\n  const socialId = socialAccountUIDFactory()\n  await page.getByLabel('Account ID').fill(socialId)\n  await page.getByRole('button', { name: 'Login' }).click()\n\n  // Provider signup\n  await page.waitForURL(BASE_URL + '/account/provider/signup')\n  const email = emailFactory()\n  await page.getByLabel('Email').fill(email)\n  await page.getByRole('button', { name: 'Sign Up' }).click()\n\n  // Verify email\n  await page.waitForURL(BASE_URL + '/account/verify-email')\n  const verifyLink = await getLinkFromMail(page)\n  await page.goto(verifyLink)\n  await page.getByRole('button').click()\n  await page.waitForURL(BASE_URL + '/dashboard')\n\n  // Logout\n  await logout(page)\n\n  // Login, no more signup needed.\n  await page.goto(BASE_URL + '/dashboard')\n  await page.waitForURL(BASE_URL + '/account/login?next=%2Fdashboard')\n  await page.getByRole('button', { name: 'Dummy' }).click()\n\n  // Dummy authenticate\n  await page.waitForURL(BASE_URL + '/accounts/dummy/authenticate/*')\n  await page.getByLabel('Account ID').fill(socialId)\n  await page.getByRole('button', { name: 'Login' }).click()\n\n  // Set password\n  await page.waitForURL(BASE_URL + '/dashboard')\n  await page.goto(BASE_URL + '/account/password/change')\n  const newPassword = passwordFactory()\n  await page.getByLabel('Password:').fill(newPassword)\n  await page.getByLabel('Password (again)').fill(newPassword)\n  await page.getByRole('button', { name: 'Set' }).click()\n  await page.waitForURL(BASE_URL + '/dashboard')\n\n  // Login using password now\n  await logout(page)\n  await login(page, email, newPassword)\n})\n"
  },
  {
    "path": "examples/react-spa/frontend/Dockerfile",
    "content": "FROM node:18\n\nWORKDIR /code/\nCOPY package*.json .\nRUN npm install\nCOPY ./src ./src\nCOPY ./public ./public\nEXPOSE 3000\n\nCMD [\"npm\", \"start\"]\n"
  },
  {
    "path": "examples/react-spa/frontend/package.json",
    "content": "{\n  \"name\": \"frontend\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@github/webauthn-json\": \"^2.1.1\",\n    \"@testing-library/jest-dom\": \"^6.6.3\",\n    \"@testing-library/react\": \"^13.4.0\",\n    \"@testing-library/user-event\": \"^13.5.0\",\n    \"react\": \"^18.3.1\",\n    \"react-dom\": \"^18.3.1\",\n    \"react-router-dom\": \"^6.28.0\",\n    \"react-scripts\": \"5.0.1\",\n    \"standard\": \"^17.1.2\",\n    \"web-vitals\": \"^2.1.4\"\n  },\n  \"scripts\": {\n    \"start\": \"react-scripts start\",\n    \"build\": \"react-scripts build\",\n    \"test\": \"react-scripts test\",\n    \"eject\": \"react-scripts eject\"\n  },\n  \"eslintConfig\": {\n    \"extends\": [\n      \"react-app\",\n      \"react-app/jest\"\n    ]\n  },\n  \"browserslist\": {\n    \"production\": [\n      \">0.2%\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \"last 1 chrome version\",\n      \"last 1 firefox version\",\n      \"last 1 safari version\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/public/css/style.css",
    "content": "main > .container {\n  padding: 60px 15px 0;\n}\n\n.aa-channel {\n  height: 10px;\n  width: 100%;\n  background: linear-gradient(90deg, black 50%, transparent 50%);\n  background-repeat: repeat-x;\n  background-size: 20px 10px;\n  background-position: 0px 0px;\n  animation: border-dance 0.5s infinite linear;\n  border: none;\n}\n.aa-channel-rev {\n  animation: border-dance 0.5s infinite linear reverse;\n}\n@keyframes border-dance {\n  0% {\n    background-position: 0px 0px;\n  }\n  100% {\n    background-position: 20px 0px;\n  }\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/public/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" class=\"h-100\">\n    <head>\n        <meta charset=\"utf-8\" />\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n        <meta name=\"theme-color\" content=\"#000000\" />\n        <meta name=\"description\" content=\"Web site created using create-react-app\" />\n        <title>React ❤️ django-allauth</title>\n        <link href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css\"\n              rel=\"stylesheet\"\n              integrity=\"sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN\"\n              crossorigin=\"anonymous\">\n        <link href=\"/css/style.css\" rel=\"stylesheet\">\n    </head>\n    <body class=\"d-flex flex-column h-100\">\n        <script>const DEVELOPMENT = '%NODE_ENV%' === 'development'</script>\n        <noscript>You need to enable JavaScript to run this app.</noscript>\n        <div id=\"root\" class=\"d-flex flex-column h-100\"></div>\n        <script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js\"\n                integrity=\"sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL\"\n                crossorigin=\"anonymous\"></script>\n    </body>\n</html>\n"
  },
  {
    "path": "examples/react-spa/frontend/src/App.js",
    "content": "import { AuthContextProvider } from './auth'\nimport Router from './Router'\n\nfunction App () {\n  return (\n    <AuthContextProvider>\n      <Router />\n    </AuthContextProvider>\n  )\n}\n\nexport default App\n"
  },
  {
    "path": "examples/react-spa/frontend/src/Calculator.js",
    "content": "import { useState, useCallback } from 'react'\nimport { getSessionToken, settings, Client } from './lib/allauth'\n\nfunction APICard (props) {\n  return (\n    <div className='card'>\n      <div className='card-body'>\n        <h5 className='card-title'>{props.title}</h5>\n        <a href={props.docs}>API documentation</a>\n        <div className='mb-3'>\n          <label>Status</label>\n          <input className='form-control' value={props.response.status} readOnly />\n        </div>\n        <pre className='overflow-x-scroll'>{JSON.stringify(props.response.data, undefined, 4)}</pre>\n      </div>\n    </div>\n  )\n}\n\nexport default function Calculator () {\n  const [x, setX] = useState('')\n  const [y, setY] = useState('')\n  const [drfResponse, setDRFResponse] = useState({ status: '', data: '' })\n  const [ninjaResponse, setNinjaResponse] = useState({ status: '', data: '' })\n\n  const fetchResult = useCallback(async (url, x, y, setResponse) => {\n    const params = { x, y }\n    const query = new URLSearchParams(params)\n    const sessionToken = getSessionToken()\n    const options = { headers: {} }\n    if (settings.client === Client.APP && sessionToken) {\n      options.headers['X-Session-Token'] = sessionToken\n    }\n    if (settings.withCredentials) {\n      options.credentials = 'include'\n    }\n    const response = await window.fetch(`${url}?${query.toString()}`, options)\n\n    const data = await response.json()\n    setResponse({ status: response.status, data })\n  }, [])\n\n  const onCalculate = useCallback((e) => {\n    e.preventDefault()\n    let baseUrl = ''\n    try {\n      baseUrl = new URL(settings.baseUrl).origin\n    } catch {}\n    fetchResult(baseUrl + '/drf/api/add/', x, y, setDRFResponse)\n    fetchResult(baseUrl + '/ninja/api/add', x, y, setNinjaResponse)\n    return false\n  }, [x, y, setNinjaResponse, setDRFResponse])\n\n  return (\n    <div>\n      <h2>Calculator</h2>\n      <form>\n        <fieldset>\n          <div className='mb-3'>\n            <label>𝓍</label>\n            <input className='form-control' value={x} onChange={(e) => setX(e.target.value)} type='number' />\n          </div>\n          <div className='mb-3'>\n            <label>𝓎</label>\n            <input className='form-control' value={y} onChange={(e) => setY(e.target.value)} type='number' />\n          </div>\n          <button onClick={onCalculate} className='btn btn-primary'>Add these inputs</button>\n        </fieldset>\n\n        <div className='row'>\n          <div className='col-6'>\n            <APICard title='Ninja' docs='/ninja/api/docs' response={ninjaResponse} />\n          </div>\n          <div className='col-6'>\n            <APICard title='Django REST Framework' docs='/drf/api/schema/redoc/' response={drfResponse} />\n          </div>\n        </div>\n      </form>\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/Home.js",
    "content": "function Service (props) {\n  return (\n    <div className='col'>\n      <img className='img-fluid' src={props.img} />\n      <h3>{props.title}</h3>\n      <a href={props.link}>{props.linkBody}</a>\n    </div>\n  )\n}\n\nfunction Channel (props) {\n  return (\n    <div className='col'>\n      <hr className={`aa-channel ${props.rev ? 'aa-channel-rev' : ''}`} />\n      <div className='d-none d-lg-block' style={{ fontVariant: 'small-caps' }}>◀ {props.emoji} <span className=''>{props.title}</span> ▶</div>\n    </div>\n  )\n}\n\nexport default function Home () {\n  return (\n    <div>\n      <div className='container p-4 my-4 rounded-4 bg-light text-center'>\n        <div className='d-flex flex-1 flex-column flex-sm-row align-items-sm-center'>\n\n          <Service img='/img/app.svg' title='Mobile / SPA' link='https://app.react.demo.allauth.org' linkBody={<>app.<i>{'{project.org}'}</i></>} />\n          <Channel emoji='🔑' title='tokens' />\n          <Service img='/img/allauth.svg' title='Headless' link='https://api.react.demo.allauth.org/_allauth/openapi.html' linkBody={<>api.<i>{'{project.org}'}</i></>} />\n          <Channel rev emoji='🍪' title='cookies' />\n          <Service img='/img/react.svg' title='Single-Page application' link='https://react.demo.allauth.org' linkBody={<i>{'{project.org}'}</i>} />\n\n        </div>\n      </div>\n\n      <h1>Welcome!</h1>\n\n      <p>Welcome to the headless django-allauth demo. It demonstrates:</p>\n      <ul>\n        <li>A <strong>React</strong> <a target='_blank' href='https://codeberg.org/allauth/django-allauth/src/branch/main/examples/react-spa/frontend' rel='noreferrer'>frontend app</a> interfacing with <code>allauth.headless</code>.</li>\n        <li>The use of <strong>session cookies</strong>, as well as <strong>API tokens</strong>.</li>\n        <li>A <a href='/calculator'>calculator</a>, allowing <i>authenticated</i> users to add up two numbers, built using an API backed by two implementations: Django REST framework, and Ninja.\n        </li>\n        <li>The use of headless <strong>tokens</strong> in frameworks such as Django REST framework and Ninja.</li>\n      </ul>\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/NavBar.js",
    "content": "import { useUser, useConfig } from './auth'\nimport { useLocation, Link } from 'react-router-dom'\n\nfunction NavBarItem (props) {\n  const location = useLocation()\n  const isActive = (props.href && location.pathname.startsWith(props.href)) || (props.to && location.pathname.startsWith(props.to))\n  const cls = isActive ? 'nav-link active' : 'nav-link'\n  return (\n    <li className='nav-item'>\n      {props.href\n        ? <a className={cls} href={props.href}>{props.icon} {props.name}</a>\n        : <Link className={cls} to={props.to}>{props.icon} {props.name}</Link>}\n    </li>\n  )\n}\n\nexport default function NavBar () {\n  const user = useUser()\n  const config = useConfig()\n  const anonNav = (\n    <>\n      <NavBarItem to='/account/login' icon='🔑' name='Login' />\n      <NavBarItem to='/account/signup' icon='🧑' name='Signup' />\n      <NavBarItem to='/account/password/reset' icon='🔓' name='Reset password' />\n    </>\n  )\n  const authNav = (\n    <>\n      <NavBarItem to='/account/email' icon='📬' name='Change Email' />\n      <NavBarItem to='/account/password/change' icon='🔒' name='Change Password' />\n      {config.data.socialaccount\n        ? <NavBarItem to='/account/providers' icon='👤' name='Providers' />\n        : null}\n      {config.data.mfa\n        ? <NavBarItem to='/account/2fa' icon='📱' name='Two-Factor Authentication' />\n        : null}\n\n      {config.data.usersessions\n        ? <NavBarItem to='/account/sessions' icon='🚀' name='Sessions' />\n        : null}\n      <NavBarItem to='/account/logout' icon='👋' name='Logout' />\n    </>\n  )\n  return (\n    <nav className='navbar navbar-expand-md navbar-dark fixed-top bg-dark'>\n      <div className='container-fluid'>\n        <Link to='/' className='navbar-brand'>React ❤️ django-allauth</Link>\n        <button className='navbar-toggler' type='button' data-bs-toggle='collapse' data-bs-target='#navbarCollapse' aria-controls='navbarCollapse' aria-expanded='false' aria-label='Toggle navigation'>\n          <span className='navbar-toggler-icon' />\n        </button>\n        <div className='collapse navbar-collapse' id='navbarCollapse'>\n          <ul className='navbar-nav me-auto mb-2 mb-md-0'>\n            <NavBarItem to='/calculator' icon='📈' name='Calculator' />\n            {window.DEVELOPMENT ? <NavBarItem href='http://localhost:1080' icon='✉️' name='MailCatcher' /> : null}\n            {user ? authNav : anonNav}\n          </ul>\n        </div>\n      </div>\n    </nav>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/Root.js",
    "content": "import NavBar from './NavBar'\nimport { Outlet } from 'react-router-dom'\n\nexport default function Root () {\n  return (\n    <>\n      <NavBar />\n      <main className='flex-shrink-0'>\n\n        <div className='container'>\n          <Outlet />\n        </div>\n      </main>\n\n      <footer className='footer mt-auto py-3 bg-body-tertiary'>\n        <div className='container'>\n          <span className='text-body-secondary'>⚠️ This sole purpose of this example React app is to demonstrate the use of headless django-allauth. Please do not mind the looks!</span>\n        </div>\n      </footer>\n\n    </>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/Router.js",
    "content": "import { useState, useEffect } from 'react'\nimport { AuthChangeRedirector, AnonymousRoute, AuthenticatedRoute } from './auth'\nimport {\n  createBrowserRouter,\n  RouterProvider\n} from 'react-router-dom'\nimport Calculator from './Calculator'\nimport Login from './account/Login'\nimport RequestLoginCode from './account/RequestLoginCode'\nimport ConfirmLoginCode from './account/ConfirmLoginCode'\nimport Logout from './account/Logout'\nimport Signup from './account/Signup'\nimport ProviderSignup from './socialaccount/ProviderSignup'\nimport ProviderCallback from './socialaccount/ProviderCallback'\nimport Home from './Home'\nimport ChangeEmail from './account/ChangeEmail'\nimport ManageProviders from './socialaccount/ManageProviders'\nimport VerifyEmail, { loader as verifyEmailLoader } from './account/VerifyEmail'\nimport VerifyEmailByCode from './account/VerifyEmailByCode'\nimport VerificationEmailSent from './account/VerificationEmailSent'\nimport RequestPasswordReset from './account/RequestPasswordReset'\nimport ConfirmPasswordResetCode from './account/ConfirmPasswordResetCode'\nimport ChangePassword from './account/ChangePassword'\nimport MFAOverview, { loader as mfaOverviewLoader } from './mfa/MFAOverview'\nimport ActivateTOTP, { loader as activateTOTPLoader } from './mfa/ActivateTOTP'\nimport DeactivateTOTP from './mfa/DeactivateTOTP'\nimport RecoveryCodes, { loader as recoveryCodesLoader } from './mfa/RecoveryCodes'\nimport AddWebAuthn from './mfa/AddWebAuthn'\nimport SignupByPasskey from './mfa/SignupByPasskey'\nimport ReauthenticateWebAuthn from './mfa/ReauthenticateWebAuthn'\nimport ListWebAuthn, { loader as listWebAuthnLoader } from './mfa/ListWebAuthn'\nimport GenerateRecoveryCodes, { loader as generateRecoveryCodesLoader } from './mfa/GenerateRecoveryCodes'\nimport { resetPasswordByLinkLoader, ResetPasswordByCode, ResetPasswordByLink } from './account/ResetPassword'\nimport AuthenticateTOTP from './mfa/AuthenticateTOTP'\nimport AuthenticateRecoveryCodes from './mfa/AuthenticateRecoveryCodes'\nimport AuthenticateWebAuthn from './mfa/AuthenticateWebAuthn'\nimport ReauthenticateRecoveryCodes from './mfa/ReauthenticateRecoveryCodes'\nimport ReauthenticateTOTP from './mfa/ReauthenticateTOTP'\nimport CreateSignupPasskey from './mfa/CreateSignupPasskey'\nimport Trust from './mfa/Trust'\nimport Reauthenticate from './account/Reauthenticate'\nimport Sessions from './usersessions/Sessions'\nimport Root from './Root'\nimport { useConfig } from './auth/hooks'\n\nfunction createRouter (config) {\n  return createBrowserRouter([\n    {\n      path: '/',\n      element: <AuthChangeRedirector><Root /></AuthChangeRedirector>,\n      children: [\n        {\n          path: '/',\n          element: <Home />\n        },\n        {\n          path: '/calculator',\n          element: <Calculator />\n        },\n        {\n          path: '/account/login',\n          element: <AnonymousRoute><Login /></AnonymousRoute>\n        },\n        {\n          path: '/account/login/code',\n          element: <AnonymousRoute><RequestLoginCode /></AnonymousRoute>\n        },\n        {\n          path: '/account/login/code/confirm',\n          element: <AnonymousRoute><ConfirmLoginCode /></AnonymousRoute>\n        },\n        {\n          path: '/account/email',\n          element: <AuthenticatedRoute><ChangeEmail /></AuthenticatedRoute>\n        },\n        {\n          path: '/account/logout',\n          element: <Logout />\n        },\n        {\n          path: '/account/provider/callback',\n          element: <ProviderCallback />\n        },\n        {\n          path: '/account/provider/signup',\n          element: <AnonymousRoute><ProviderSignup /></AnonymousRoute>\n        },\n        {\n          path: '/account/providers',\n          element: <AuthenticatedRoute><ManageProviders /></AuthenticatedRoute>\n        },\n        {\n          path: '/account/signup',\n          element: <AnonymousRoute><Signup /></AnonymousRoute>\n        },\n        {\n          path: '/account/signup/passkey',\n          element: <AnonymousRoute><SignupByPasskey /></AnonymousRoute>\n        },\n        {\n          path: '/account/signup/passkey/create',\n          element: <AnonymousRoute><CreateSignupPasskey /></AnonymousRoute>\n        },\n        {\n          path: '/account/verify-email',\n          element: config.data.account.email_verification_by_code_enabled ? <VerifyEmailByCode /> : <VerificationEmailSent />\n        },\n        {\n          path: '/account/verify-email/:key',\n          element: <VerifyEmail />,\n          loader: verifyEmailLoader\n        },\n        {\n          path: '/account/password/reset',\n          element: <AnonymousRoute><RequestPasswordReset /></AnonymousRoute>\n        },\n        {\n          path: '/account/password/reset/confirm',\n          element: <AnonymousRoute><ConfirmPasswordResetCode /></AnonymousRoute>\n        },\n        {\n          path: '/account/password/reset/complete',\n          element: <AnonymousRoute><ResetPasswordByCode /></AnonymousRoute>\n        },\n        {\n          path: '/account/password/reset/key/:key',\n          element: <AnonymousRoute><ResetPasswordByLink /></AnonymousRoute>,\n          loader: resetPasswordByLinkLoader\n        },\n        {\n          path: '/account/password/change',\n          element: <AuthenticatedRoute><ChangePassword /></AuthenticatedRoute>\n        },\n        {\n          path: '/account/2fa',\n          element: <AuthenticatedRoute><MFAOverview /></AuthenticatedRoute>,\n          loader: mfaOverviewLoader\n        },\n        {\n          path: '/account/reauthenticate',\n          element: <AuthenticatedRoute><Reauthenticate /></AuthenticatedRoute>\n        },\n        {\n          path: '/account/reauthenticate/totp',\n          element: <AuthenticatedRoute><ReauthenticateTOTP /></AuthenticatedRoute>\n        },\n        {\n          path: '/account/reauthenticate/recovery-codes',\n          element: <AuthenticatedRoute><ReauthenticateRecoveryCodes /></AuthenticatedRoute>\n        },\n        {\n          path: '/account/reauthenticate/webauthn',\n          element: <AuthenticatedRoute><ReauthenticateWebAuthn /></AuthenticatedRoute>\n        },\n        {\n          path: '/account/authenticate/totp',\n          element: <AnonymousRoute><AuthenticateTOTP /></AnonymousRoute>\n        },\n        {\n          path: '/account/2fa/trust',\n          element: <AnonymousRoute><Trust /></AnonymousRoute>\n        },\n        {\n          path: '/account/authenticate/recovery-codes',\n          element: <AnonymousRoute><AuthenticateRecoveryCodes /></AnonymousRoute>\n        },\n        {\n          path: '/account/authenticate/webauthn',\n          element: <AnonymousRoute><AuthenticateWebAuthn /></AnonymousRoute>\n        },\n        {\n          path: '/account/2fa/totp/activate',\n          element: <AuthenticatedRoute><ActivateTOTP /></AuthenticatedRoute>,\n          loader: activateTOTPLoader\n        },\n        {\n          path: '/account/2fa/totp/deactivate',\n          element: <AuthenticatedRoute><DeactivateTOTP /></AuthenticatedRoute>\n        },\n        {\n          path: '/account/2fa/recovery-codes',\n          element: <AuthenticatedRoute><RecoveryCodes /></AuthenticatedRoute>,\n          loader: recoveryCodesLoader\n        },\n        {\n          path: '/account/2fa/recovery-codes/generate',\n          element: <AuthenticatedRoute><GenerateRecoveryCodes /></AuthenticatedRoute>,\n          loader: generateRecoveryCodesLoader\n        },\n        {\n          path: '/account/2fa/webauthn',\n          element: <AuthenticatedRoute><ListWebAuthn /></AuthenticatedRoute>,\n          loader: listWebAuthnLoader\n        },\n        {\n          path: '/account/2fa/webauthn/add',\n          element: <AuthenticatedRoute><AddWebAuthn /></AuthenticatedRoute>\n        },\n        {\n          path: '/account/sessions',\n          element: <AuthenticatedRoute><Sessions /></AuthenticatedRoute>\n        }\n      ]\n    }\n  ])\n}\n\nexport default function Router () {\n  // If we create the router globally, the loaders of the routes already trigger\n  // even before the <AuthContext/> trigger the initial loading of the auth.\n  // state.\n  const [router, setRouter] = useState(null)\n  const config = useConfig()\n  useEffect(() => {\n    setRouter(createRouter(config))\n  }, [config])\n  return router ? <RouterProvider router={router} /> : null\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/AuthenticateFlow.js",
    "content": "import { Link, useLocation } from 'react-router-dom'\nimport { pathForFlow } from '../auth'\nimport { Flows, AuthenticatorType } from '../lib/allauth'\n\nconst flowLabels = {}\nflowLabels[Flows.REAUTHENTICATE] = 'Use your password'\nflowLabels[`${Flows.MFA_REAUTHENTICATE}:${AuthenticatorType.TOTP}`] = 'Use your authenticator app'\nflowLabels[`${Flows.MFA_REAUTHENTICATE}:${AuthenticatorType.RECOVERY_CODES}`] = 'Use a recovery code'\nflowLabels[`${Flows.MFA_REAUTHENTICATE}:${AuthenticatorType.WEBAUTHN}`] = 'Use security key'\n\nfunction flowsToMethods (flows) {\n  const methods = []\n  flows.forEach(flow => {\n    if (flow.id === Flows.MFA_REAUTHENTICATE) {\n      flow.types.forEach(typ => {\n        methods.push({\n          label: flowLabels[`${flow.id}:${typ}`] || flow.id,\n          id: flow.id,\n          path: pathForFlow(flow, typ)\n        })\n      })\n    } else {\n      methods.push({\n        label: flowLabels[flow.id] || flow.id,\n        id: flow.id,\n        path: pathForFlow(flow)\n      })\n    }\n  })\n  return methods\n}\n\nexport default function ReauthenticateFlow (props) {\n  const location = useLocation()\n  const methods = flowsToMethods(location.state.reauth.data.flows)\n\n  return (\n    <div>\n      <h1>Confirm Access</h1>\n      <p>\n        Please reauthenticate to safeguard your account.\n      </p>\n      {props.children}\n\n      {methods.length > 1\n        ? <><h2>Alternative Options</h2>\n          <ul>\n            {methods.filter(method => method.id !== props.method).map(method => {\n              return (\n                <li key={method.id}>\n                  <Link replace state={location.state} to={method.path + location.search}>{method.label}</Link>\n                </li>\n              )\n            })}\n          </ul>\n        </>\n        : null}\n    </div>\n\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/ChangeEmail.js",
    "content": "import { useState, useEffect } from 'react'\nimport { Navigate } from 'react-router-dom'\nimport * as allauth from '../lib/allauth'\nimport FormErrors from '../components/FormErrors'\nimport Button from '../components/Button'\nimport { useConfig } from '../auth/hooks'\n\nexport default function ChangeEmail () {\n  const config = useConfig()\n  const [email, setEmail] = useState('')\n  const [redirectToVerification, setRedirectToVerification] = useState(false)\n  const [emailAddresses, setEmailAddresses] = useState([])\n  const [response, setResponse] = useState({ fetching: false, content: { status: 200, data: [] } })\n\n  useEffect(() => {\n    setResponse((r) => { return { ...r, fetching: true } })\n    allauth.getEmailAddresses().then((resp) => {\n      if (resp.status === 200) {\n        setEmailAddresses(resp.data)\n      }\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }, [])\n\n  function requestRedirectToVerification () {\n    if (config.data.account.email_verification_by_code_enabled) {\n      setRedirectToVerification(true)\n    }\n  }\n\n  function addEmail () {\n    setResponse({ ...response, fetching: true })\n    allauth.addEmail(email).then((resp) => {\n      setResponse((r) => { return { ...r, content: resp } })\n      if (resp.status === 200) {\n        setEmailAddresses(resp.data)\n        setEmail('')\n        requestRedirectToVerification()\n      }\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n\n  function requestEmailVerification (email) {\n    setResponse({ ...response, fetching: true })\n    allauth.requestEmailVerification(email).then((resp) => {\n      if (resp.status === 200) {\n        requestRedirectToVerification()\n      }\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n\n  function deleteEmail (email) {\n    setResponse({ ...response, fetching: true })\n    allauth.deleteEmail(email).then((resp) => {\n      setResponse((r) => { return { ...r, content: resp } })\n      if (resp.status === 200) {\n        setEmailAddresses(resp.data)\n      }\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n\n  function markAsPrimary (email) {\n    setResponse({ ...response, fetching: true })\n    allauth.markEmailAsPrimary(email).then((resp) => {\n      setResponse((r) => { return { ...r, content: resp } })\n      if (resp.status === 200) {\n        setEmailAddresses(resp.data)\n      }\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n\n  if (redirectToVerification) {\n    return <Navigate to='/account/verify-email' />\n  }\n\n  return (\n    <div>\n      <h1>Change Email</h1>\n\n      <table>\n        <thead>\n          <tr>\n            <th>Email</th>\n            <th>Verified</th>\n            <th>Primary</th>\n            <th>Actions</th>\n          </tr>\n        </thead>\n        <tbody>\n          {emailAddresses.map(ea => {\n            return (\n              <tr key={ea.email}>\n                <td>{ea.email}</td>\n                <td>{ea.verified\n                  ? '✅'\n                  : '❌'}\n                </td>\n                <td>\n                  <input onChange={() => markAsPrimary(ea.email)} type='radio' checked={ea.primary} />\n                </td>\n                <td>\n                  {ea.verified ? '' : <Button onClick={() => requestEmailVerification(ea.email)} disabled={response.fetching}>Resend</Button>}\n                  {ea.primary ? '' : <Button onClick={() => deleteEmail(ea.email)} disabled={response.fetching}>Remove</Button>}\n                </td>\n              </tr>\n            )\n          })}\n        </tbody>\n      </table>\n\n      <h2>Add Email</h2>\n\n      <FormErrors errors={response.content.errors} />\n\n      <div><label>Email <input value={email} onChange={(e) => setEmail(e.target.value)} type='email' required /></label>\n        <FormErrors param='email' errors={response.content?.errors} />\n      </div>\n      <Button disabled={response.fetching} onClick={() => addEmail()}>Add</Button>\n\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/ChangePassword.js",
    "content": "import { useState } from 'react'\nimport FormErrors from '../components/FormErrors'\nimport { changePassword } from '../lib/allauth'\nimport { Navigate } from 'react-router-dom'\nimport { useUser } from '../auth'\nimport Button from '../components/Button'\n\nexport default function ChangePassword () {\n  const hasCurrentPassword = useUser().has_usable_password\n  const [currentPassword, setCurrentPassword] = useState('')\n  const [newPassword, setNewPassword] = useState('')\n  const [newPassword2, setNewPassword2] = useState('')\n  const [newPassword2Errors, setNewPassword2Errors] = useState([])\n\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    if (newPassword !== newPassword2) {\n      setNewPassword2Errors([{ param: 'new_password2', message: 'Password does not match.' }])\n      return\n    }\n    setNewPassword2Errors([])\n    setResponse({ ...response, fetching: true })\n    changePassword({ current_password: currentPassword, new_password: newPassword }).then((resp) => {\n      setResponse((r) => { return { ...r, content: resp } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n  if (response.content?.status === 200) {\n    return <Navigate to='/calculator' />\n  }\n  return (\n    <div>\n      <h1>{hasCurrentPassword ? 'Change Password' : 'Set Password'}</h1>\n\n      <p>{hasCurrentPassword ? 'Enter your current password, followed by your new password.' : 'You currently have no password set. Enter your (new) password.'}</p>\n      {hasCurrentPassword\n        ? <div><label>Current password: <input autoComplete='password' value={currentPassword} onChange={(e) => setCurrentPassword(e.target.value)} type='password' required /></label>\n          <FormErrors param='current_password' errors={response.content?.errors} />\n          </div>\n        : null}\n      <div><label>Password: <input autoComplete='new-password' value={newPassword} onChange={(e) => setNewPassword(e.target.value)} type='password' required /></label>\n        <FormErrors param='new_password' errors={response.content?.errors} />\n      </div>\n      <div><label>Password (again): <input value={newPassword2} onChange={(e) => setNewPassword2(e.target.value)} type='password' required /></label>\n        <FormErrors param='new_password2' errors={newPassword2Errors} />\n      </div>\n\n      <Button disabled={response.fetching} onClick={() => submit()}>{hasCurrentPassword ? 'Change' : 'Set'}</Button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/ConfirmLoginCode.js",
    "content": "import { useState } from 'react'\nimport FormErrors from '../components/FormErrors'\nimport { confirmLoginCode, Flows } from '../lib/allauth'\nimport { Navigate } from 'react-router-dom'\nimport Button from '../components/Button'\nimport { useAuthStatus } from '../auth'\n\nexport default function ConfirmLoginCode () {\n  const [, authInfo] = useAuthStatus()\n  const [code, setCode] = useState('')\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    confirmLoginCode(code).then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n\n  if (response.content?.status === 409 || authInfo.pendingFlow?.id !== Flows.LOGIN_BY_CODE) {\n    return <Navigate to='/account/login/code' />\n  }\n  return (\n    <div>\n      <h1>Enter Sign-In Code </h1>\n      <p>\n        The code expires shortly, so please enter it soon.\n      </p>\n\n      <FormErrors errors={response.content?.errors} />\n\n      <div><label>Code <input value={code} onChange={(e) => setCode(e.target.value)} type='code' required /></label>\n        <FormErrors param='code' errors={response.content?.errors} />\n      </div>\n      <Button disabled={response.fetching} onClick={() => submit()}>Sign In</Button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/ConfirmPasswordResetCode.js",
    "content": "import { useState } from 'react'\nimport FormErrors from '../components/FormErrors'\nimport { getPasswordReset, Flows } from '../lib/allauth'\nimport { Navigate } from 'react-router-dom'\nimport Button from '../components/Button'\nimport { useAuthStatus } from '../auth'\n\nexport default function ConfirmPasswordResetCode () {\n  const [, authInfo] = useAuthStatus()\n  const [code, setCode] = useState('')\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    getPasswordReset(code).then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n\n  if (response.content?.status === 409 || authInfo.pendingFlow?.id !== Flows.PASSWORD_RESET_BY_CODE) {\n    return <Navigate to='/account/password/reset' />\n  } else if (response.content?.status === 200) {\n    return <Navigate state={{ resetKey: code, resetKeyResponse: response.content }} to='/account/password/reset/complete' />\n  }\n  return (\n    <div>\n      <h1>Enter Password Reset Code </h1>\n      <p>\n        The code expires shortly, so please enter it soon.\n      </p>\n\n      <FormErrors errors={response.content?.errors} />\n\n      <div><label>Code <input value={code} onChange={(e) => setCode(e.target.value)} type='code' required /></label>\n        <FormErrors param='key' errors={response.content?.errors} />\n      </div>\n      <Button disabled={response.fetching} onClick={() => submit()}>Confirm</Button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/Login.js",
    "content": "import { useState } from 'react'\nimport FormErrors from '../components/FormErrors'\nimport { login } from '../lib/allauth'\nimport { Link } from 'react-router-dom'\nimport { useConfig } from '../auth'\nimport ProviderList from '../socialaccount/ProviderList'\nimport Button from '../components/Button'\nimport WebAuthnLoginButton from '../mfa/WebAuthnLoginButton'\n\nexport default function Login () {\n  const [email, setEmail] = useState('')\n  const [password, setPassword] = useState('')\n  const [response, setResponse] = useState({ fetching: false, content: null })\n  const config = useConfig()\n  const hasProviders = config.data.socialaccount?.providers?.length > 0\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    login({ email, password }).then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n  return (\n    <div>\n      <h1>Login</h1>\n      <p>\n        No account? <Link to='/account/signup'>Sign up here.</Link>\n      </p>\n\n      <FormErrors errors={response.content?.errors} />\n\n      <div><label>Email <input value={email} onChange={(e) => setEmail(e.target.value)} type='email' required /></label>\n        <FormErrors param='email' errors={response.content?.errors} />\n      </div>\n      <div><label>Password: <input value={password} onChange={(e) => setPassword(e.target.value)} type='password' required /></label>\n        <Link to='/account/password/reset'>Forgot your password?</Link>\n        <FormErrors param='password' errors={response.content?.errors} />\n      </div>\n      <Button disabled={response.fetching} onClick={() => submit()}>Login</Button>\n      {config.data.account.login_by_code_enabled\n        ? <Link className='btn btn-secondary' to='/account/login/code'>Send me a sign-in code</Link>\n        : null}\n      <WebAuthnLoginButton>Sign in with a passkey</WebAuthnLoginButton>\n      {hasProviders\n        ? <>\n          <h2>Or use a third-party</h2>\n          <ProviderList callbackURL='/account/provider/callback' />\n        </>\n        : null}\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/Logout.js",
    "content": "import { useState } from 'react'\nimport { Navigate } from 'react-router-dom'\nimport { logout } from '../lib/allauth'\nimport Button from '../components/Button'\n\nexport default function Logout () {\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    logout().then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n  if (response.content) {\n    return <Navigate to='/' />\n  }\n  return (\n    <div>\n      <h1>Logout</h1>\n      <p>\n        Are you sure you want to logout?\n      </p>\n\n      <Button disabled={response.fetching} onClick={() => submit()}>Logout</Button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/Reauthenticate.js",
    "content": "import { useState } from 'react'\nimport FormErrors from '../components/FormErrors'\nimport { reauthenticate, Flows } from '../lib/allauth'\nimport ReauthenticateFlow from './ReauthenticateFlow'\nimport Button from '../components/Button'\n\nexport default function Reauthenticate () {\n  const [password, setPassword] = useState('')\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    reauthenticate({ password }).then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n  return (\n    <ReauthenticateFlow flow={Flows.REAUTHENTICATE}>\n      <p>Enter your password:</p>\n\n      <FormErrors errors={response.content?.errors} />\n\n      <div><label>Password: <input value={password} onChange={(e) => setPassword(e.target.value)} type='password' required /></label>\n        <FormErrors param='password' errors={response.content?.errors} />\n      </div>\n      <Button disabled={response.fetching} onClick={() => submit()}>Confirm</Button>\n    </ReauthenticateFlow>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/ReauthenticateFlow.js",
    "content": "import { Link, useLocation } from 'react-router-dom'\nimport { pathForFlow } from '../auth'\nimport { Flows, AuthenticatorType } from '../lib/allauth'\n\nconst flowLabels = {}\nflowLabels[Flows.REAUTHENTICATE] = 'Use your password'\nflowLabels[`${Flows.MFA_REAUTHENTICATE}:${AuthenticatorType.TOTP}`] = 'Use your authenticator app'\nflowLabels[`${Flows.MFA_REAUTHENTICATE}:${AuthenticatorType.RECOVERY_CODES}`] = 'Use a recovery code'\nflowLabels[`${Flows.MFA_REAUTHENTICATE}:${AuthenticatorType.WEBAUTHN}`] = 'Use security key'\n\nfunction flowsToMethods (flows) {\n  const methods = []\n  flows.forEach(flow => {\n    if (flow.id === Flows.MFA_REAUTHENTICATE) {\n      flow.types.forEach(typ => {\n        const id = `${flow.id}:${typ}`\n        methods.push({\n          label: flowLabels[id],\n          id,\n          path: pathForFlow(flow, typ)\n        })\n      })\n    } else {\n      methods.push({\n        label: flowLabels[flow.id] || flow.id,\n        id: flow.id,\n        path: pathForFlow(flow)\n      })\n    }\n  })\n  return methods\n}\n\nexport default function ReauthenticateFlow (props) {\n  const location = useLocation()\n  const methods = flowsToMethods(location.state.reauth.data.flows)\n\n  return (\n    <div>\n      <h1>Confirm Access</h1>\n      <p>\n        Please reauthenticate to safeguard your account.\n      </p>\n      {props.children}\n\n      {methods.length > 1\n        ? <><h2>Alternative Options</h2>\n          <ul>\n            {methods.filter(method => method.id !== props.method).map(method => {\n              return (\n                <li key={method.id}>\n                  <Link replace state={location.state} to={method.path + location.search}>{method.label}</Link>\n                </li>\n              )\n            })}\n          </ul>\n        </>\n        : null}\n    </div>\n\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/RequestLoginCode.js",
    "content": "import { useState } from 'react'\nimport FormErrors from '../components/FormErrors'\nimport { requestLoginCode } from '../lib/allauth'\nimport { Navigate } from 'react-router-dom'\nimport Button from '../components/Button'\n\nexport default function RequestLoginCode () {\n  const [email, setEmail] = useState('')\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    requestLoginCode(email).then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n\n  if (response.content?.status === 401) {\n    return <Navigate to='/account/login/code/confirm' />\n  }\n  return (\n    <div>\n      <h1>Send me a sign-in code</h1>\n      <p>\n        You will receive an email containing a special code for a password-free sign-in.\n      </p>\n\n      <FormErrors errors={response.content?.errors} />\n\n      <div><label>Email <input value={email} onChange={(e) => setEmail(e.target.value)} type='email' required /></label>\n        <FormErrors param='email' errors={response.content?.errors} />\n      </div>\n      <Button disabled={response.fetching} onClick={() => submit()}>Request Code</Button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/RequestPasswordReset.js",
    "content": "import { useState } from 'react'\nimport FormErrors from '../components/FormErrors'\nimport { requestPasswordReset, Flows } from '../lib/allauth'\nimport { Navigate, Link } from 'react-router-dom'\nimport Button from '../components/Button'\n\nexport default function RequestPasswordReset () {\n  const [email, setEmail] = useState('')\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    requestPasswordReset(email).then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n\n  if (response.content?.status === 401) {\n    return <Navigate to='/account/password/reset/confirm' />\n  }\n  if (response.content?.status === 200) {\n    return (\n      <div>\n        <h1>Reset Password</h1>\n        <p>Password reset sent.</p>\n      </div>\n    )\n  }\n  return (\n    <div>\n      <h1>Reset Password</h1>\n      <p>\n        Remember your password? <Link to='/account/login'>Back to login.</Link>\n      </p>\n\n      <FormErrors errors={response.content?.errors} />\n\n      <div><label>Email <input value={email} onChange={(e) => setEmail(e.target.value)} type='email' required /></label>\n        <FormErrors param='email' errors={response.content?.errors} />\n      </div>\n      <Button disabled={response.fetching} onClick={() => submit()}>Reset</Button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/ResetPassword.js",
    "content": "import { useState } from 'react'\nimport FormErrors from '../components/FormErrors'\nimport { getPasswordReset, resetPassword } from '../lib/allauth'\nimport { Navigate, Link, useLocation, useLoaderData } from 'react-router-dom'\nimport Button from '../components/Button'\n\nexport async function resetPasswordByLinkLoader ({ params }) {\n  const key = params.key\n  const resp = await getPasswordReset(key)\n  return { resetKey: key, resetKeyResponse: resp }\n}\n\nfunction ResetPassword ({ resetKey, resetKeyResponse }) {\n  const [password1, setPassword1] = useState('')\n  const [password2, setPassword2] = useState('')\n  const [password2Errors, setPassword2Errors] = useState([])\n\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    if (password2 !== password1) {\n      setPassword2Errors([{ param: 'password2', message: 'Password does not match.' }])\n      return\n    }\n    setPassword2Errors([])\n    setResponse({ ...response, fetching: true })\n    resetPassword({ key: resetKey, password: password1 }).then((resp) => {\n      setResponse((r) => { return { ...r, content: resp } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n  if ([200, 401].includes(response.content?.status)) {\n    return <Navigate to='/account/login' />\n  }\n  let body\n  if (resetKeyResponse.status !== 200) {\n    body = <FormErrors param='key' errors={resetKeyResponse.errors} />\n  } else if (response.content?.errors?.filter(e => e.param === 'key')) {\n    body = <FormErrors param='key' errors={response.content?.errors} />\n  } else {\n    body = (\n      <>\n        <div><label>Password: <input autoComplete='new-password' value={password1} onChange={(e) => setPassword1(e.target.value)} type='password' required /></label>\n          <FormErrors param='password' errors={response.content?.errors} />\n        </div>\n        <div><label>Password (again): <input value={password2} onChange={(e) => setPassword2(e.target.value)} type='password' required /></label>\n          <FormErrors param='password2' errors={password2Errors} />\n        </div>\n\n        <Button disabled={response.fetching} onClick={() => submit()}>Reset</Button>\n      </>\n    )\n  }\n\n  return (\n    <div>\n      <h1>Reset Password</h1>\n      <p>\n        Remember your password? <Link to='/account/login'>Back to login.</Link>\n      </p>\n      {body}\n    </div>\n  )\n}\n\nexport function ResetPasswordByLink () {\n  const { resetKey, resetKeyResponse } = useLoaderData()\n  return <ResetPassword resetKey={resetKey} resetKeyResponse={resetKeyResponse} />\n}\n\nexport function ResetPasswordByCode () {\n  const { state } = useLocation()\n  if (!state || !state.resetKey || !state.resetKeyResponse) {\n    return <Navigate to='/account/password/reset' />\n  }\n  return <ResetPassword resetKey={state.resetKey} resetKeyResponse={state.resetKeyResponse} />\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/Signup.js",
    "content": "import { useState } from 'react'\nimport FormErrors from '../components/FormErrors'\nimport { signUp } from '../lib/allauth'\nimport { Link } from 'react-router-dom'\nimport { useConfig } from '../auth'\nimport ProviderList from '../socialaccount/ProviderList'\nimport Button from '../components/Button'\n\nexport default function Signup () {\n  const [email, setEmail] = useState('')\n  const [password1, setPassword1] = useState('')\n  const [password2, setPassword2] = useState('')\n  const [password2Errors, setPassword2Errors] = useState([])\n  const [response, setResponse] = useState({ fetching: false, content: null })\n  const config = useConfig()\n  const hasProviders = config.data.socialaccount?.providers?.length > 0\n\n  function submit () {\n    if (password2 !== password1) {\n      setPassword2Errors([{ param: 'password2', message: 'Password does not match.' }])\n      return\n    }\n    setPassword2Errors([])\n    setResponse({ ...response, fetching: true })\n    signUp({ email, password: password1 }).then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n\n  return (\n    <div>\n      <h1>Sign Up</h1>\n      <p>\n        Already have an account? <Link to='/account/login'>Login here.</Link>\n      </p>\n\n      <FormErrors errors={response.content?.errors} />\n\n      <div><label>Email <input value={email} onChange={(e) => setEmail(e.target.value)} type='email' required /></label>\n        <FormErrors param='email' errors={response.content?.errors} />\n      </div>\n      <div><label>Password: <input autoComplete='new-password' value={password1} onChange={(e) => setPassword1(e.target.value)} type='password' required /></label>\n        <FormErrors param='password' errors={response.content?.errors} />\n      </div>\n      <div><label>Password (again): <input value={password2} onChange={(e) => setPassword2(e.target.value)} type='password' required /></label>\n        <FormErrors param='password2' errors={password2Errors} />\n      </div>\n      <Button disabled={response.fetching} onClick={() => submit()}>Sign Up</Button>\n      <a href='/account/signup/passkey'>Sign up using a passkey</a>\n\n      {hasProviders\n        ? <>\n          <h2>Or use a third-party</h2>\n          <ProviderList callbackURL='/account/provider/callback' />\n        </>\n        : null}\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/VerificationEmailSent.js",
    "content": "export default function VerificationEmailSent () {\n  return (\n    <div>\n      <h1>Confirm Email Address</h1>\n      <p>Please confirm your email address.</p>\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/VerifyEmail.js",
    "content": "import { useState } from 'react'\nimport {\n  useLoaderData,\n  Navigate\n} from 'react-router-dom'\nimport { getEmailVerification, verifyEmail } from '../lib/allauth'\nimport Button from '../components/Button'\n\nexport async function loader ({ params }) {\n  const key = params.key\n  const resp = await getEmailVerification(key)\n  return { key, verification: resp }\n}\n\nexport default function VerifyEmail () {\n  const { key, verification } = useLoaderData()\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    verifyEmail(key).then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n\n  if ([200, 401].includes(response.content?.status)) {\n    return <Navigate to='/account/email' />\n  }\n\n  let body = null\n  if (verification.status === 200) {\n    body = (\n      <>\n        <p>Please confirm that <a href={'mailto:' + verification.data.email}>{verification.data.email}</a> is an email address for user {verification.data.user.str}.</p>\n        <Button disabled={response.fetching} onClick={() => submit()}>Confirm</Button>\n      </>\n    )\n  } else if (!verification.data?.email) {\n    body = <p>Invalid verification link.</p>\n  } else {\n    body = <p>Unable to confirm email <a href={'mailto:' + verification.data.email}>{verification.data.email}</a> because it is already confirmed.</p>\n  }\n  return (\n    <div>\n      <h1>Confirm Email Address</h1>\n      {body}\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/account/VerifyEmailByCode.js",
    "content": "import { useState } from 'react'\nimport FormErrors from '../components/FormErrors'\nimport {\n  Navigate\n} from 'react-router-dom'\nimport { verifyEmail } from '../lib/allauth'\nimport Button from '../components/Button'\n\nexport default function VerifyEmail () {\n  const [code, setCode] = useState('')\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    verifyEmail(code).then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n\n  if ([200, 401].includes(response.content?.status)) {\n    return <Navigate to='/account/email' />\n  }\n\n  return (\n    <div>\n      <h1>Confirm Email Address</h1>\n      <FormErrors errors={response.content?.errors} />\n\n      <div><label>Code <input value={code} onChange={(e) => setCode(e.target.value)} type='code' required /></label>\n        <FormErrors param='key' errors={response.content?.errors} />\n      </div>\n      <Button disabled={response.fetching} onClick={() => submit()}>Confirm</Button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/auth/AuthContext.js",
    "content": "import { useEffect, createContext, useState } from 'react'\nimport { getAuth, getConfig } from '../lib/allauth'\n\nexport const AuthContext = createContext(null)\n\nfunction Loading () {\n  return <div>Starting...</div>\n}\n\nfunction LoadingError () {\n  return <div>Loading error!</div>\n}\n\nexport function AuthContextProvider (props) {\n  const [auth, setAuth] = useState(undefined)\n  const [config, setConfig] = useState(undefined)\n\n  useEffect(() => {\n    function onAuthChanged (e) {\n      setAuth(auth => {\n        if (typeof auth === 'undefined') {\n          console.log('Authentication status loaded')\n        } else {\n          console.log('Authentication status updated')\n        }\n        return e.detail\n      }\n      )\n    }\n\n    document.addEventListener('allauth.auth.change', onAuthChanged)\n    getAuth().then(data => setAuth(data)).catch((e) => {\n      console.error(e)\n      setAuth(false)\n    })\n    getConfig().then(data => setConfig(data)).catch((e) => {\n      console.error(e)\n    })\n    return () => {\n      document.removeEventListener('allauth.auth.change', onAuthChanged)\n    }\n  }, [])\n  const loading = (typeof auth === 'undefined') || config?.status !== 200\n  return (\n    <AuthContext.Provider value={{ auth, config }}>\n      {loading\n        ? <Loading />\n        : (auth === false\n            ? <LoadingError />\n            : props.children)}\n    </AuthContext.Provider>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/auth/hooks.js",
    "content": "import { useContext, useRef, useState, useEffect } from 'react'\nimport { AuthContext } from './AuthContext'\n\nexport function useAuth () {\n  return useContext(AuthContext)?.auth\n}\n\nexport function useConfig () {\n  return useContext(AuthContext)?.config\n}\n\nexport function useUser () {\n  const auth = useContext(AuthContext)?.auth\n  return authInfo(auth).user\n}\n\nexport function useAuthInfo () {\n  const auth = useContext(AuthContext)?.auth\n  return authInfo(auth)\n}\n\nfunction authInfo (auth) {\n  const isAuthenticated = auth.status === 200 || (auth.status === 401 && auth.meta.is_authenticated)\n  const requiresReauthentication = isAuthenticated && auth.status === 401\n  const pendingFlow = auth.data?.flows?.find(flow => flow.is_pending)\n  return { isAuthenticated, requiresReauthentication, user: isAuthenticated ? auth.data.user : null, pendingFlow }\n}\n\nexport const AuthChangeEvent = Object.freeze({\n  LOGGED_OUT: 'LOGGED_OUT',\n  LOGGED_IN: 'LOGGED_IN',\n  REAUTHENTICATED: 'REAUTHENTICATED',\n  REAUTHENTICATION_REQUIRED: 'REAUTHENTICATION_REQUIRED',\n  FLOW_UPDATED: 'FLOW_UPDATED'\n})\n\nfunction determineAuthChangeEvent (fromAuth, toAuth) {\n  let fromInfo = authInfo(fromAuth)\n  const toInfo = authInfo(toAuth)\n  if (toAuth.status === 410) {\n    return AuthChangeEvent.LOGGED_OUT\n  }\n  // Corner case: user ID change. Treat as if we're transitioning from anonymous state.\n  if (fromInfo.user && toInfo.user && fromInfo.user?.id !== toInfo.user?.id) {\n    fromInfo = { isAuthenticated: false, requiresReauthentication: false, user: null }\n  }\n  if (!fromInfo.isAuthenticated && toInfo.isAuthenticated) {\n    // You typically don't transition from logged out to reauthentication required.\n    return AuthChangeEvent.LOGGED_IN\n  } else if (fromInfo.isAuthenticated && !toInfo.isAuthenticated) {\n    return AuthChangeEvent.LOGGED_OUT\n  } else if (fromInfo.isAuthenticated && toInfo.isAuthenticated) {\n    if (toInfo.requiresReauthentication) {\n      return AuthChangeEvent.REAUTHENTICATION_REQUIRED\n    } else if (fromInfo.requiresReauthentication) {\n      return AuthChangeEvent.REAUTHENTICATED\n    } else if (fromAuth.data.methods.length < toAuth.data.methods.length) {\n      // If you do a page reload when on the reauthentication page, both fromAuth\n      // and toAuth are authenticated, and it won't see the change when\n      // reauthentication without this.\n      return AuthChangeEvent.REAUTHENTICATED\n    }\n  } else if (!fromInfo.isAuthenticated && !toInfo.isAuthenticated) {\n    const fromFlow = fromInfo.pendingFlow\n    const toFlow = toInfo.pendingFlow\n    if (toFlow?.id && fromFlow?.id !== toFlow.id) {\n      return AuthChangeEvent.FLOW_UPDATED\n    }\n  }\n  // No change.\n  return null\n}\n\nexport function useAuthChange () {\n  const auth = useAuth()\n  const ref = useRef({ prevAuth: auth, event: null, didChange: false })\n  const [, setForcedUpdate] = useState(0)\n  useEffect(() => {\n    if (ref.current.prevAuth) {\n      ref.current.didChange = true\n      const event = determineAuthChangeEvent(ref.current.prevAuth, auth)\n      if (event) {\n        ref.current.event = event\n        setForcedUpdate(gen => gen + 1)\n      }\n    }\n    ref.current.prevAuth = auth\n  }, [auth, ref])\n  const didChange = ref.current.didChange\n  if (didChange) {\n    ref.current.didChange = false\n  }\n  const event = ref.current.event\n  if (event) {\n    ref.current.event = null\n  }\n\n  return [auth, event]\n}\n\nexport function useAuthStatus () {\n  const auth = useAuth()\n  return [auth, authInfo(auth)]\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/auth/index.js",
    "content": "export { AuthContextProvider } from './AuthContext'\nexport { URLs, pathForPendingFlow, pathForFlow, AuthChangeRedirector, AuthenticatedRoute, AnonymousRoute } from './routing'\nexport { useConfig, useAuth, useUser, useAuthStatus } from './hooks'\n"
  },
  {
    "path": "examples/react-spa/frontend/src/auth/routing.js",
    "content": "import {\n  Navigate,\n  useLocation\n} from 'react-router-dom'\nimport { useAuthChange, AuthChangeEvent, useAuthStatus } from './hooks'\nimport { Flows, AuthenticatorType } from '../lib/allauth'\n\nexport const URLs = Object.freeze({\n  LOGIN_URL: '/account/login',\n  LOGIN_REDIRECT_URL: '/calculator',\n  LOGOUT_REDIRECT_URL: '/'\n})\n\nconst flow2path = {}\nflow2path[Flows.LOGIN] = '/account/login'\nflow2path[Flows.LOGIN_BY_CODE] = '/account/login/code/confirm'\nflow2path[Flows.SIGNUP] = '/account/signup'\nflow2path[Flows.VERIFY_EMAIL] = '/account/verify-email'\nflow2path[Flows.PASSWORD_RESET_BY_CODE] = '/account/password/reset/confirm'\nflow2path[Flows.PROVIDER_SIGNUP] = '/account/provider/signup'\nflow2path[Flows.REAUTHENTICATE] = '/account/reauthenticate'\nflow2path[Flows.MFA_TRUST] = '/account/2fa/trust'\nflow2path[`${Flows.MFA_AUTHENTICATE}:${AuthenticatorType.TOTP}`] = '/account/authenticate/totp'\nflow2path[`${Flows.MFA_AUTHENTICATE}:${AuthenticatorType.RECOVERY_CODES}`] = '/account/authenticate/recovery-codes'\nflow2path[`${Flows.MFA_AUTHENTICATE}:${AuthenticatorType.WEBAUTHN}`] = '/account/authenticate/webauthn'\nflow2path[`${Flows.MFA_REAUTHENTICATE}:${AuthenticatorType.TOTP}`] = '/account/reauthenticate/totp'\nflow2path[`${Flows.MFA_REAUTHENTICATE}:${AuthenticatorType.RECOVERY_CODES}`] = '/account/reauthenticate/recovery-codes'\nflow2path[`${Flows.MFA_REAUTHENTICATE}:${AuthenticatorType.WEBAUTHN}`] = '/account/reauthenticate/webauthn'\nflow2path[Flows.MFA_WEBAUTHN_SIGNUP] = '/account/signup/passkey/create'\n\nexport function pathForFlow (flow, typ) {\n  let key = flow.id\n  if (typeof flow.types !== 'undefined') {\n    typ = typ ?? flow.types[0]\n    key = `${key}:${typ}`\n  }\n  const path = flow2path[key] ?? flow2path[flow.id]\n  if (!path) {\n    throw new Error(`Unknown path for flow: ${flow.id}`)\n  }\n  return path\n}\n\nexport function pathForPendingFlow (auth) {\n  const flow = auth.data.flows.find(flow => flow.is_pending)\n  if (flow) {\n    return pathForFlow(flow)\n  }\n  return null\n}\n\nfunction navigateToPendingFlow (auth) {\n  const path = pathForPendingFlow(auth)\n  if (path) {\n    return <Navigate to={path} />\n  }\n  return null\n}\n\nexport function AuthenticatedRoute ({ children }) {\n  const location = useLocation()\n  const [, status] = useAuthStatus()\n  const next = `next=${encodeURIComponent(location.pathname + location.search)}`\n  if (status.isAuthenticated) {\n    return children\n  } else {\n    return <Navigate to={`${URLs.LOGIN_URL}?${next}`} />\n  }\n}\n\nexport function AnonymousRoute ({ children }) {\n  const [, status] = useAuthStatus()\n  if (!status.isAuthenticated) {\n    return children\n  } else {\n    return <Navigate to={URLs.LOGIN_REDIRECT_URL} />\n  }\n}\n\nexport function AuthChangeRedirector ({ children }) {\n  const [auth, event] = useAuthChange()\n  const location = useLocation()\n  switch (event) {\n    case AuthChangeEvent.LOGGED_OUT:\n      return <Navigate to={URLs.LOGOUT_REDIRECT_URL} />\n    case AuthChangeEvent.LOGGED_IN:\n      return <Navigate to={URLs.LOGIN_REDIRECT_URL} />\n    case AuthChangeEvent.REAUTHENTICATED:\n    {\n      const next = new URLSearchParams(location.search).get('next') || '/'\n      return <Navigate to={next} />\n    }\n    case AuthChangeEvent.REAUTHENTICATION_REQUIRED: {\n      const next = `next=${encodeURIComponent(location.pathname + location.search)}`\n      const path = pathForFlow(auth.data.flows[0])\n      return <Navigate to={`${path}?${next}`} state={{ reauth: auth }} />\n    }\n    case AuthChangeEvent.FLOW_UPDATED:\n      const pendingFlow = navigateToPendingFlow(auth)\n      if (!pendingFlow) {\n        throw new Error()\n      }\n      return pendingFlow\n    default:\n      break\n  }\n  // ...stay where we are\n  return children\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/components/Button.js",
    "content": "export default function Button (props) {\n  return <button className='btn btn-primary' {...props}>{props.children}</button>\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/components/FormErrors.js",
    "content": "export default function FormErrors (props) {\n  if (!props.errors || !props.errors.length) {\n    return null\n  }\n  const errors = props.errors.filter(error => (props.param ? error.param === props.param : error.param == null))\n  if (!errors.length) {\n    return null\n  }\n  return <ul style={{ color: 'darkred' }}>{errors.map((e, i) => <li key={i}>{e.message}</li>)}</ul>\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/index.js",
    "content": "import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport App from './App'\nimport { init } from './init'\n\ninit()\n\nconst root = ReactDOM.createRoot(document.getElementById('root'))\nroot.render(\n  <App />\n)\n"
  },
  {
    "path": "examples/react-spa/frontend/src/init.js",
    "content": "import { setup } from './lib/allauth'\n\nexport function init () {\n  if (document.location.hostname === 'app.react.demo.allauth.org') {\n    setup('app', 'https://api.react.demo.allauth.org/_allauth/app/v1', false)\n  } else if (document.location.hostname === 'react.demo.allauth.org') {\n    setup('browser', 'https://api.react.demo.allauth.org/_allauth/browser/v1', true)\n  }\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/lib/allauth.js",
    "content": "import { getCSRFToken } from './django'\n\nexport const Client = Object.freeze({\n  APP: 'app',\n  BROWSER: 'browser'\n})\n\nexport const settings = {\n  client: Client.BROWSER,\n  baseUrl: `/_allauth/${Client.BROWSER}/v1`,\n  withCredentials: false\n}\n\nconst ACCEPT_JSON = {\n  accept: 'application/json'\n}\n\nexport const AuthProcess = Object.freeze({\n  LOGIN: 'login',\n  CONNECT: 'connect'\n})\n\nexport const Flows = Object.freeze({\n  LOGIN: 'login',\n  LOGIN_BY_CODE: 'login_by_code',\n  MFA_AUTHENTICATE: 'mfa_authenticate',\n  MFA_REAUTHENTICATE: 'mfa_reauthenticate',\n  MFA_TRUST: 'mfa_trust',\n  MFA_WEBAUTHN_SIGNUP: 'mfa_signup_webauthn',\n  PASSWORD_RESET_BY_CODE: 'password_reset_by_code',\n  PROVIDER_REDIRECT: 'provider_redirect',\n  PROVIDER_SIGNUP: 'provider_signup',\n  REAUTHENTICATE: 'reauthenticate',\n  SIGNUP: 'signup',\n  VERIFY_EMAIL: 'verify_email',\n})\n\nexport const URLs = Object.freeze({\n  // Meta\n  CONFIG: '/config',\n\n  // Account management\n  CHANGE_PASSWORD: '/account/password/change',\n  EMAIL: '/account/email',\n  PROVIDERS: '/account/providers',\n\n  // Account management: 2FA\n  AUTHENTICATORS: '/account/authenticators',\n  RECOVERY_CODES: '/account/authenticators/recovery-codes',\n  TOTP_AUTHENTICATOR: '/account/authenticators/totp',\n\n  // Auth: Basics\n  LOGIN: '/auth/login',\n  REQUEST_LOGIN_CODE: '/auth/code/request',\n  CONFIRM_LOGIN_CODE: '/auth/code/confirm',\n  SESSION: '/auth/session',\n  REAUTHENTICATE: '/auth/reauthenticate',\n  REQUEST_PASSWORD_RESET: '/auth/password/request',\n  RESET_PASSWORD: '/auth/password/reset',\n  SIGNUP: '/auth/signup',\n  VERIFY_EMAIL: '/auth/email/verify',\n\n  // Auth: 2FA\n  MFA_AUTHENTICATE: '/auth/2fa/authenticate',\n  MFA_REAUTHENTICATE: '/auth/2fa/reauthenticate',\n  MFA_TRUST: '/auth/2fa/trust',\n\n  // Auth: Social\n  PROVIDER_SIGNUP: '/auth/provider/signup',\n  REDIRECT_TO_PROVIDER: '/auth/provider/redirect',\n  PROVIDER_TOKEN: '/auth/provider/token',\n\n  // Auth: Sessions\n  SESSIONS: '/auth/sessions',\n\n  // Auth: WebAuthn\n  REAUTHENTICATE_WEBAUTHN: '/auth/webauthn/reauthenticate',\n  AUTHENTICATE_WEBAUTHN: '/auth/webauthn/authenticate',\n  LOGIN_WEBAUTHN: '/auth/webauthn/login',\n  SIGNUP_WEBAUTHN: '/auth/webauthn/signup',\n  WEBAUTHN_AUTHENTICATOR: '/account/authenticators/webauthn'\n})\n\nexport const AuthenticatorType = Object.freeze({\n  TOTP: 'totp',\n  RECOVERY_CODES: 'recovery_codes',\n  WEBAUTHN: 'webauthn'\n})\n\nfunction postForm (action, data) {\n  const f = document.createElement('form')\n  f.method = 'POST'\n  f.action = settings.baseUrl + action\n\n  for (const key in data) {\n    const d = document.createElement('input')\n    d.type = 'hidden'\n    d.name = key\n    d.value = data[key]\n    f.appendChild(d)\n  }\n  document.body.appendChild(f)\n  f.submit()\n}\n\nconst tokenStorage = window.sessionStorage\n\nexport function getSessionToken () {\n  return tokenStorage.getItem('sessionToken')\n}\n\nasync function request (method, path, data, headers) {\n  const options = {\n    method,\n    headers: {\n      ...ACCEPT_JSON,\n      ...headers\n    }\n  }\n  if (settings.withCredentials) {\n    options.credentials = 'include'\n  }\n  // Don't pass along authentication related headers to the config endpoint.\n  if (path !== URLs.CONFIG) {\n    if (settings.client === Client.BROWSER) {\n      options.headers['X-CSRFToken'] = getCSRFToken()\n    } else if (settings.client === Client.APP) {\n      // IMPORTANT!: Do NOT use `Client.APP` in a browser context, as you will\n      // be vulnerable to CSRF attacks. This logic is only here for\n      // development/demonstration/testing purposes...\n      options.headers['User-Agent'] = 'django-allauth example app'\n      const sessionToken = getSessionToken()\n      if (sessionToken) {\n        options.headers['X-Session-Token'] = sessionToken\n      }\n    }\n  }\n\n  if (typeof data !== 'undefined') {\n    options.body = JSON.stringify(data)\n    options.headers['Content-Type'] = 'application/json'\n  }\n  const resp = await fetch(settings.baseUrl + path, options)\n  const msg = await resp.json()\n  if (msg.status === 410) {\n    tokenStorage.removeItem('sessionToken')\n  }\n  if (msg.meta?.session_token) {\n    tokenStorage.setItem('sessionToken', msg.meta.session_token)\n  }\n  if ([401, 410].includes(msg.status) || (msg.status === 200 && msg.meta?.is_authenticated)) {\n    const event = new CustomEvent('allauth.auth.change', { detail: msg })\n    document.dispatchEvent(event)\n  }\n  return msg\n}\n\nexport async function login (data) {\n  return await request('POST', URLs.LOGIN, data)\n}\n\nexport async function reauthenticate (data) {\n  return await request('POST', URLs.REAUTHENTICATE, data)\n}\n\nexport async function logout () {\n  return await request('DELETE', URLs.SESSION)\n}\n\nexport async function signUp (data) {\n  return await request('POST', URLs.SIGNUP, data)\n}\n\nexport async function signUpByPasskey (data) {\n  return await request('POST', URLs.SIGNUP_WEBAUTHN, data)\n}\n\nexport async function providerSignup (data) {\n  return await request('POST', URLs.PROVIDER_SIGNUP, data)\n}\n\nexport async function getProviderAccounts () {\n  return await request('GET', URLs.PROVIDERS)\n}\n\nexport async function disconnectProviderAccount (providerId, accountUid) {\n  return await request('DELETE', URLs.PROVIDERS, { provider: providerId, account: accountUid })\n}\n\nexport async function requestPasswordReset (email) {\n  return await request('POST', URLs.REQUEST_PASSWORD_RESET, { email })\n}\n\nexport async function requestLoginCode (email) {\n  return await request('POST', URLs.REQUEST_LOGIN_CODE, { email })\n}\n\nexport async function confirmLoginCode (code) {\n  return await request('POST', URLs.CONFIRM_LOGIN_CODE, { code })\n}\n\nexport async function getEmailVerification (key) {\n  return await request('GET', URLs.VERIFY_EMAIL, undefined, { 'X-Email-Verification-Key': key })\n}\n\nexport async function getEmailAddresses () {\n  return await request('GET', URLs.EMAIL)\n}\nexport async function getSessions () {\n  return await request('GET', URLs.SESSIONS)\n}\n\nexport async function endSessions (ids) {\n  return await request('DELETE', URLs.SESSIONS, { sessions: ids })\n}\n\nexport async function getAuthenticators () {\n  return await request('GET', URLs.AUTHENTICATORS)\n}\n\nexport async function getTOTPAuthenticator () {\n  return await request('GET', URLs.TOTP_AUTHENTICATOR)\n}\n\nexport async function mfaAuthenticate (code) {\n  return await request('POST', URLs.MFA_AUTHENTICATE, { code })\n}\n\nexport async function mfaReauthenticate (code) {\n  return await request('POST', URLs.MFA_REAUTHENTICATE, { code })\n}\n\nexport async function mfaTrust (trust) {\n  return await request('POST', URLs.MFA_TRUST, { trust })\n}\n\nexport async function activateTOTPAuthenticator (code) {\n  return await request('POST', URLs.TOTP_AUTHENTICATOR, { code })\n}\n\nexport async function deactivateTOTPAuthenticator () {\n  return await request('DELETE', URLs.TOTP_AUTHENTICATOR)\n}\n\nexport async function getRecoveryCodes () {\n  return await request('GET', URLs.RECOVERY_CODES)\n}\n\nexport async function generateRecoveryCodes () {\n  return await request('POST', URLs.RECOVERY_CODES)\n}\n\nexport async function getConfig () {\n  return await request('GET', URLs.CONFIG)\n}\n\nexport async function addEmail (email) {\n  return await request('POST', URLs.EMAIL, { email })\n}\n\nexport async function deleteEmail (email) {\n  return await request('DELETE', URLs.EMAIL, { email })\n}\n\nexport async function markEmailAsPrimary (email) {\n  return await request('PATCH', URLs.EMAIL, { email, primary: true })\n}\n\nexport async function requestEmailVerification (email) {\n  return await request('PUT', URLs.EMAIL, { email })\n}\n\nexport async function verifyEmail (key) {\n  return await request('POST', URLs.VERIFY_EMAIL, { key })\n}\n\nexport async function getPasswordReset (key) {\n  return await request('GET', URLs.RESET_PASSWORD, undefined, { 'X-Password-Reset-Key': key })\n}\n\nexport async function resetPassword (data) {\n  return await request('POST', URLs.RESET_PASSWORD, data)\n}\n\nexport async function changePassword (data) {\n  return await request('POST', URLs.CHANGE_PASSWORD, data)\n}\n\nexport async function getAuth () {\n  return await request('GET', URLs.SESSION)\n}\n\nexport async function authenticateByToken (providerId, token, process = AuthProcess.LOGIN) {\n  return await request('POST', URLs.PROVIDER_TOKEN, {\n    provider: providerId,\n    token,\n    process\n  }\n  )\n}\n\nexport function redirectToProvider (providerId, callbackURL, process = AuthProcess.LOGIN) {\n  postForm(URLs.REDIRECT_TO_PROVIDER, {\n    provider: providerId,\n    process,\n    callback_url: window.location.protocol + '//' + window.location.host + callbackURL,\n    csrfmiddlewaretoken: getCSRFToken()\n  })\n}\n\nexport async function getWebAuthnCreateOptions (passwordless) {\n  let url = URLs.WEBAUTHN_AUTHENTICATOR\n  if (passwordless) {\n    url += '?passwordless'\n  }\n  return await request('GET', url)\n}\n\nexport async function getWebAuthnCreateOptionsAtSignup () {\n  return await request('GET', URLs.SIGNUP_WEBAUTHN)\n}\n\nexport async function addWebAuthnCredential (name, credential) {\n  return await request('POST', URLs.WEBAUTHN_AUTHENTICATOR, {\n    name,\n    credential\n  })\n}\n\nexport async function signupWebAuthnCredential (name, credential) {\n  return await request('PUT', URLs.SIGNUP_WEBAUTHN, {\n    name,\n    credential\n  })\n}\n\nexport async function deleteWebAuthnCredential (ids) {\n  return await request('DELETE', URLs.WEBAUTHN_AUTHENTICATOR, { authenticators: ids })\n}\n\nexport async function updateWebAuthnCredential (id, data) {\n  return await request('PUT', URLs.WEBAUTHN_AUTHENTICATOR, { id, ...data })\n}\n\nexport async function getWebAuthnRequestOptionsForReauthentication () {\n  return await request('GET', URLs.REAUTHENTICATE_WEBAUTHN)\n}\n\nexport async function reauthenticateUsingWebAuthn (credential) {\n  return await request('POST', URLs.REAUTHENTICATE_WEBAUTHN, { credential })\n}\n\nexport async function authenticateUsingWebAuthn (credential) {\n  return await request('POST', URLs.AUTHENTICATE_WEBAUTHN, { credential })\n}\n\nexport async function loginUsingWebAuthn (credential) {\n  return await request('POST', URLs.LOGIN_WEBAUTHN, { credential })\n}\n\nexport async function getWebAuthnRequestOptionsForLogin () {\n  return await request('GET', URLs.LOGIN_WEBAUTHN)\n}\n\nexport async function getWebAuthnRequestOptionsForAuthentication () {\n  return await request('GET', URLs.AUTHENTICATE_WEBAUTHN)\n}\n\nexport function setup (client, baseUrl, withCredentials) {\n  settings.client = client\n  settings.baseUrl = baseUrl\n  settings.withCredentials = withCredentials\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/lib/django.js",
    "content": "function getCookie (name) {\n  let cookieValue = null\n  if (document.cookie && document.cookie !== '') {\n    const cookies = document.cookie.split(';')\n    for (let i = 0; i < cookies.length; i++) {\n      const cookie = cookies[i].trim()\n      // Does this cookie string begin with the name we want?\n      if (cookie.substring(0, name.length + 1) === (name + '=')) {\n        cookieValue = decodeURIComponent(cookie.substring(name.length + 1))\n        break\n      }\n    }\n  }\n  return cookieValue\n}\nexport function getCSRFToken () {\n  return getCookie('csrftoken')\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/ActivateTOTP.js",
    "content": "import { useState } from 'react'\nimport * as allauth from '../lib/allauth'\nimport { Navigate, useLoaderData } from 'react-router-dom'\nimport FormErrors from '../components/FormErrors'\nimport Button from '../components/Button'\n\nexport async function loader ({ params }) {\n  const resp = await allauth.getTOTPAuthenticator()\n  return { totp: resp }\n}\n\nexport default function ActivateTOTP (props) {\n  const { totp } = useLoaderData()\n  const [code, setCode] = useState('')\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    allauth.activateTOTPAuthenticator(code).then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n  if (totp.status === 200 || response.content?.status === 200) {\n    return <Navigate to='/account/2fa' />\n  }\n  return (\n    <section>\n      <h1>Activate TOTP</h1>\n\n      <div>\n        <label>\n          Authenticator secret:\n          <input disabled type='text' value={totp.meta?.secret} />\n          <span>You can store this secret and use it to reinstall your authenticator app at a later time.</span>\n        </label>\n      </div>\n      <div>\n        <label>\n          Authenticator code:\n          <input type='text' value={code} onChange={(e) => setCode(e.target.value)} />\n        </label>\n        <FormErrors param='code' errors={response.content?.errors} />\n        <FormErrors errors={totp.errors} />\n      </div>\n      <Button onClick={() => submit()}>Activate</Button>\n    </section>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/AddWebAuthn.js",
    "content": "import { useState } from 'react'\nimport { Navigate } from 'react-router-dom'\nimport FormErrors from '../components/FormErrors'\nimport Button from '../components/Button'\nimport * as allauth from '../lib/allauth'\nimport {\n  create,\n  parseCreationOptionsFromJSON\n} from '@github/webauthn-json/browser-ponyfill'\n\nexport default function AddWebAuthn (props) {\n  const [passwordless, setPasswordless] = useState(false)\n  const [name, setName] = useState('')\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  async function submit () {\n    setResponse({ ...response, fetching: true })\n    try {\n      const optResp = await allauth.getWebAuthnCreateOptions(passwordless)\n      if (optResp.status === 200) {\n        const jsonOptions = optResp.data.creation_options\n        const options = parseCreationOptionsFromJSON(jsonOptions)\n        const credential = await create(options)\n        const addResp = await allauth.addWebAuthnCredential(name, credential)\n        setResponse((r) => { return { ...r, content: addResp } })\n      } else {\n        setResponse((r) => { return { ...r, content: optResp } })\n      }\n    } catch (e) {\n      console.error(e)\n      window.alert(e)\n    }\n    setResponse((r) => { return { ...r, fetching: false } })\n  }\n\n  if (response.content?.status === 200) {\n    return <Navigate to={response.content.meta.recovery_codes_generated ? '/account/2fa/recovery-codes' : '/account/2fa/webauthn'} />\n  }\n  return (\n    <section>\n      <h1>Add Security Key</h1>\n\n      <div>\n        <label>\n          Name:\n          <input value={name} onChange={(e) => setName(e.target.value)} />\n          <FormErrors param='name' errors={response.content?.errors} />\n          <FormErrors errors={response.content?.errors} />\n        </label>\n      </div>\n      <div>\n        <label>\n          Passwordless\n          <input type='checkbox' onChange={(e) => setPasswordless(e.target.checked)} checked={passwordless} />\n        </label>\n      </div>\n      <Button disabled={response.fetching} onClick={() => submit()}>Add key</Button>\n    </section>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/AuthenticateCode.js",
    "content": "import { useState } from 'react'\nimport FormErrors from '../components/FormErrors'\nimport * as allauth from '../lib/allauth'\nimport Button from '../components/Button'\nimport { useAuthInfo } from '../auth/hooks'\nimport { Navigate } from 'react-router-dom'\nimport AuthenticateFlow from './AuthenticateFlow'\n\nexport default function AuthenticateCode (props) {\n  const [code, setCode] = useState('')\n  const [response, setResponse] = useState({ fetching: false, content: null })\n  const authInfo = useAuthInfo()\n\n  if (authInfo?.pendingFlow?.id !== allauth.Flows.MFA_AUTHENTICATE) {\n    return <Navigate to='/' />\n  }\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    allauth.mfaAuthenticate(code).then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n  return (\n    <AuthenticateFlow authenticatorType={props.authenticatorType}>\n      {props.children}\n      <label>\n        Code:\n        <input type='text' value={code} onChange={(e) => setCode(e.target.value)} />\n      </label>\n      <FormErrors param='code' errors={response.content?.errors} />\n      <Button onClick={() => submit()}>Sign In</Button>\n    </AuthenticateFlow>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/AuthenticateFlow.js",
    "content": "import { Link, Navigate } from 'react-router-dom'\nimport { pathForFlow } from '../auth'\nimport { Flows, AuthenticatorType } from '../lib/allauth'\nimport { useAuthInfo } from '../auth/hooks'\n\nconst labels = {}\nlabels[AuthenticatorType.TOTP] = 'Use your authenticator app'\nlabels[AuthenticatorType.RECOVERY_CODES] = 'Use a recovery code'\nlabels[AuthenticatorType.WEBAUTHN] = 'Use security key'\n\nexport default function AuthenticateFlow (props) {\n  const authInfo = useAuthInfo()\n\n  if (authInfo?.pendingFlow?.id !== Flows.MFA_AUTHENTICATE) {\n    return <Navigate to='/' />\n  }\n  const flow = authInfo.pendingFlow\n\n  return (\n    <section>\n      <h1>Two-Factor Authentication</h1>\n      <p>\n        Your account is protected by two-factor authentication.\n      </p>\n      {props.children}\n\n      {flow.types.length > 1\n        ? <><h2>Alternative Options</h2>\n          <ul>\n            {flow.types.map(typ => {\n              return (\n                <li key={typ}>\n                  <Link replace to={pathForFlow(flow, typ)}>{labels[typ]}</Link>\n                </li>\n              )\n            })}\n          </ul>\n        </>\n        : null}\n    </section>\n\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/AuthenticateRecoveryCodes.js",
    "content": "import AuthenticateCode from './AuthenticateCode'\nimport { AuthenticatorType } from '../lib/allauth'\n\nexport default function AuthenticateRecoveryCodes (props) {\n  return (\n    <AuthenticateCode authenticatorType={AuthenticatorType.RECOVERY_CODES}>\n      <p>Please enter a recovery code:</p>\n    </AuthenticateCode>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/AuthenticateTOTP.js",
    "content": "import AuthenticateCode from './AuthenticateCode'\nimport { AuthenticatorType } from '../lib/allauth'\n\nexport default function AuthenticateRecoveryCodes (props) {\n  return (\n    <AuthenticateCode authenticatorType={AuthenticatorType.TOTP}>\n      <p>Please enter an authenticator code:</p>\n    </AuthenticateCode>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/AuthenticateWebAuthn.js",
    "content": "import { useState } from 'react'\nimport { AuthenticatorType, getWebAuthnRequestOptionsForAuthentication, authenticateUsingWebAuthn } from '../lib/allauth'\nimport Button from '../components/Button'\nimport {\n  parseRequestOptionsFromJSON,\n  get\n} from '@github/webauthn-json/browser-ponyfill'\nimport AuthenticateFlow from './AuthenticateFlow'\n\nexport default function AuthenticateWebAuthn (props) {\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  async function submit () {\n    setResponse({ ...response, fetching: true })\n    try {\n      const optResp = await getWebAuthnRequestOptionsForAuthentication()\n      const jsonOptions = optResp.data.request_options\n      const options = parseRequestOptionsFromJSON(jsonOptions)\n      const credential = await get(options)\n      const reauthResp = await authenticateUsingWebAuthn(credential)\n      setResponse((r) => { return { ...r, content: reauthResp } })\n    } catch (e) {\n      console.error(e)\n      window.alert(e)\n    }\n    setResponse((r) => { return { ...r, fetching: false } })\n  }\n\n  return (\n    <AuthenticateFlow authenticatorType={AuthenticatorType.WEBAUTHN}>\n      <Button disabled={response.fetching} onClick={() => submit()}>Use security key</Button>\n    </AuthenticateFlow>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/CreateSignupPasskey.js",
    "content": "import { useState } from 'react'\nimport FormErrors from '../components/FormErrors'\nimport { Flows } from '../lib/allauth'\nimport { Navigate } from 'react-router-dom'\nimport Button from '../components/Button'\nimport { useAuthStatus } from '../auth'\nimport * as allauth from '../lib/allauth'\nimport {\n  create,\n  parseCreationOptionsFromJSON\n} from '@github/webauthn-json/browser-ponyfill'\n\nexport default function CreateSignupPasskey () {\n  const [, authInfo] = useAuthStatus()\n  const [name, setName] = useState('')\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  async function submit () {\n    setResponse({ ...response, fetching: true })\n    try {\n      const optResp = await allauth.getWebAuthnCreateOptionsAtSignup(true)\n      if (optResp.status === 200) {\n        const jsonOptions = optResp.data.creation_options\n        const options = parseCreationOptionsFromJSON(jsonOptions)\n        const credential = await create(options)\n        const signupResp = await allauth.signupWebAuthnCredential(name, credential)\n        setResponse((r) => { return { ...r, content: signupResp } })\n      } else {\n        setResponse((r) => { return { ...r, content: optResp } })\n      }\n    } catch (e) {\n      console.error(e)\n      window.alert(e)\n    }\n    setResponse((r) => { return { ...r, fetching: false } })\n  }\n\n  if (response.content?.status === 409 || authInfo.pendingFlow?.id !== Flows.MFA_WEBAUTHN_SIGNUP) {\n    return <Navigate to='/account/signup/passkey' />\n  }\n  return (\n    <div>\n      <h1>Create Passkey</h1>\n      <p>\n        You are about to create a passkey for your account. As you can add additional keys later on, you can use a descriptive name to tell the keys apart.\n      </p>\n\n      <FormErrors errors={response.content?.errors} />\n\n      <div><label>Name <input value={name} onChange={(e) => setName(e.target.value)} type='text' required /></label>\n        <FormErrors param='code' errors={response.content?.errors} />\n      </div>\n      <Button disabled={response.fetching} onClick={() => submit()}>Create</Button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/DeactivateTOTP.js",
    "content": "import { useState } from 'react'\nimport * as allauth from '../lib/allauth'\nimport { Navigate } from 'react-router-dom'\nimport Button from '../components/Button'\n\nexport default function DeactivateTOTP (props) {\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    allauth.deactivateTOTPAuthenticator().then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n  if (response.content?.status === 200) {\n    return <Navigate to='/account/2fa' />\n  }\n  return (\n    <section>\n      <h1>Deactivate Authenticator App</h1>\n\n      <p>You are about to deactivate authenticator app based authentication. Are you sure?</p>\n\n      <Button onClick={() => submit()}>Deactivate</Button>\n    </section>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/GenerateRecoveryCodes.js",
    "content": "import { useState } from 'react'\nimport { Navigate, useLoaderData } from 'react-router-dom'\nimport FormErrors from '../components/FormErrors'\nimport Button from '../components/Button'\n\nimport * as allauth from '../lib/allauth'\n\nexport async function loader ({ params }) {\n  const resp = await allauth.getRecoveryCodes()\n  return { recoveryCodes: resp }\n}\n\nexport default function GenerateRecoveryCodes () {\n  const { recoveryCodes } = useLoaderData()\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    allauth.generateRecoveryCodes().then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n  if (response.content?.status === 200) {\n    return <Navigate to='/account/2fa/recovery-codes' />\n  }\n\n  const hasCodes = recoveryCodes.status === 200 && recoveryCodes.data.unused_code_count > 0\n  return (\n    <section>\n      <h1>Recovery Codes</h1>\n\n      <p>You are about to generate a new set of recovery codes for your account.\n        {hasCodes ? 'This action will invalidate your existing codes.' : ''} Are you sure?\n      </p>\n\n      <FormErrors errors={response.content?.errors} />\n\n      <Button onClick={() => submit()}>Generate</Button>\n\n    </section>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/ListWebAuthn.js",
    "content": "import { useState } from 'react'\nimport { Link, useLoaderData, Navigate } from 'react-router-dom'\nimport Button from '../components/Button'\nimport * as allauth from '../lib/allauth'\n\nexport async function loader ({ params }) {\n  const resp = await allauth.getAuthenticators()\n  return { authenticators: resp.data }\n}\n\nfunction Authenticator (props) {\n  const [name, setName] = useState(props.authenticator.name)\n  const { authenticator } = props\n  function onSubmit (e) {\n    e.preventDefault()\n    props.onSave(name)\n  }\n  return (\n    <tr>\n      {props.editting\n        ? <td>\n          <form onSubmit={onSubmit}>\n            <input onChange={(e) => setName(e.target.value)} value={name} type='text' />\n            <Button type='button' onClick={() => props.onCancel()}>        Cancel</Button>\n          </form>\n          </td>\n        : <td>{authenticator.name} <Button onClick={() => props.onEdit()}>        Edit</Button>\n          </td>}\n      <td>{typeof authenticator.is_passwordless === 'undefined'\n        ? 'Type unspecified'\n        : (authenticator.is_passwordless ? 'Passkey' : 'Security key')}\n      </td>\n      <td>{new Date(authenticator.created_at * 1000).toLocaleString()}</td>\n      <td>{authenticator.last_used_at ? new Date(authenticator.last_used_at * 1000).toLocaleString() : 'Unused'}</td>\n      <td>\n        <Button onClick={() => props.onDelete()}>Delete</Button>\n      </td>\n    </tr>\n  )\n}\n\nexport default function ListWebAuthn (props) {\n  const { authenticators } = useLoaderData()\n  const [editId, setEditId] = useState(null)\n  const [keys, setKeys] = useState(() => authenticators.filter(authenticator => authenticator.type === allauth.AuthenticatorType.WEBAUTHN))\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  async function optimisticSetKeys (newKeys, op) {\n    setResponse({ ...response, fetching: true })\n    const oldKeys = keys\n    setEditId(null)\n    setKeys(newKeys)\n    try {\n      const ok = await op()\n      if (!ok) {\n        setKeys(oldKeys)\n      }\n    } catch (e) {\n      setKeys(oldKeys)\n      console.error(e)\n      window.alert(e)\n    }\n    setResponse((r) => { return { ...r, fetching: false } })\n  }\n\n  async function deleteKey (key) {\n    const newKeys = keys.filter((k) => k.id !== key.id)\n    await optimisticSetKeys(newKeys, async () => {\n      const resp = await allauth.deleteWebAuthnCredential([key.id])\n      return (resp.status === 200)\n    })\n  }\n\n  async function onSave (key, name) {\n    const newKeys = keys.filter((k) => k.id !== key.id)\n    newKeys.push({ ...key, name })\n    await optimisticSetKeys(newKeys, async () => {\n      const resp = await allauth.updateWebAuthnCredential(key.id, { name })\n      return (resp.status === 200)\n    })\n  }\n\n  if (!keys.length && !response.fetching) {\n    return <Navigate to='/account/2fa' />\n  }\n\n  return (\n    <section>\n      <h1>Security Keys</h1>\n\n      <table className='table table-striped'>\n        <thead>\n          <tr>\n            <th>Name</th>\n            <th>Type</th>\n            <th>Created At</th>\n            <th>Last Used At</th>\n            <th>Actions</th>\n          </tr>\n        </thead>\n        <tbody>\n          {keys.map(key => {\n            return (\n              <Authenticator\n                key={key.id}\n                editting={key.id === editId} authenticator={key} onCancel={() => setEditId(null)}\n                onSave={(name) => onSave(key, name)}\n                onEdit={() => setEditId(key.id)} onDelete={() => deleteKey(key)}\n              />\n            )\n          })}\n        </tbody>\n      </table>\n      <Link to='/account/2fa/webauthn/add'>Add</Link>\n    </section>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/MFAOverview.js",
    "content": "import { Link, useLoaderData } from 'react-router-dom'\n\nimport * as allauth from '../lib/allauth'\n\nexport async function loader ({ params }) {\n  const resp = await allauth.getAuthenticators()\n  return { authenticators: resp.data }\n}\n\nexport default function MFAOverview (props) {\n  const { authenticators } = useLoaderData()\n  const totp = authenticators.find(authenticator => authenticator.type === allauth.AuthenticatorType.TOTP)\n  const webauthn = authenticators.filter(authenticator => authenticator.type === allauth.AuthenticatorType.WEBAUTHN)\n  const recoveryCodes = authenticators.find(authenticator => authenticator.type === allauth.AuthenticatorType.RECOVERY_CODES)\n  return (\n    <section>\n      <h1>Two-Factor Authentication</h1>\n\n      <h2>Authenticator App</h2>\n\n      {totp\n        ? <><p>\n          Authentication using an authenticator app is active.\n        </p>\n          <Link to='/account/2fa/totp/deactivate'>Deactivate</Link>\n          </>\n        : <><p>An authenticator app is not active..</p>\n          <Link to='/account/2fa/totp/activate'>Activate</Link>\n        </>}\n\n      <h2>Security Keys</h2>\n\n      {webauthn.length\n        ? <><p>You have added {webauthn.length} security keys.</p>\n          <Link to='/account/2fa/webauthn'>Manage</Link>\n        </>\n        : <><p>No security keys have been added.</p>\n          <Link to='/account/2fa/webauthn/add'>Add</Link>\n        </>}\n\n      <h2>Recovery Codes</h2>\n\n      {!recoveryCodes\n        ? <><p>No recovery codes set up.</p>\n          <Link to='/account/2fa/recovery-codes/generate'>Generate</Link>\n          </>\n        : <><p>There are {recoveryCodes.unused_code_count} out of {recoveryCodes.total_code_count} recovery codes available.</p>\n          <Link to='/account/2fa/recovery-codes'>View</Link>\n          <Link to='/account/2fa/recovery-codes/generate'>Regenerate</Link>\n          </>}\n    </section>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/ReauthenticateCode.js",
    "content": "import { useState } from 'react'\nimport FormErrors from '../components/FormErrors'\nimport { mfaReauthenticate } from '../lib/allauth'\nimport ReauthenticateFlow from '../account/ReauthenticateFlow'\nimport Button from '../components/Button'\n\nexport default function ReauthenticateCode (props) {\n  const [code, setCode] = useState('')\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    mfaReauthenticate(code).then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n  return (\n    <ReauthenticateFlow>\n      {props.children}\n\n      <FormErrors errors={response.content?.errors} />\n\n      <div><label>Code: <input value={code} onChange={(e) => setCode(e.target.value)} type='text' required /></label>\n        <FormErrors param='code' errors={response.content?.errors} />\n      </div>\n      <Button disabled={response.fetching} onClick={() => submit()}>Confirm</Button>\n    </ReauthenticateFlow>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/ReauthenticateRecoveryCodes.js",
    "content": "import ReauthenticateCode from './ReauthenticateCode'\n\nexport default function ReauthenticateRecoveryCodes (props) {\n  return (\n    <ReauthenticateCode>\n      <p>Please enter a recovery code:</p>\n    </ReauthenticateCode>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/ReauthenticateTOTP.js",
    "content": "import ReauthenticateCode from './ReauthenticateCode'\n\nexport default function ReauthenticateTOTP (props) {\n  return (\n    <ReauthenticateCode>\n      <p>Please enter an authenticator code:</p>\n    </ReauthenticateCode>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/ReauthenticateWebAuthn.js",
    "content": "import { useState } from 'react'\nimport { Flows, getWebAuthnRequestOptionsForReauthentication, reauthenticateUsingWebAuthn } from '../lib/allauth'\nimport ReauthenticateFlow from '../account/ReauthenticateFlow'\nimport Button from '../components/Button'\nimport {\n  parseRequestOptionsFromJSON,\n  get\n} from '@github/webauthn-json/browser-ponyfill'\n\nexport default function ReauthenticateWebAuthn () {\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  async function submit () {\n    setResponse({ ...response, fetching: true })\n    try {\n      const optResp = await getWebAuthnRequestOptionsForReauthentication()\n      const jsonOptions = optResp.data.request_options\n      const options = parseRequestOptionsFromJSON(jsonOptions)\n      const credential = await get(options)\n      const reauthResp = await reauthenticateUsingWebAuthn(credential)\n      setResponse((r) => { return { ...r, content: reauthResp } })\n    } catch (e) {\n      console.error(e)\n      window.alert(e)\n    }\n    setResponse((r) => { return { ...r, fetching: false } })\n  }\n\n  return (\n    <ReauthenticateFlow flow={Flows.MFA_REAUTHENTICATE}>\n\n      <Button disabled={response.fetching} onClick={() => submit()}>Use security key</Button>\n    </ReauthenticateFlow>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/RecoveryCodes.js",
    "content": "import { useLoaderData } from 'react-router-dom'\n\nimport * as allauth from '../lib/allauth'\n\nexport async function loader ({ params }) {\n  const resp = await allauth.getRecoveryCodes()\n  return { recoveryCodes: resp }\n}\n\nexport default function RecoveryCodes (props) {\n  const { recoveryCodes } = useLoaderData()\n  return (\n    <section>\n      <h1>Recovery Codes</h1>\n\n      {recoveryCodes.status === 200\n        ? <>\n          <p>There are {recoveryCodes.data.unused_code_count} out of {recoveryCodes.data.total_code_count} recovery codes available.</p>\n          <pre>{recoveryCodes.data.unused_codes.join('\\n')}</pre>\n          </>\n        : <><p>No recovery codes set up.</p></>}\n    </section>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/SignupByPasskey.js",
    "content": "import { useState } from 'react'\nimport FormErrors from '../components/FormErrors'\nimport { signUpByPasskey } from '../lib/allauth'\nimport { Link } from 'react-router-dom'\nimport Button from '../components/Button'\n\nexport default function Signup () {\n  const [email, setEmail] = useState('')\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    signUpByPasskey({ email }).then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n\n  return (\n    <div>\n      <h1>Passkey Sign Up</h1>\n      <p>\n        Already have an account? <Link to='/account/login'>Login here.</Link>\n      </p>\n\n      <FormErrors errors={response.content?.errors} />\n\n      <div><label>Email <input value={email} onChange={(e) => setEmail(e.target.value)} type='email' required /></label>\n        <FormErrors param='email' errors={response.content?.errors} />\n      </div>\n      <Button disabled={response.fetching} onClick={() => submit()}>Sign Up</Button>\n      <a href='/account/signup'>Sign up using a password</a>\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/Trust.js",
    "content": "import { useState } from 'react'\nimport AuthenticateCode from './AuthenticateCode'\nimport { AuthenticatorType } from '../lib/allauth'\nimport { useAuthInfo } from '../auth/hooks'\nimport * as allauth from '../lib/allauth'\nimport { Navigate } from 'react-router-dom'\nimport Button from'../components/Button'\n\nexport default function Trust (props) {\n  const [response, setResponse] = useState({ fetching: false, content: null })\n  const authInfo = useAuthInfo()\n\n  if (authInfo?.pendingFlow?.id !== allauth.Flows.MFA_TRUST) {\n    return <Navigate to='/' />\n  }\n\n  function submit (trust) {\n    setResponse({ ...response, fetching: true })\n    allauth.mfaTrust(trust).then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n  return (\n      <section>\n      <h1>Trust this Browser?</h1>\n      <p>If you choose to trust this browser, you will not be asked for a verification code the next time you sign in.</p>\n      <Button onClick={() => submit(false)}>Don't Trust</Button>\n      <Button onClick={() => submit(true)}>Trust</Button>\n    </section>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/mfa/WebAuthnLoginButton.js",
    "content": "import Button from '../components/Button'\nimport { useState } from 'react'\nimport { getWebAuthnRequestOptionsForLogin, loginUsingWebAuthn } from '../lib/allauth'\nimport {\n  parseRequestOptionsFromJSON,\n  get\n} from '@github/webauthn-json/browser-ponyfill'\n\nexport default function WebAuthnLoginButton (props) {\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  async function submit (e) {\n    e.preventDefault()\n    setResponse({ ...response, fetching: true })\n    try {\n      const optResp = await getWebAuthnRequestOptionsForLogin()\n      const jsonOptions = optResp.data.request_options\n      const options = parseRequestOptionsFromJSON(jsonOptions)\n      const credential = await get(options)\n      const loginResp = await loginUsingWebAuthn(credential)\n      setResponse((r) => { return { ...r, content: loginResp } })\n    } catch (e) {\n      console.error(e)\n      window.alert(e)\n    }\n    setResponse((r) => { return { ...r, fetching: false } })\n  }\n  return <Button onClick={submit}>{props.children}</Button>\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/socialaccount/GoogleOneTap.js",
    "content": "import { useState } from 'react'\nimport { useConfig } from '../auth'\nimport { authenticateByToken } from '../lib/allauth'\n\nfunction installGoogleOneTap (cb) {\n  const id = 'google-one-tap'\n  const scr = document.getElementById(id)\n  if (!scr) {\n    const scr = document.createElement('script')\n    scr.id = id\n    scr.src = '//accounts.google.com/gsi/client'\n    scr.async = true\n    scr.addEventListener('load', function () {\n      cb()\n    })\n    document.body.appendChild(scr)\n  } else {\n    cb()\n  }\n}\n\nexport default function GoogleOneTap (props) {\n  const config = useConfig()\n  const [enabled, setEnabled] = useState(() => window.sessionStorage.getItem('googleOneTapEnabled') === 'yes')\n  function onGoogleOneTapInstalled () {\n    const provider = config.data.socialaccount.providers.find(p => p.id === 'google')\n    if (provider && window.google) {\n      function handleCredentialResponse (token) {\n        authenticateByToken(provider.id, {\n          id_token: token.credential,\n          client_id: provider.client_id\n        }, props.process)\n      }\n\n      window.google.accounts.id.initialize({\n        client_id: provider.client_id,\n        callback: handleCredentialResponse\n      })\n      window.google.accounts.id.prompt()\n    }\n  }\n\n  if (enabled) {\n    installGoogleOneTap(onGoogleOneTapInstalled)\n    return null\n  }\n  function enable () {\n    window.sessionStorage.setItem('googleOneTapEnabled', 'yes')\n    installGoogleOneTap(onGoogleOneTapInstalled)\n    setEnabled(true)\n  }\n  return (\n    <div className='alert alert-danger d-flex justify-content-between'>\n      <span><strong>Mind your privacy:</strong> Do you want to demo Google One Tap sign-in?</span>\n      <button onClick={() => enable()} className='btn btn-sm btn-danger'>Enable</button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/socialaccount/ManageProviders.js",
    "content": "import { useState, useEffect } from 'react'\nimport * as allauth from '../lib/allauth'\nimport ProviderList from './ProviderList'\nimport FormErrors from '../components/FormErrors'\nimport Button from '../components/Button'\n\nexport default function ManageProviders () {\n  const [accounts, setAccounts] = useState([])\n  const [response, setResponse] = useState({ fetching: false, content: { status: 200, data: [] } })\n\n  useEffect(() => {\n    setResponse((r) => { return { ...r, fetching: true } })\n    allauth.getProviderAccounts().then((resp) => {\n      if (resp.status === 200) {\n        setAccounts(resp.data)\n      }\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }, [])\n\n  function disconnect (account) {\n    setResponse({ ...response, fetching: true })\n    allauth.disconnectProviderAccount(account.provider.id, account.uid).then((resp) => {\n      setResponse((r) => { return { ...r, content: resp } })\n      if (resp.status === 200) {\n        setAccounts(resp.data)\n      }\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n\n  return (\n    <div>\n      <h1>Providers</h1>\n\n      <table>\n        <thead>\n          <tr>\n            <th>UID</th>\n            <th>Account</th>\n            <th>Provider</th>\n            <th>Actions</th>\n          </tr>\n        </thead>\n        <tbody>\n          {accounts.map(account => {\n            return (\n              <tr key={account.uid}>\n                <td>{account.uid}</td>\n                <td>{account.display}</td>\n                <td>{account.provider.name}</td>\n                <td>\n                  <Button onClick={() => disconnect(account)} disabled={response.fetching}>Disconnect</Button>\n                </td>\n              </tr>\n            )\n          })}\n        </tbody>\n      </table>\n\n      <FormErrors errors={response.content?.errors} />\n\n      <h2>Connect</h2>\n      <ProviderList callbackURL='/account/providers' process={allauth.AuthProcess.CONNECT} />\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/socialaccount/ProviderCallback.js",
    "content": "import {\n  Navigate,\n  useLocation,\n  Link\n} from 'react-router-dom'\nimport { URLs, pathForPendingFlow, useAuthStatus } from '../auth'\n\nexport default function ProviderCallback () {\n  const location = useLocation()\n  const params = new URLSearchParams(location.search)\n  const error = params.get('error')\n  const [auth, status] = useAuthStatus()\n\n  let url = URLs.LOGIN_URL\n  if (status.isAuthenticated) {\n    url = URLs.LOGIN_REDIRECT_URL\n  } else {\n    url = pathForPendingFlow(auth) || url\n  }\n  if (!error) {\n    return <Navigate to={url} />\n  }\n  return (\n    <>\n      <h1>Third-Party Login Failure</h1>\n      <p>Something went wrong.</p>\n      <Link to={url}>Continue</Link>\n    </>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/socialaccount/ProviderList.js",
    "content": "import { useConfig } from '../auth'\nimport { redirectToProvider, Client, settings } from '../lib/allauth'\nimport Button from '../components/Button'\nimport GoogleOneTap from './GoogleOneTap'\n\nexport default function ProviderList (props) {\n  const config = useConfig()\n  const providers = config.data.socialaccount.providers\n  if (!providers.length) {\n    return null\n  }\n  return (\n    <>\n      <GoogleOneTap process={props.process} />\n      {settings.client === Client.BROWSER && <ul>\n        {providers.map(provider => {\n          return (\n            <li key={provider.id}>\n              <Button onClick={() => redirectToProvider(provider.id, props.callbackURL, props.process)}>{provider.name}</Button>\n            </li>\n          )\n        })}\n      </ul>}\n    </>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/socialaccount/ProviderSignup.js",
    "content": "import { useState } from 'react'\nimport FormErrors from '../components/FormErrors'\nimport { providerSignup } from '../lib/allauth'\nimport { Link } from 'react-router-dom'\nimport Button from '../components/Button'\n\nexport default function ProviderSignup () {\n  const [email, setEmail] = useState('')\n  const [response, setResponse] = useState({ fetching: false, content: null })\n\n  function submit () {\n    setResponse({ ...response, fetching: true })\n    providerSignup({ email }).then((content) => {\n      setResponse((r) => { return { ...r, content } })\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n\n  return (\n    <div>\n      <h1>Sign Up</h1>\n      <p>\n        Already have an account? <Link to='/account/login'>Login here.</Link>\n      </p>\n\n      <FormErrors errors={response.content?.errors} />\n\n      <div><label>Email <input value={email} onChange={(e) => setEmail(e.target.value)} type='email' required /></label>\n        <FormErrors param='email' errors={response.content?.errors} />\n      </div>\n      <Button disabled={response.fetching} onClick={() => submit()}>Sign Up</Button>\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/frontend/src/usersessions/Sessions.js",
    "content": "import { useState, useEffect } from 'react'\nimport { useConfig } from '../auth'\nimport * as allauth from '../lib/allauth'\nimport Button from '../components/Button'\n\nexport default function Sessions () {\n  const config = useConfig()\n  const [sessions, setSessions] = useState([])\n  const [response, setResponse] = useState({ fetching: false, content: { status: 200, data: [] } })\n\n  useEffect(() => {\n    setResponse((r) => { return { ...r, fetching: true } })\n    allauth.getSessions().then((resp) => {\n      if (resp.status === 200) {\n        setSessions(resp.data)\n      }\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }, [])\n\n  const otherSessions = sessions.filter(session => !session.is_current)\n  function logout (sessions) {\n    setResponse({ ...response, fetching: true })\n    allauth.endSessions(sessions.map(s => s.id)).then((resp) => {\n      setResponse((r) => { return { ...r, content: resp } })\n      if (resp.status === 200) {\n        setSessions(resp.data)\n      }\n    }).catch((e) => {\n      console.error(e)\n      window.alert(e)\n    }).then(() => {\n      setResponse((r) => { return { ...r, fetching: false } })\n    })\n  }\n\n  return (\n    <div>\n      <h1>Sessions</h1>\n\n      <table className='table table-bordered'>\n        <thead>\n          <tr>\n            <th>Started At</th>\n            <th>IP Address</th>\n            <th>Browser</th>\n            {config.data.usersessions.track_activity ? <th>Last Seen At</th> : null}\n            <th>Current</th>\n            <th>Actions</th>\n          </tr>\n        </thead>\n        <tbody>\n          {sessions.map((session, i) => {\n            return (\n              <tr key={i}>\n                <td>{new Date(session.created_at * 1000).toLocaleString()}</td>\n                <td>{session.ip}</td>\n                <td>{session.user_agent}</td>\n                {config.data.usersessions.track_activity ? <td>{session.last_seen_at}</td> : null}\n                <td>{session.is_current ? '⭐' : ''}</td>\n                <td><Button onClick={() => logout([session])}>Logout</Button></td>\n              </tr>\n            )\n          })}\n        </tbody>\n      </table>\n\n      <Button disabled={otherSessions.length <= 1} onClick={() => logout(otherSessions)}>Logout elsewhere</Button>\n\n    </div>\n  )\n}\n"
  },
  {
    "path": "examples/react-spa/traefik.toml",
    "content": "defaultEntryPoints = [\"http\"]\n\n[log]\nlevel = \"DEBUG\"\n\n[api]\ndashboard = true\n\n[accessLog]\n\n\n[providers]\nprovidersThrottleDuration = 10\n[providers.file]\nfilename = \"traefik.toml\"\ndirectory = \"/etc/traefik/\"\nwatch = true\n\n\n[entryPoints]\n[entryPoints.web]\naddress = \":10000\"\n\n[http.routers]\n\n[http.routers.django]\nservice = \"django\"\nrule = \"PathPrefix(`/accounts`) || PathPrefix(`/_allauth`) || PathPrefix(`/ninja`) || PathPrefix(`/drf`)\"\nentrypoints = [\"web\"]\n\n\n[http.routers.react]\nservice = \"react\"\nrule = \"PathPrefix(`/`)\"\nentrypoints = [\"web\"]\n\n[http.services]\n[http.services.react.loadBalancer]\n[[http.services.react.loadBalancer.servers]]\nurl = \"http://frontend:3000\"\n[http.services.django.loadBalancer]\n[[http.services.django.loadBalancer.servers]]\nurl = \"http://backend:8000\"\n"
  },
  {
    "path": "examples/regular-django/.dockerignore",
    "content": ".git\n.cache\ntmp/\nbak/\n**/__pycache__\n*~\n.pytest_cache\n.vagrant\nbuild/\n.pytest_cache/\n"
  },
  {
    "path": "examples/regular-django/Dockerfile",
    "content": "FROM python:3.12\nENV PYTHONUNBUFFERED 1\n\n# Needed for SAML support\nRUN  apt-get update\nRUN  apt-get -y install libxml2-dev libxmlsec1-dev libxmlsec1-openssl\n\nWORKDIR /code/\nCOPY requirements.txt \\\n    manage.py \\\n    Makefile \\\n    ./\nRUN pip install -r requirements.txt\nCOPY ./example ./example/\nEXPOSE 8000\n"
  },
  {
    "path": "examples/regular-django/Makefile",
    "content": "ifeq ($(wildcard /code),)\nPYTHON=PYTHONPATH=$$PYTHONPATH:../.. python3\nelse\nPYTHON=python3\nendif\n\nMANAGE_PY=$(PYTHON) manage.py\n\n.PHONY:\nmigrate:\n\t$(MANAGE_PY) migrate\n\n.PHONY:\nrunserver:\n\t$(MANAGE_PY) runserver 0.0.0.0:8000\n"
  },
  {
    "path": "examples/regular-django/README.org",
    "content": "* Regular Django Example Application\n\n** Run using Docker\n\n#+begin_src sh\n  docker-compose up\n#+end_src\n\nYou should then be able to open your browser on http://localhost:8000 and see a\npage with links to sign in or sign up.\n\n\n** Run Locally\n\nAssuming you use virtualenv, follow these steps to download and run the\ndjango-allauth example application in this directory:\n\n#+begin_src sh\n  git clone git@codeberg.org:allauth/django-allauth.git\n  cd django-allauth/examples/regular-django\n  virtualenv venv\n  . venv/bin/activate\n  pip install \"../..[mfa,saml,socialaccount]\"\n#+end_src\n\nNow we need to create the database tables and an admin user.\nRun the following and when prompted to create a superuser choose yes and\nfollow the instructions:\n\n#+begin_src sh\n  python manage.py migrate\n  python manage.py createsuperuser\n#+end_src\n\n\nFinally, run the Django development server:\n\n#+begin_src sh\n  python manage.py runserver\n#+end_src\n\nYou should then be able to open your browser on http://localhost:8000 and see a\npage with links to sign in or sign up.\n"
  },
  {
    "path": "examples/regular-django/db/.gitignore",
    "content": "example.db\n"
  },
  {
    "path": "examples/regular-django/docker-compose.yml",
    "content": "version: \"3\"\nservices:\n  web:\n    build:\n      context: ./\n      dockerfile: Dockerfile\n    volumes:\n      - ./example:/code/example/\n      - ../../allauth:/code/allauth\n      - ./db:/srv/db\n    environment:\n      DATABASE_NAME: /srv/db/example.db\n    ports:\n      - 8000:8000\n    command:\n      - make\n      - migrate\n      - runserver\n"
  },
  {
    "path": "examples/regular-django/example/__init__.py",
    "content": ""
  },
  {
    "path": "examples/regular-django/example/asgi.py",
    "content": "import os\n\nfrom django.core.asgi import get_asgi_application\n\n\nos.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"example.settings\")\n\napplication = get_asgi_application()\n"
  },
  {
    "path": "examples/regular-django/example/settings.py",
    "content": "# Django settings for example project.\nimport os\nfrom pathlib import Path\n\n\nBASE_DIR = Path(__file__).resolve().parent.parent\n\nDEBUG = True\n\nADMINS = (\n    # ('Your Name', 'your_email@example.com'),\n)\n\nMANAGERS = ADMINS\n\nEMAIL_BACKEND = \"django.core.mail.backends.console.EmailBackend\"\n\nDATABASES = {\n    \"default\": {\n        \"ENGINE\": \"django.db.backends.sqlite3\",  # Add 'postgresql_psycopg2', 'postgresql',\n        # 'mysql', 'sqlite3' or 'oracle'.\n        \"NAME\": os.environ.get(\n            \"DATABASE_NAME\", os.path.join(BASE_DIR / \"db\" / \"example.db\")\n        ),\n        \"USER\": \"\",  # Not used with sqlite3.\n        \"PASSWORD\": \"\",  # Not used with sqlite3.\n        \"HOST\": \"\",  # Set to empty string for localhost. Not used with sqlite3.\n        \"PORT\": \"\",  # Set to empty string for default. Not used with sqlite3.\n    }\n}\n\n# Local time zone for this installation. Choices can be found here:\n# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name\n# although not all choices may be available on all operating systems.\n# On Unix systems, a value of None will cause Django to use the same\n# timezone as the operating system.\n# If running in a Windows environment this must be set to the same as your\n# system time zone.\nTIME_ZONE = \"America/Chicago\"\n\n# Language code for this installation. All choices can be found here:\n# http://www.i18nguy.com/unicode/language-identifiers.html\nLANGUAGE_CODE = \"en\"\n\nLANGUAGES = [\n    (\"ar\", \"Arabic\"),\n    (\"az\", \"Azerbaijani\"),\n    (\"bg\", \"Bulgarian\"),\n    (\"ca\", \"Catalan\"),\n    (\"cs\", \"Czech\"),\n    (\"da\", \"Danish\"),\n    (\"de\", \"German\"),\n    (\"el\", \"Greek\"),\n    (\"en\", \"English\"),\n    (\"es\", \"Spanish\"),\n    (\"et\", \"Estonian\"),\n    (\"eu\", \"Basque\"),\n    (\"fa\", \"Persian\"),\n    (\"fi\", \"Finnish\"),\n    (\"fr\", \"French\"),\n    (\"he\", \"Hebrew\"),\n    (\"hr\", \"Croatian\"),\n    (\"hu\", \"Hungarian\"),\n    (\"id\", \"Indonesian\"),\n    (\"it\", \"Italian\"),\n    (\"ja\", \"Japanese\"),\n    (\"ka\", \"Georgian\"),\n    (\"ko\", \"Korean\"),\n    (\"ky\", \"Kyrgyz\"),\n    (\"lt\", \"Lithuanian\"),\n    (\"lv\", \"Latvian\"),\n    (\"mn\", \"Mongolian\"),\n    (\"nb\", \"Norwegian Bokmål\"),\n    (\"nl\", \"Dutch\"),\n    (\"pl\", \"Polish\"),\n    (\"pt-BR\", \"Portuguese (Brazil)\"),\n    (\"pt-PT\", \"Portuguese (Portugal)\"),\n    (\"ro\", \"Romanian\"),\n    (\"ru\", \"Russian\"),\n    (\"sk\", \"Slovak\"),\n    (\"sl\", \"Slovenian\"),\n    (\"sr\", \"Serbian\"),\n    (\"sr-Latn\", \"Serbian (Latin)\"),\n    (\"sv\", \"Swedish\"),\n    (\"th\", \"Thai\"),\n    (\"tr\", \"Turkish\"),\n    (\"uk\", \"Ukrainian\"),\n    (\"zh-hans\", \"Chinese (Simplified)\"),\n    (\"zh-hant\", \"Chinese (Traditional)\"),\n]\n\nSITE_ID = 1\n\n# If you set this to False, Django will make some optimizations so as not\n# to load the internationalization machinery.\nUSE_I18N = True\n\n# If you set this to False, Django will not format dates, numbers and\n# calendars according to the current locale\nUSE_L10N = True\n\n# Absolute filesystem path to the directory that will hold user-uploaded files.\n# Example: \"/home/media/media.lawrence.com/media/\"\nMEDIA_ROOT = \"\"\n\n# URL that handles the media served from MEDIA_ROOT. Make sure to use a\n# trailing slash.\n# Examples: \"http://media.lawrence.com/media/\", \"http://example.com/media/\"\nMEDIA_URL = \"\"\n\n# Absolute path to the directory static files should be collected to.\n# Don't put anything in this directory yourself; store your static files\n# in apps' \"static/\" subdirectories and in STATICFILES_DIRS.\n# Example: \"/home/media/media.lawrence.com/static/\"\nSTATIC_ROOT = \"\"\n\n# URL prefix for static files.\n# Example: \"http://media.lawrence.com/static/\"\nSTATIC_URL = \"/static/\"\n\n# Additional locations of static files\nSTATICFILES_DIRS = (\n    # Put strings here, like \"/home/html/static\" or \"C:/www/django/static\".\n    # Always use forward slashes, even on Windows.\n    # Don't forget to use absolute paths, not relative paths.\n)\n\n# List of finder classes that know how to find static files in\n# various locations.\nSTATICFILES_FINDERS = (\n    \"django.contrib.staticfiles.finders.FileSystemFinder\",\n    \"django.contrib.staticfiles.finders.AppDirectoriesFinder\",\n    # 'django.contrib.staticfiles.finders.DefaultStorageFinder',\n)\n\n# Make this unique, and don't share it with anybody.\nSECRET_KEY = \"t8_)kj3v!au0!_i56#gre**mkg0&z1df%3bw(#5^#^5e_64!$_\"\n\n# List of callables that know how to import templates from various sources.\nTEMPLATES = [\n    {\n        \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n        \"DIRS\": [\n            BASE_DIR / \"example\" / \"templates\",\n        ],\n        \"APP_DIRS\": True,\n        \"OPTIONS\": {\n            \"context_processors\": [\n                \"django.template.context_processors.debug\",\n                \"django.template.context_processors.request\",\n                \"django.contrib.auth.context_processors.auth\",\n                \"django.contrib.messages.context_processors.messages\",\n            ],\n        },\n    },\n]\n\nMIDDLEWARE = (\n    \"django.contrib.sessions.middleware.SessionMiddleware\",\n    \"django.middleware.common.CommonMiddleware\",\n    \"django.middleware.csrf.CsrfViewMiddleware\",\n    \"django.middleware.locale.LocaleMiddleware\",\n    \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n    \"django.contrib.messages.middleware.MessageMiddleware\",\n    \"allauth.account.middleware.AccountMiddleware\",\n)\n\nAUTHENTICATION_BACKENDS = (\"allauth.account.auth_backends.AuthenticationBackend\",)\n\nROOT_URLCONF = \"example.urls\"\n\nINSTALLED_APPS = (\n    \"django.contrib.auth\",\n    \"django.contrib.contenttypes\",\n    \"django.contrib.sessions\",\n    \"django.contrib.humanize\",\n    \"django.contrib.sites\",\n    \"django.contrib.messages\",\n    \"django.contrib.staticfiles\",\n    \"django.contrib.admin\",\n    \"allauth\",\n    \"allauth.account\",\n    \"allauth.socialaccount\",\n    \"allauth.mfa\",\n    \"allauth.socialaccount.providers.dropbox\",\n    \"allauth.socialaccount.providers.dingtalk\",\n    \"allauth.socialaccount.providers.facebook\",\n    \"allauth.socialaccount.providers.edx\",\n    \"allauth.socialaccount.providers.evernote\",\n    \"allauth.socialaccount.providers.google\",\n    \"allauth.socialaccount.providers.github\",\n    \"allauth.socialaccount.providers.linkedin_oauth2\",\n    \"allauth.socialaccount.providers.mediawiki\",\n    \"allauth.socialaccount.providers.openid\",\n    \"allauth.socialaccount.providers.openid_connect\",\n    \"allauth.socialaccount.providers.pinterest\",\n    \"allauth.socialaccount.providers.pocket\",\n    \"allauth.socialaccount.providers.reddit\",\n    \"allauth.socialaccount.providers.saml\",\n    \"allauth.socialaccount.providers.shopify\",\n    \"allauth.socialaccount.providers.slack\",\n    \"allauth.socialaccount.providers.snapchat\",\n    \"allauth.socialaccount.providers.soundcloud\",\n    \"allauth.socialaccount.providers.stackexchange\",\n    \"allauth.socialaccount.providers.telegram\",\n    \"allauth.socialaccount.providers.twitch\",\n    \"allauth.socialaccount.providers.twitter\",\n    \"allauth.socialaccount.providers.twitter_oauth2\",\n    \"allauth.socialaccount.providers.vimeo\",\n    \"allauth.socialaccount.providers.vimeo_oauth2\",\n    \"allauth.socialaccount.providers.weibo\",\n    \"allauth.socialaccount.providers.xing\",\n    \"allauth.usersessions\",\n    \"example.users\",\n)\n\n\nAUTH_USER_MODEL = \"users.User\"\nAUTH_PASSWORD_VALIDATORS = [\n    {\n        \"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\",\n        \"OPTIONS\": {\n            \"min_length\": 9,\n        },\n    }\n]\n\nALLOWED_HOSTS = [\"127.0.0.1\", \"localhost\"]\nSECURE_PROXY_SSL_HEADER = (\"HTTP_X_FORWARDED_PROTO\", \"https\")\nACCOUNT_LOGIN_BY_CODE_ENABLED = True\nACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\nACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True\nACCOUNT_LOGIN_METHODS = {\n    \"email\",\n}\nACCOUNT_PASSWORD_RESET_BY_CODE_ENABLED = True\nACCOUNT_SIGNUP_FIELDS = [\"email*\", \"password1*\", \"password2*\"]\nACCOUNT_ADAPTER = \"example.users.allauth.AccountAdapter\"\n\n\nMFA_SUPPORTED_TYPES = [\n    \"webauthn\",\n    \"totp\",\n    \"recovery_codes\",\n]\nMFA_PASSKEY_LOGIN_ENABLED = True\nMFA_PASSKEY_SIGNUP_ENABLED = True\n\ntry:\n    from .local_settings import *  # noqa\nexcept ImportError:\n    pass\n"
  },
  {
    "path": "examples/regular-django/example/templates/429.html",
    "content": "{% extends \"allauth/layouts/entrance.html\" %}\n{% load allauth %}\n{% block head_title %}\n    Too Many Requests\n{% endblock head_title %}\n{% block content %}\n    {% element h1 %}\n        Too Many Requests\n    {% endelement %}\n    <p>You are sending too many requests.</p>\n{% endblock content %}\n"
  },
  {
    "path": "examples/regular-django/example/templates/account/base_manage_email.html",
    "content": "{% extends \"allauth/layouts/manage.html\" %}\n{% block nav_class_email %}{{ block.super }} active{% endblock %}\n"
  },
  {
    "path": "examples/regular-django/example/templates/account/base_manage_password.html",
    "content": "{% extends \"allauth/layouts/manage.html\" %}\n{% block nav_class_password %}{{ block.super }} active{% endblock %}\n"
  },
  {
    "path": "examples/regular-django/example/templates/account/base_manage_phone.html",
    "content": "{% extends \"allauth/layouts/manage.html\" %}\n{% block nav_class_phone %}{{ block.super }} active{% endblock %}\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/alert.html",
    "content": "{% load allauth %}\n<div role=\"alert\"\n     class=\"alert alert-xs {% if attrs.level == \"error\" %}alert-warning{% else %}alert-info{% endif %}\">\n    {% slot message %}\n    {% endslot %}\n</div>\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/badge.html",
    "content": "{% load allauth %}\n{% setvar variant %}\n    {% if \"warning\" in attrs.tags %}\n        warning\n    {% elif \"danger\" in attrs.tags %}\n        danger\n    {% elif \"secondary\" in attrs.tags %}\n        secondary\n    {% elif \"success\" in attrs.tags %}\n        success\n    {% else %}\n        primary\n    {% endif %}\n{% endsetvar %}\n<span {% if attrs.title %}title=\"{{ attrs.title }}\"{% endif %}\n      class=\"badge text-bg-{{ variant }}\">\n    {% slot %}\n    {% endslot %}\n</span>\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/button.html",
    "content": "{% load allauth %}\n{% comment %} djlint:off {% endcomment %}\n<{% if attrs.href %}a href=\"{{ attrs.href }}\"{% else %}button{% endif %}\n{% if attrs.form %}form=\"{{ attrs.form }}\"{% endif %}\n{% if attrs.id %}id=\"{{ attrs.id }}\"{% endif %}\n{% if attrs.name %}name=\"{{ attrs.name }}\"{% endif %}\n{% if attrs.type %}type=\"{{ attrs.type }}\"{% endif %}\n{% if attrs.value %}value=\"{{ attrs.value }}\"{% endif %}\nclass=\"{% block class %}\n    btn\n    {% if \"link\" in attrs.tags %}btn-link\n    {% else %}\n      {% if \"prominent\" in attrs.tags %}btn-lg{% elif \"minor\" in attrs.tags %}btn-sm{% endif %}\n      btn-{% if 'outline' in attrs.tags %}outline-{% endif %}{% if \"danger\" in attrs.tags %}danger{% elif \"secondary\" in attrs.tags %}secondary{% elif \"warning\" in attrs.tags %}warning{% else %}primary{% endif %}\n    {% endif %}{% endblock %}\">\n    {% if \"tool\" in attrs.tags %}\n    {% if \"delete\" in attrs.tags %}\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-trash\" viewBox=\"0 0 16 16\">\n  <path d=\"M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6Z\"/>\n  <path d=\"M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1ZM4.118 4 4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118ZM2.5 3h11V2h-11v1Z\"/>\n    </svg>\n    {% elif \"edit\" in attrs.tags %}\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 16 16\"><path fill=\"currentColor\" d=\"M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793L14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708zm.646 6.061L9.793 2.5L3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.5.5 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11z\"/></svg>\n    {% endif %}\n    {% endif %}\n\n{% if not \"tool\" in attrs.tags %}\n{% slot %}\n{% endslot %}\n{% endif %}\n</{% if attrs.href %}a{% else %}button{% endif %}>\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/button__entrance.html",
    "content": "{% extends \"allauth/elements/button.html\" %}\n{% load allauth %}\n{% block class %}\n    {{ block.super }}\n    w-100\n{% endblock %}\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/button_group.html",
    "content": "{% load allauth %}\n<div class=\"btn-group-vertical w-100\" role=\"group\">\n    {% slot %}\n    {% endslot %}\n</div>\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/field.html",
    "content": "{% load allauth %}\n{% if attrs.type == \"checkbox\" or attrs.type == \"radio\" %}\n    <div class=\"form-check mb-3\">\n        <input {% if attrs.required %}required{% endif %}\n               name=\"{{ attrs.name }}\"\n               class=\"form-check-input\"\n               id=\"{{ attrs.id }}\"\n               {% if attrs.value is not None %}value=\"{{ attrs.value }}\"{% endif %}\n               {% if attrs.disabled %}disabled{% endif %}\n               type=\"{{ attrs.type }}\">\n        <label class=\"form-check-label\" for=\"{{ attrs.id }}\">\n            {% slot label %}\n            {% endslot %}\n        </label>\n        {% if slots.help_text %}\n            <div class=\"form-text\">\n                {% slot help_text %}\n                {% endslot %}\n            </div>\n        {% endif %}\n    </div>\n{% elif attrs.type == \"textarea\" %}\n    <div class=\"mb-3\">\n        <label for=\"{{ attrs.id }}\">\n            {% slot label %}\n            {% endslot %}\n        </label>\n        <textarea {% if attrs.required %}required{% endif %}\n                  {% if attrs.rows %}rows=\"{{ attrs.rows }}\"{% endif %}\n                  class=\"form-control\"\n                  name=\"{{ attrs.name }}\"\n                  {% if attrs.readonly %}readonly{% endif %}\n                  id=\"{{ attrs.id }}\"\n                  {% if attrs.disabled %}disabled{% endif %}>{% slot value %}{% endslot %}</textarea>\n    </div>\n{% elif attrs.type == \"hidden\" %}\n    <input {% if attrs.required %}required{% endif %}\n           name=\"{{ attrs.name }}\"\n           id=\"{{ attrs.id }}\"\n           {% if attrs.value is not None %}value=\"{{ attrs.value }}\"{% endif %}\n           type=\"hidden\">\n{% elif attrs.type == \"select\" %}\n    <div class=\"{% if attrs.unlabeled %}form-floating{% endif %} mb-3\">\n        {% if not attrs.unlabeled %}\n            <label for=\"{{ attrs.id }}\">\n                {% slot label %}\n                {% endslot %}\n            </label>\n        {% endif %}\n        <select id=\"{{ attrs.id }}\" name=\"{{ attrs.name }}\" class=\"form-select\">\n            {% for option in attrs.choices %}\n                <option {% if option.0 == attrs.value %}selected{% endif %}\n                        value=\"{{ option.0 }}\">{{ option.1 }}</option>\n            {% endfor %}\n        </select>\n        {% if attrs.unlabeled %}\n            <label for=\"{{ attrs.id }}\">\n                {% slot label %}\n                {% endslot %}\n            </label>\n        {% endif %}\n    </div>\n{% else %}\n    <div class=\"{% if attrs.unlabeled %}form-floating{% endif %} mb-3\">\n        {% if not attrs.unlabeled %}\n            <label for=\"{{ attrs.id }}\">\n                {% slot label %}\n                {% endslot %}\n            </label>\n        {% endif %}\n        <input {% if attrs.required %}required{% endif %}\n               name=\"{{ attrs.name }}\"\n               {% if attrs.placeholder %}placeholder=\"{{ attrs.placeholder }}\" {% elif attrs.unlabeled %}placeholder=\"{% slot label %}{% endslot %}\"{% endif %}\n               class=\"{% if attrs.errors %}is-invalid{% endif %} form-control rounded-3\"\n               id=\"{{ attrs.id }}\"\n               {% if attrs.readonly %}readonly{% endif %}\n               {% if attrs.disabled %}disabled{% endif %}\n               {% if attrs.tabindex %}tabindex=\"{{ attrs.tabindex }}\"{% endif %}\n               {% if attrs.style %}style=\"{{ attrs.style }}\"{% endif %}\n               {% if attrs.autocomplete %}autocomplete=\"{{ attrs.autocomplete }}\"{% endif %}\n               {% if attrs.value is not None %}value=\"{{ attrs.value }}\"{% endif %}\n               type=\"{{ attrs.type }}\">\n        {% if attrs.unlabeled %}\n            <label for=\"{{ attrs.id }}\">\n                {% slot label %}\n                {% endslot %}\n            </label>\n        {% endif %}\n        {% if slots.help_text %}\n            <div class=\"form-text\">\n                {% slot help_text %}\n                {% endslot %}\n            </div>\n        {% endif %}\n        {% if attrs.errors %}\n            {% for error in attrs.errors %}<div role=\"alert\" class=\"invalid-feedback\">{{ error }}</div>{% endfor %}\n        {% endif %}\n    </div>\n{% endif %}\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/fields.html",
    "content": "{% load allauth %}\n{% for bound_field in attrs.form %}\n    {% element field unlabeled=attrs.unlabeled name=bound_field.name type=bound_field.field.widget.input_type required=bound_field.field.required value=bound_field.value id=bound_field.auto_id errors=bound_field.errors placeholder=bound_field.field.widget.attrs.placeholder tabindex=bound_field.field.widget.attrs.tabindex autocomplete=bound_field.field.widget.attrs.autocomplete style=bound_field.field.widget.attrs.style choices=bound_field.field.choices %}\n        {% slot label %}\n            {{ bound_field.label }}\n        {% endslot %}\n        {% if bound_field.field.help_text %}\n            {% slot help_text %}\n                {{ bound_field.field.help_text }}\n            {% endslot %}\n        {% endif %}\n    {% endelement %}\n{% endfor %}\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/form.html",
    "content": "{% load allauth %}\n{% for err in attrs.form.non_field_errors %}<div role=\"alert\" class=\"alert alert-danger\">{{ err }}</div>{% endfor %}\n<form class=\"{% block form_class %}{% if not attrs.no_visible_fields %}card{% endif %}{% endblock %}\"\n      method=\"{{ attrs.method }}\"\n      {% if attrs.action %}action=\"{{ attrs.action }}\"{% endif %}>\n    {% if not attrs.no_visible_fields %}<div class=\"card-body\">{% endif %}\n        {% slot body %}\n        {% endslot %}\n        {% if not attrs.no_visible_fields %}</div>{% endif %}\n    {% if not attrs.no_visible_fields %}<div class=\"card-footer\">{% endif %}\n        {% slot actions %}\n        {% endslot %}\n        {% if not attrs.no_visible_fields %}</div>{% endif %}\n</form>\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/form__entrance.html",
    "content": "{% extends \"allauth/elements/form.html\" %}\n{% block form_class %}{% endblock %}\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/h1.html",
    "content": "{% load allauth %}\n<h1 class=\"mt-4\">\n    {% slot %}\n    {% endslot %}\n</h1>\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/h1__entrance.html",
    "content": "{% load allauth %}\n<h1 class=\"fw-bold fs-2\">\n    {% slot %}\n    {% endslot %}\n</h1>\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/h2__entrance.html",
    "content": "{% load allauth %}\n<h2 class=\"fw-bold fs-5\">\n    {% slot %}\n    {% endslot %}\n</h2>\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/img.html",
    "content": "<div class=\"text-center\">\n    <img class=\"img-fluid\"\n         src=\"{{ attrs.src }}\"\n         {% if attrs.alt %}alt=\"{{ attrs.alt }}\"{% endif %}>\n</div>\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/panel.html",
    "content": "{% load allauth %}\n<div class=\"card mb-4\">\n    <div class=\"card-body\">\n        <h5 class=\"card-title\">\n            {% slot title %}\n            {% endslot %}\n        </h5>\n        {% slot body %}\n        {% endslot %}\n    </div>\n    {% if slots.actions %}\n        <div class=\"card-footer\">\n            {% slot actions %}\n            {% endslot %}\n        </div>\n    {% endif %}\n</div>\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/provider.html",
    "content": "{% load allauth %}\n<li class=\"list-group-item\">\n    <a class=\"d-block w-100 link-dark link-underline link-underline-opacity-0\"\n       title=\"{{ attrs.name }}\"\n       href=\"{{ attrs.href }}\">{{ attrs.name }}</a>\n</li>\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/provider_list.html",
    "content": "{% load allauth %}\n<ul class=\"list-group\">\n    {% slot %}\n    {% endslot %}\n</ul>\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/elements/table.html",
    "content": "{% load allauth %}\n<table class=\"table table-striped\">\n    {% slot %}\n    {% endslot %}\n</table>\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/layouts/base.html",
    "content": "<!DOCTYPE html>\n{% load i18n %}\n<html lang=\"en\" data-bs-theme=\"auto\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n        <meta name=\"description\" content=\"\">\n        <meta name=\"generator\" content=\"Hugo 0.118.2\">\n        <title>\n            {% block head_title %}{% endblock %}\n        </title>\n        <link href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css\"\n              rel=\"stylesheet\"\n              integrity=\"sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN\"\n              crossorigin=\"anonymous\">\n    </head>\n    <body class=\"min-vh-100 d-flex flex-shrink-0 flex-column\">\n        <a class=\"visually-hidden-focusable\" href=\"#content\">{% translate \"Skip to main content\" %}</a>\n        <header data-bs-theme=\"dark\">\n            <nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n                <div class=\"container-fluid\">\n                    <a class=\"navbar-brand\" href=\"/\">django-allauth</a>\n                    <button class=\"navbar-toggler\"\n                            type=\"button\"\n                            data-bs-toggle=\"collapse\"\n                            data-bs-target=\"#navbarText\"\n                            aria-controls=\"navbarText\"\n                            aria-expanded=\"false\"\n                            aria-label=\"Toggle navigation\">\n                        <span class=\"navbar-toggler-icon\"></span>\n                    </button>\n                    <div class=\"collapse navbar-collapse\" id=\"navbarText\">\n                        <ul role=\"navigation\"\n                            aria-label=\"Project links\"\n                            class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n                            <li class=\"nav-item\">\n                                <a class=\"nav-link active\" href=\"https://docs.allauth.org/\">Documentation</a>\n                            </li>\n                            <li class=\"nav-item\">\n                                <a class=\"nav-link\" href=\"https://codeberg.org/allauth/django-allauth\">Repository</a>\n                            </li>\n                        </ul>\n                        <div class=\"d-flex flex-column flex-sm-row gap-2 col-lg-3 justify-content-lg-end text-nowrap\">\n                            <form class=\"d-flex\" method=\"post\" action=\"{% url 'set_language' %}\">\n                                {% csrf_token %}\n                                {% get_available_languages as LANGUAGES %}\n                                {% get_current_language as LANGUAGE_CODE %}\n                                <label for=\"language-dropdown\" class=\"visually-hidden\">{% translate \"Select Language\" %}</label>\n                                <select id=\"language-dropdown\"\n                                        aria-label=\"{% translate 'Select Language' %}\"\n                                        name=\"language\"\n                                        onchange=\"this.form.submit()\">\n                                    {% get_language_info_list for LANGUAGES as languages %}\n                                    {% for lang in languages %}\n                                        <option lang=\"{{ lang.code }}\"\n                                                {% if lang.code == LANGUAGE_CODE %}selected{% endif %}\n                                                value=\"{{ lang.code }}\">{{ lang.name_local }}</option>\n                                    {% endfor %}\n                                </select>\n                            </form>\n                            {% if user.is_authenticated %}\n                                {% url 'account_email' as email_url_ %}\n                                {% url 'socialaccount_connections' as socialaccount_url_ %}\n                                {% if email_url_ or socialaccount_url_ %}\n                                    <a href=\"{% if email_url_ %}{{ email_url_ }}{% else %}{{ socialaccount_url_ }}{% endif %}\"\n                                       class=\"btn btn-secondary\">Manage Account</a>\n                                {% endif %}\n                                <a href=\"{% url 'account_logout' %}\" class=\"btn btn-danger\">{% translate \"Sign Out\" %}</a>\n                            {% else %}\n                                <a href=\"{% url 'account_login' %}\" class=\"btn btn-outline-light\">{% translate \"Sign In\" %}</a>\n                                {% url 'account_signup' as signup_url_ %}\n                                {% if signup_url_ %}\n                                    <a href=\"{{ signup_url_ }}\" class=\"btn btn-success\">{% translate \"Sign Up\" %}</a>\n                                {% endif %}\n                            {% endif %}\n                        </div>\n                    </div>\n                </div>\n            </nav>\n        </header>\n        {% block body %}\n            {% block content %}\n            {% endblock content %}\n        {% endblock body %}\n        {% block extra_body %}\n        {% endblock extra_body %}\n        <script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js\"\n                integrity=\"sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL\"\n                crossorigin=\"anonymous\"></script>\n    </body>\n</html>\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/layouts/entrance.html",
    "content": "{% extends \"allauth/layouts/base.html\" %}\n{% load i18n allauth %}\n{% block body %}\n    <div class=\"flex-grow-1 bg-body-secondary d-flex flex-column justify-content-center\">\n        <div class=\"flex-grow-0 flex-shrink-0 container\">\n            <div class=\"row justify-content-md-center\">\n                <div class=\"col col-lg-4\">\n                    {% if messages %}\n                        {% for message in messages %}\n                            {% element alert level=message.tags %}\n                                {% slot message %}\n                                    {{ message }}\n                                {% endslot %}\n                            {% endelement %}\n                        {% endfor %}\n                    {% endif %}\n                    <div class=\"bg-white shadow rounded-4\">\n                        <div id=\"content\" class=\"p-5\">\n                            {% block content %}{% endblock %}\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n{% endblock %}\n"
  },
  {
    "path": "examples/regular-django/example/templates/allauth/layouts/manage.html",
    "content": "{% extends \"allauth/layouts/base.html\" %}\n{% load allauth %}\n{% block body %}\n    <div class=\"flex-grow-1 row\">\n        <aside class=\"col-sm-4 col-md-3 col-lg-2 text-bg-dark\">\n            <ul class=\"p-3 nav nav-pills flex-column\">\n                {% url 'account_email' as email_url_ %}\n                {% if email_url_ %}\n                    <li class=\"nav-item\">\n                        <a class=\"{% block nav_class_email %}nav-link text-white{% endblock %}\"\n                           href=\"{{ email_url_ }}\">Change Email</a>\n                    </li>\n                {% endif %}\n                {% url 'account_change_password' as change_password_url_ %}\n                {% if change_password_url_ %}\n                    <li class=\"nav-item\">\n                        <a class=\"{% block nav_class_password %}nav-link text-white{% endblock %}\"\n                           href=\"{{ change_password_url_ }}\">Change Password</a>\n                    </li>\n                {% endif %}\n                {% url 'account_change_phone' as phone_url_ %}\n                {% if phone_url_ %}\n                    <li class=\"nav-item\">\n                        <a class=\"{% block nav_class_phone %}nav-link text-white{% endblock %}\"\n                           href=\"{{ phone_url_ }}\">Change Phone</a>\n                    </li>\n                {% endif %}\n                {% url 'socialaccount_connections' as connections_url_ %}\n                {% if connections_url_ %}\n                    <li class=\"nav-item\">\n                        <a class=\"{% block nav_class_socialaccount %}nav-link text-white{% endblock %}\"\n                           href=\"{{ connections_url_ }}\">Third-Party Accounts</a>\n                    </li>\n                {% endif %}\n                {% url 'mfa_index' as mfa_index_url_ %}\n                {% if mfa_index_url_ %}\n                    <li class=\"nav-item\">\n                        <a class=\"{% block nav_class_mfa %}nav-link text-white{% endblock %}\"\n                           href=\"{{ mfa_index_url_ }}\">Two-Factor Authentication</a>\n                    </li>\n                {% endif %}\n                {% url 'usersessions_list' as usersessions_list_url_ %}\n                {% if usersessions_list_url_ %}\n                    <li class=\"nav-item\">\n                        <a class=\"{% block nav_class_usersessions %}nav-link text-white{% endblock %}\"\n                           href=\"{{ usersessions_list_url_ }}\">Sessions</a>\n                    </li>\n                {% endif %}\n            </ul>\n        </aside>\n        <main class=\"col-sm-8 col-md-9 col-lg-10\">\n            <div id=\"content\" class=\"container\">\n                {% if messages %}\n                    <div class=\"pt-4\">\n                        {% for message in messages %}\n                            {% element alert level=message.tags %}\n                                {% slot message %}\n                                    {{ message }}\n                                {% endslot %}\n                            {% endelement %}\n                        {% endfor %}\n                    </div>\n                {% endif %}\n                {% block content %}{% endblock %}\n            </div>\n        </main>\n    </div>\n{% endblock %}\n"
  },
  {
    "path": "examples/regular-django/example/templates/index.html",
    "content": "{% extends \"allauth/layouts/entrance.html\" %}\n{% load allauth %}\n{% block head_title %}Example Project{% endblock %}\n{% block content %}\n    {% element h1 %}\n        Example Project\n    {% endelement %}\n    <p>Welcome to the django-allauth example project.</p>\n{% endblock content %}\n"
  },
  {
    "path": "examples/regular-django/example/templates/mfa/base_manage.html",
    "content": "{% extends \"allauth/layouts/manage.html\" %}\n{% block nav_class_mfa %}{{ block.super }} active{% endblock %}\n"
  },
  {
    "path": "examples/regular-django/example/templates/profile.html",
    "content": "{% extends \"allauth/layouts/manage.html\" %}\n{% load allauth %}\n{% block head_title %}Profile{% endblock %}\n{% block content %}\n    {% element h1 %}\n        Profile\n    {% endelement %}\n    <p>Your profile</p>\n{% endblock content %}\n"
  },
  {
    "path": "examples/regular-django/example/templates/socialaccount/base_manage.html",
    "content": "{% extends \"allauth/layouts/manage.html\" %}\n{% block nav_class_socialaccount %}{{ block.super }} active{% endblock %}\n"
  },
  {
    "path": "examples/regular-django/example/templates/usersessions/base_manage.html",
    "content": "{% extends \"allauth/layouts/manage.html\" %}\n{% block nav_class_usersessions %}{{ block.super }} active{% endblock %}\n"
  },
  {
    "path": "examples/regular-django/example/urls.py",
    "content": "from django.contrib import admin\nfrom django.urls import include, path\nfrom django.views.generic.base import TemplateView\n\nfrom allauth.account.decorators import secure_admin_login\n\n\nadmin.autodiscover()\nadmin.site.login = secure_admin_login(admin.site.login)\n\nurlpatterns = [\n    path(\"\", TemplateView.as_view(template_name=\"index.html\")),\n    path(\"accounts/\", include(\"allauth.urls\")),\n    path(\"accounts/profile/\", TemplateView.as_view(template_name=\"profile.html\")),\n    path(\"admin/\", admin.site.urls),\n    path(\"i18n/\", include(\"django.conf.urls.i18n\")),\n    path(\"\", include(\"allauth.idp.urls\")),\n]\n"
  },
  {
    "path": "examples/regular-django/example/users/__init__.py",
    "content": ""
  },
  {
    "path": "examples/regular-django/example/users/allauth.py",
    "content": "import typing\n\nfrom django.contrib import messages\n\nfrom example.users.models import User\n\nfrom allauth.account.adapter import DefaultAccountAdapter\n\n\nclass AccountAdapter(DefaultAccountAdapter):\n\n    def set_phone(self, user, phone: str, verified: bool):\n        user.phone = phone\n        user.phone_verified = verified\n        user.save(update_fields=[\"phone\", \"phone_verified\"])\n\n    def get_phone(self, user) -> typing.Optional[typing.Tuple[str, bool]]:\n        if user.phone:\n            return user.phone, user.phone_verified\n        return None\n\n    def set_phone_verified(self, user, phone):\n        self.set_phone(user, phone, True)\n\n    def send_verification_code_sms(self, user, phone: str, code: str, **kwargs):\n        messages.add_message(\n            self.request,\n            messages.WARNING,\n            f\"⚠️ SMS demo stub: assume code {code} was sent to {phone}.\",\n        )\n\n    def send_unknown_account_sms(self, phone: str, **kwargs):\n        messages.add_message(\n            self.request,\n            messages.WARNING,\n            f\"⚠️ SMS demo stub: Enumeration prevention: texted {phone} informing no account exists.\",\n        )\n\n    def send_account_already_exists_sms(self, phone: str, **kwargs):\n        messages.add_message(\n            self.request,\n            messages.WARNING,\n            f\"⚠️ SMS demo stub: Enumeration prevention: texted {phone} informing account already exists.\",\n        )\n\n    def get_user_by_phone(self, phone):\n        return User.objects.filter(phone=phone).order_by(\"-phone_verified\").first()\n"
  },
  {
    "path": "examples/regular-django/example/users/apps.py",
    "content": "from django.apps import AppConfig\nfrom django.utils.translation import gettext_lazy as _\n\n\nclass UsersConfig(AppConfig):\n    name = \"example.users\"\n    verbose_name = _(\"Users\")\n    default_auto_field = \"django.db.models.AutoField\"\n"
  },
  {
    "path": "examples/regular-django/example/users/migrations/0001_initial.py",
    "content": "import uuid\n\nimport django.contrib.auth.models\nimport django.contrib.auth.validators\nimport django.utils.timezone\nfrom django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n\n    initial = True\n\n    dependencies = [\n        (\"auth\", \"0012_alter_user_first_name_max_length\"),\n    ]\n\n    operations = [\n        migrations.CreateModel(\n            name=\"User\",\n            fields=[\n                (\"password\", models.CharField(max_length=128, verbose_name=\"password\")),\n                (\n                    \"last_login\",\n                    models.DateTimeField(\n                        blank=True, null=True, verbose_name=\"last login\"\n                    ),\n                ),\n                (\n                    \"is_superuser\",\n                    models.BooleanField(\n                        default=False,\n                        help_text=\"Designates that this user has all permissions without explicitly assigning them.\",\n                        verbose_name=\"superuser status\",\n                    ),\n                ),\n                (\n                    \"username\",\n                    models.CharField(\n                        error_messages={\n                            \"unique\": \"A user with that username already exists.\"\n                        },\n                        help_text=\"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.\",\n                        max_length=150,\n                        unique=True,\n                        validators=[\n                            django.contrib.auth.validators.UnicodeUsernameValidator()\n                        ],\n                        verbose_name=\"username\",\n                    ),\n                ),\n                (\n                    \"first_name\",\n                    models.CharField(\n                        blank=True, max_length=150, verbose_name=\"first name\"\n                    ),\n                ),\n                (\n                    \"last_name\",\n                    models.CharField(\n                        blank=True, max_length=150, verbose_name=\"last name\"\n                    ),\n                ),\n                (\n                    \"email\",\n                    models.EmailField(\n                        blank=True, max_length=254, verbose_name=\"email address\"\n                    ),\n                ),\n                (\n                    \"is_staff\",\n                    models.BooleanField(\n                        default=False,\n                        help_text=\"Designates whether the user can log into this admin site.\",\n                        verbose_name=\"staff status\",\n                    ),\n                ),\n                (\n                    \"is_active\",\n                    models.BooleanField(\n                        default=True,\n                        help_text=\"Designates whether this user should be treated as active. Unselect this instead of deleting accounts.\",\n                        verbose_name=\"active\",\n                    ),\n                ),\n                (\n                    \"date_joined\",\n                    models.DateTimeField(\n                        default=django.utils.timezone.now, verbose_name=\"date joined\"\n                    ),\n                ),\n                (\n                    \"id\",\n                    models.UUIDField(\n                        default=uuid.uuid4, primary_key=True, serialize=False\n                    ),\n                ),\n                (\n                    \"phone\",\n                    models.CharField(blank=True, max_length=16, null=True, unique=True),\n                ),\n                (\"phone_verified\", models.BooleanField(default=False)),\n                (\n                    \"groups\",\n                    models.ManyToManyField(\n                        blank=True,\n                        help_text=\"The groups this user belongs to. A user will get all permissions granted to each of their groups.\",\n                        related_name=\"user_set\",\n                        related_query_name=\"user\",\n                        to=\"auth.group\",\n                        verbose_name=\"groups\",\n                    ),\n                ),\n                (\n                    \"user_permissions\",\n                    models.ManyToManyField(\n                        blank=True,\n                        help_text=\"Specific permissions for this user.\",\n                        related_name=\"user_set\",\n                        related_query_name=\"user\",\n                        to=\"auth.permission\",\n                        verbose_name=\"user permissions\",\n                    ),\n                ),\n            ],\n            options={\n                \"verbose_name\": \"user\",\n                \"verbose_name_plural\": \"users\",\n                \"abstract\": False,\n            },\n            managers=[\n                (\"objects\", django.contrib.auth.models.UserManager()),\n            ],\n        ),\n    ]\n"
  },
  {
    "path": "examples/regular-django/example/users/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "examples/regular-django/example/users/models.py",
    "content": "import uuid\n\nfrom django.contrib.auth.models import AbstractUser\nfrom django.db import models\n\n\nclass User(AbstractUser):\n    id = models.UUIDField(primary_key=True, default=uuid.uuid4)\n    phone = models.CharField(max_length=16, unique=True, blank=True, null=True)\n    phone_verified = models.BooleanField(default=False)\n"
  },
  {
    "path": "examples/regular-django/example/wsgi.py",
    "content": "import os\n\nfrom django.core.wsgi import get_wsgi_application\n\n\nos.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"example.settings\")\n\napplication = get_wsgi_application()\n"
  },
  {
    "path": "examples/regular-django/manage.py",
    "content": "#!/usr/bin/env python\nimport os\nimport sys\n\n\nif __name__ == \"__main__\":\n    os.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"example.settings\")\n\n    from django.core.management import execute_from_command_line\n\n    execute_from_command_line(sys.argv)\n"
  },
  {
    "path": "examples/regular-django/requirements.txt",
    "content": "django-allauth[mfa,saml,socialaccount,steam]>=65.15.0\n"
  },
  {
    "path": "manage.py",
    "content": "#!/usr/bin/env python\nimport os\n\n\nos.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"tests.projects.regular.settings\")\nfrom django.core import management  # noqa: E402\n\n\nif __name__ == \"__main__\":\n    management.execute_from_command_line()\n"
  },
  {
    "path": "mise.toml",
    "content": "[tools]\npython = \"3.13\"\nruff = \"latest\"\n\n[env]\n_.python.venv = \".venv\"\n\n[tasks.install]\nrun = [\"python -m venv .venv\", \".venv/bin/pip install -r requirements-dev.txt\"]\n"
  },
  {
    "path": "noxfile.py",
    "content": "import os\n\nimport nox\n\n\n@nox.session\ndef docs(session):\n    session.install(\n        \"Django==5.2\",\n        \"Sphinx>=7.4.7,<8\",\n        \"sphinx_rtd_theme\",\n        \"djangorestframework>=3.15.2,<4\",\n        \"django-ninja>=1.3.0,<2\",\n        \"snowballstemmer<3\",  # https://github.com/sphinx-doc/sphinx/issues/13533\n    )\n    session.run(\"make\", \"docs\")\n\n\n@nox.session(tags=[\"lint\"])\ndef lint(session):\n    session.install(\"bandit\")\n    session.run(\"bandit\", \"-c\", \"pyproject.toml\", \"-r\", \"allauth/\")\n\n\n@nox.session(tags=[\"lint\"])\ndef isort(session):\n    session.install(\"isort==5.13.2\")\n    session.run(\"isort\", \"--check-only\", \"--diff\", \"--gitignore\", \".\")\n\n\n@nox.session(tags=[\"lint\"])\ndef flake8(session):\n    session.install(\"flake8==7.2.0\")\n    session.run(\"flake8\", \"allauth/\", \"tests/\")\n\n\n@nox.session(tags=[\"lint\"])\ndef black(session):\n    session.install(\"black==24.4.0\")\n    session.run(\"black\", \"--check\", \".\")\n\n\n@nox.session(tags=[\"lint\"])\ndef djlint(session):\n    session.install(\"djlint==1.34.1\")\n    session.run(\n        \"djlint\", \"--configuration\", \".djlintrc\", \"--check\", \"./allauth\", \"./examples\"\n    )\n\n\nDJANGO_PYTHON_REQ = {\n    \"4.2.20\": (\"3.10\", \"3.11\", \"3.12\"),\n    \"5.1\": (\"3.10\", \"3.11\", \"3.12\", \"3.13\"),\n    \"5.2\": (\"3.10\", \"3.11\", \"3.12\", \"3.13\", \"3.14\"),\n    \"6.0\": (\"3.12\", \"3.13\", \"3.14\"),\n}\nDJANGO_LTS = \"5.2\"\n\n\n@nox.session(python=[\"3.10\", \"3.11\", \"3.12\", \"3.13\", \"3.14\"])\n@nox.parametrize(\"django\", list(DJANGO_PYTHON_REQ.keys()))\n@nox.parametrize(\n    \"project\", [\"regular\", \"headless_only\", \"account_only\", \"login_required_mw\"]\n)\ndef test(session, django, project):\n    django_version = tuple(map(int, django.split(\".\")))\n    if django != DJANGO_LTS:\n        last_django_python = DJANGO_PYTHON_REQ[django][-1]\n        first_django_python = DJANGO_PYTHON_REQ[django][0]\n        if session.python not in (first_django_python, last_django_python):\n            print(\n                f\"Skipping: only current LTS is tested against python{session.python}, not Django {django}\"\n            )\n            return\n\n    if project == \"login_required_mw\" and django_version < (5, 1):\n        print(f\"Skipping: project {project} does not support Django {django}\")\n        return\n    if session.python not in DJANGO_PYTHON_REQ[django]:\n        print(f\"Skipping: Django {django} does not support python{session.python}\")\n        return\n    django_version = f\"{django}.0\" if django != \"6.0\" else \"6.0rc1\"\n    session.install(\n        f\"django~={django_version}\",\n        \"pytest>=8.3.5,<9\",\n        \"pytest-asyncio==1.3.0\",\n        \"pytest-django>=4.11,<5\",\n        \"Pillow>=9.0\",\n        \"coverage==7.6.1\",\n        # SAML is disabled in CI\n        # \"python3-saml==1.16.0\",\n        # \"xmlsec==1.3.14\",\n        # \"lxml==5.2.1\",\n        \"pyyaml>=6.0.2,<7\",\n        \"psycopg2-binary>=2.9.10,<3\",\n        \"djangorestframework>=3.15.2,<4\",\n        \"django-ninja>=1.3.0,<2\",\n        \"mypy==1.19.1\",\n        \".[mfa,openid,socialaccount,steam]\",  # SAML is disabled in CI\n    )\n    session.run(\"/bin/sh\", \"-c\", \"cd allauth; python ../manage.py compilemessages\")\n    run_coveralls = (\n        os.environ.get(\"GITHUB_TOKEN\")\n        and project == \"regular\"\n        and django == \"5.2\"\n        and session.python == \"3.14\"\n    )\n    if run_coveralls:\n        session.install(\"coveralls\")\n    session.run(\n        \"coverage\",\n        \"run\",\n        \"-m\",\n        \"pytest\",\n        f\"--ds=tests.projects.{project}.settings\",\n        \"tests/\",\n    )\n    if run_coveralls:\n        session.run(\"coveralls\", \"--service=github\")\n    if django == \"5.2\" and session.python == \"3.14\":\n        session.install(\n            \"django-stubs~=5.2.9\",\n            \"types-requests==2.32.4.20260107\",\n        )\n        session.run(\"mypy\", \"allauth\")\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"django-allauth\",\n  \"devDependencies\": {\n    \"standard\": \"^17.1.2\"\n  },\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\"\n}\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[build-system]\nrequires = [\"setuptools>=75.3.0\", \"setuptools-scm>=8\"]\nbuild-backend = \"setuptools.build_meta\"\n\n[project]\nname = \"django-allauth\"\ndynamic = [\"version\"]\nauthors = [\n  {name = \"Raymond Penners\", email = \"raymond.penners@intenct.nl\"},\n]\ndescription = \"Integrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication.\"\nreadme = \"README.rst\"\nlicense = {text = \"MIT\"}\nclassifiers = [\n    \"Development Status :: 5 - Production/Stable\",\n    \"Intended Audience :: Developers\",\n    \"Topic :: Software Development :: Libraries :: Python Modules\",\n    \"Environment :: Web Environment\",\n    \"Topic :: Internet\",\n    \"License :: OSI Approved :: MIT License\",\n    \"Operating System :: OS Independent\",\n    \"Programming Language :: Python\",\n    \"Programming Language :: Python :: 3\",\n    \"Programming Language :: Python :: 3.10\",\n    \"Programming Language :: Python :: 3.11\",\n    \"Programming Language :: Python :: 3.12\",\n    \"Programming Language :: Python :: 3.13\",\n    \"Programming Language :: Python :: 3.14\",\n    \"Framework :: Django\",\n    \"Framework :: Django :: 4.2\",\n    \"Framework :: Django :: 5.0\",\n    \"Framework :: Django :: 5.1\",\n    \"Framework :: Django :: 5.2\",\n    \"Framework :: Django :: 6.0\",\n]\nrequires-python = \">= 3.10\"\ndependencies = [\n    \"Django >= 4.2.16\",\n    \"asgiref >= 3.8.1\",\n]\n\n[project.optional-dependencies]\nheadless = [\n    \"pyjwt[crypto] >= 2.0,<3\",\n]\nheadless-spec = [\n    \"PyYAML >= 6,<7\",\n]\nidp-oidc = [\n    \"oauthlib >= 3.3.0,<4\",\n    \"pyjwt[crypto] >= 2.0,<3\",\n]\nmfa = [\n    \"qrcode >= 7.0.0,<9\",\n    \"fido2 >= 1.1.2,<3\",\n]\nopenid = [\n    \"python3-openid >= 3.0.8,<4\",\n]\nsaml = [\n    \"python3-saml>=1.15.0,<2.0.0\",\n]\nsteam = [\n    \"python3-openid >= 3.0.8,<4\",\n]\nsocialaccount = [\n    \"oauthlib >= 3.3.0,<4\",\n    \"requests >= 2.0.0,<3\",\n    \"pyjwt[crypto] >= 2.0,<3\",\n]\n\n\n[project.urls]\nHomepage = \"https://allauth.org\"\nDocumentation = \"https://docs.allauth.org/en/latest/\"\n\"Release notes\" = \"https://codeberg.org/allauth/django-allauth/src/branch/main/ChangeLog.rst\"\nSource = \"https://codeberg.org/allauth/django-allauth\"\nTracker = \"https://codeberg.org/allauth/django-allauth/issues\"\nFunding = \"https://github.com/sponsors/pennersr\"\n\n[tool.bandit]\nexclude_dirs = [\"tests\", \"allauth/conftest.py\"]\nexclude = [\"test_*\"]\n\n[tool.isort]\nprofile = \"black\"\nknown_first_party = [\"allauth\"]\nindent = 4\ncombine_star = true\ncombine_as_imports = true\ninclude_trailing_comma = true\nmulti_line_output = 3\nlines_after_imports = 2\nknown_django = [\"django\"]\nextra_standard_library = [\n  \"types\", \"requests\"\n]\nsections = [\"FUTURE\", \"STDLIB\", \"DJANGO\", \"THIRDPARTY\", \"FIRSTPARTY\", \"LOCALFOLDER\"]\n\n[tool.mypy]\nmypy_path = \".\"\nplugins = [\n    \"mypy_django_plugin.main\"\n]\nstrict_optional = true\ndisable_error_code = [\n  \"import-untyped\",\n  \"import-not-found\",\n]\nwarn_unused_configs = true\nwarn_unused_ignores = true\nexclude = [\n  \"allauth/account/migrations/.*\",\n]\n\n[tool.django-stubs]\ndjango_settings_module = \"tests.projects.regular.settings\"\n\n[tool.setuptools.dynamic]\nversion = {attr = \"allauth.__version__\"}\n\n[tool.setuptools_scm]\n\n[tool.setuptools.packages.find]\ninclude = [\"allauth*\"]\n\n[tool.setuptools.package-data]\n\"*\" = [\"*.mo\"]\n"
  },
  {
    "path": "pytest.ini",
    "content": "[pytest]\nDJANGO_SETTINGS_MODULE = tests.projects.regular.settings\npython_files = tests.py test_*.py *_tests.py\n"
  },
  {
    "path": "requirements-dev.txt",
    "content": "# Install the package itself with all extras\n-e .[headless,socialaccount,mfa,idp-oidc,openid,steam,saml]\n\nSphinx\nsphinx_rtd_theme\n\n# Testing tools\npytest>=7.4\npytest-asyncio==1.3.0\npytest-django>=4.5.2\npytest-cov\n\n# Code quality\nisort==5.13.2\nbandit>=1.8.6,<2\nblack==24.4.0\ndjlint==1.34.1\nflake8>=7.3.0,<8\nmypy==1.19.1\n\n# Type stubs\ndjango-stubs==5.2.9\ntypes-requests==2.32.4.20260107\noauthlib>=3.3.0,<4\nPillow>=9.0\npsycopg[binary]>=3.2.10\ndjangorestframework>=3.15.2,<4\ndjango-ninja>=1.3.0,<2\npyyaml>=6.0.2,<7\nnox\n\n# IDE\npython-lsp-server==1.13.1  # https://pypi.org/project/python-lsp-server/\npylsp-rope==0.1.17  # https://pypi.org/project/pylsp-rope/\n\n# Release\nbuild>=1.3.0,<2\ntwine>=6.2.0,<7\n"
  },
  {
    "path": "setup.cfg",
    "content": "[flake8]\nmax-line-length = 88\n# Black\nignore = E203, W503, E501, E231\n"
  },
  {
    "path": "tests/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/account/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/account/internal/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/account/internal/test_emailkit.py",
    "content": "import pytest\n\nfrom allauth.account.internal import emailkit\n\n\n@pytest.mark.parametrize(\n    \"email,valid\",\n    [\n        (\n            \"this.email.address.is.a.bit.too.long.but.should.still.validate@example.com\",\n            True,\n        ),\n        (\n            (\"x\" * 300)\n            + \"this.email.address.is.a.bit.too.long.but.should.still.validate@example.com\",\n            False,\n        ),\n    ],\n)\ndef test_email_validation(email, valid):\n    clean_email = emailkit.valid_email_or_none(email)\n    if valid:\n        assert clean_email == email\n    else:\n        assert clean_email is None\n"
  },
  {
    "path": "tests/apps/account/test_adapter.py",
    "content": "import sys\nfrom http import HTTPStatus\n\nfrom django.core.exceptions import PermissionDenied\nfrom django.http import HttpResponseRedirect\nfrom django.urls import reverse\n\nimport pytest\n\nfrom allauth.account.adapter import DefaultAccountAdapter\nfrom allauth.core.exceptions import ImmediateHttpResponse\n\n\nclass PreLoginRedirectAccountAdapter(DefaultAccountAdapter):\n    def pre_login(self, *args, **kwargs):\n        raise ImmediateHttpResponse(HttpResponseRedirect(\"/foo\"))\n\n\ndef test_adapter_pre_login(settings, user, user_password, client):\n    settings.ACCOUNT_ADAPTER = (\n        \"tests.apps.account.test_adapter.PreLoginRedirectAccountAdapter\"\n    )\n    resp = client.post(\n        reverse(\"account_login\"),\n        {\"login\": user.username, \"password\": user_password},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == \"/foo\"\n\n\n@pytest.mark.parametrize(\n    \"x_forwarded_for,expected_ip\",\n    [\n        (\"\", None),\n        (\"192.168.1.1\", \"192.168.1.1\"),\n        (\" 192.168.1.1\", \"192.168.1.1\"),\n        (\"192.168.1.1 \", \"192.168.1.1\"),\n        (\" 192.168.1.1:12345 \", \"192.168.1.1\"),\n        (\" [2001:db8::1:0]:12345 \", \"2001:db8::1:0\"),\n        (\"192.168.1.1:12345\", \"192.168.1.1\"),\n        (\n            \"2001:0db8:85a3:0000:0000:8a2e:0370:7334\",\n            \"2001:db8:85a3::8a2e:370:7334\",\n        ),\n        (\n            \"[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:12345\",\n            \"2001:db8:85a3::8a2e:370:7334\",\n        ),\n        (\"2001:db8::1:0\", \"2001:db8::1:0\"),\n        (\"[2001:db8::1:0]:12345\", \"2001:db8::1:0\"),\n        (\"::abc:7:def\", \"::abc:7:def\"),\n        (\"::1\", \"::1\"),\n        (\"[::1]:12345\", \"::1\"),\n    ]\n    + (\n        [\n            # not supported by ipaddress py3.8\n            (\"fe80::1234%1\", \"fe80::1234%1\"),\n        ]\n        if sys.version_info >= (3, 9)\n        else []\n    ),\n)\ndef test_get_client_ip_vs_x_forwarded_for(rf, x_forwarded_for, expected_ip, settings):\n    settings.ALLAUTH_TRUSTED_PROXY_COUNT = 1\n    request = rf.get(\"/\", HTTP_X_FORWARDED_FOR=x_forwarded_for)\n    ip = DefaultAccountAdapter(request=request).get_client_ip(request)\n    assert ip == (expected_ip if expected_ip else request.META[\"REMOTE_ADDR\"])\n\n\n@pytest.mark.parametrize(\n    \"x_forwarded_for\",\n    [\n        \" \",\n        \"999.999.999.999\",\n        \"[999.999.999.999]\",\n        \"999.999.999.999:12345\",\n        \"[999.999.999.999]:12345\",\n        \"[192.0.0.2]\",\n        \"[192.0.0.2]:12345\",\n        \"192.[0].0.2\",\n        \"192.[0].0.2:12345\",\n        \"192.[0.0].2:12345\",\n        \"[192.[0.0].2:12345\",\n        \"2001:db8::1:0:12345\",\n        \"[2001:db8::1:0:12345]\",\n        \"2001:0db8:85a3:0000:0000:8a2e:0370:12345\",\n        \"[2001:0db8:85a3:0000:0000:8a2e:0370]:7334:12345\",\n        \"XwDxNk4JQhUft')) OR 18=(SELECT 18 FROM PG_SLEEP(15))--\",\n    ],\n)\ndef test_get_client_ip_vs_invalid_x_forwarded_for(rf, x_forwarded_for, settings):\n    settings.ALLAUTH_TRUSTED_PROXY_COUNT = 1\n    request = rf.get(\"/\", HTTP_X_FORWARDED_FOR=x_forwarded_for)\n    with pytest.raises(PermissionDenied):\n        DefaultAccountAdapter(request=request).get_client_ip(request)\n"
  },
  {
    "path": "tests/apps/account/test_ajax.py",
    "content": "import json\nfrom http import HTTPStatus\n\nfrom django.conf import settings\nfrom django.urls import reverse\n\nimport pytest\nfrom pytest_django.asserts import assertRedirects\n\nfrom allauth.account import app_settings\n\n\n@pytest.mark.parametrize(\n    \"headers,ajax_expected\",\n    [\n        ({}, False),\n        ({\"HTTP_X_REQUESTED_WITH\": \"XMLHttpRequest\"}, True),\n        ({\"HTTP_ACCEPT\": \"application/json\"}, True),\n    ],\n)\ndef test_ajax_headers(db, client, headers, ajax_expected):\n    resp = client.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": \"john@example.org\",\n            \"email2\": \"john@example.org\",\n            \"password1\": \"johndoe\",\n            \"password2\": \"johndoe\",\n        },\n        **headers,\n    )\n    if ajax_expected:\n        assert resp.status_code == HTTPStatus.OK\n        assert resp.json()[\"location\"] == settings.LOGIN_REDIRECT_URL\n        assert resp.json()[\"location\"] == settings.LOGIN_REDIRECT_URL\n    else:\n        assert resp.status_code == HTTPStatus.FOUND\n        assertRedirects(\n            resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False\n        )\n\n\ndef test_ajax_password_reset(client, user, mailoutbox):\n    resp = client.post(\n        reverse(\"account_reset_password\"),\n        data={\"email\": user.email},\n        HTTP_X_REQUESTED_WITH=\"XMLHttpRequest\",\n    )\n    assert len(mailoutbox) == 1\n    assert mailoutbox[0].to == [user.email]\n    assert resp[\"content-type\"] == \"application/json\"\n\n\ndef test_ajax_login_fail(client, db):\n    resp = client.post(\n        reverse(\"account_login\"),\n        {},\n        HTTP_X_REQUESTED_WITH=\"XMLHttpRequest\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    json.loads(resp.content.decode(\"utf8\"))\n    # TODO: Actually test something\n\n\ndef test_ajax_login_success(settings, user, user_password, client):\n    settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.OPTIONAL\n    resp = client.post(\n        reverse(\"account_login\"),\n        {\"login\": user.username, \"password\": user_password},\n        HTTP_X_REQUESTED_WITH=\"XMLHttpRequest\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = json.loads(resp.content.decode(\"utf8\"))\n    assert data[\"location\"] == \"/accounts/profile/\"\n"
  },
  {
    "path": "tests/apps/account/test_auth_backends.py",
    "content": "from unittest.mock import patch\n\nfrom django.contrib.auth import get_user_model\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\n\nimport pytest\n\nfrom allauth.account import app_settings\nfrom allauth.account.auth_backends import AuthenticationBackend\n\n\nclass AuthenticationBackendTests(TestCase):\n    def setUp(self):\n        user = get_user_model().objects.create(\n            is_active=True, email=\"john@example.com\", username=\"john\"\n        )\n        user.set_password(user.username)\n        user.save()\n        self.user = user\n\n    @override_settings(\n        ACCOUNT_LOGIN_METHODS={app_settings.LoginMethod.USERNAME}\n    )  # noqa\n    def test_auth_by_username(self):\n        user = self.user\n        backend = AuthenticationBackend()\n        self.assertEqual(\n            backend.authenticate(\n                request=None, username=user.username, password=user.username\n            ).pk,\n            user.pk,\n        )\n        self.assertEqual(\n            backend.authenticate(\n                request=None, username=user.email, password=user.username\n            ),\n            None,\n        )\n\n    @override_settings(ACCOUNT_LOGIN_METHODS={app_settings.LoginMethod.EMAIL})  # noqa\n    def test_auth_by_email(self):\n        user = self.user\n        backend = AuthenticationBackend()\n        self.assertEqual(\n            backend.authenticate(\n                request=None, username=user.email, password=user.username\n            ).pk,\n            user.pk,\n        )\n        self.assertEqual(\n            backend.authenticate(\n                request=None, username=user.username, password=user.username\n            ),\n            None,\n        )\n\n    @override_settings(\n        ACCOUNT_LOGIN_METHODS={\n            app_settings.LoginMethod.EMAIL,\n            app_settings.LoginMethod.USERNAME,\n        }\n    )  # noqa\n    def test_auth_by_username_or_email(self):\n        user = self.user\n        backend = AuthenticationBackend()\n        self.assertEqual(\n            backend.authenticate(\n                request=None, username=user.email, password=user.username\n            ).pk,\n            user.pk,\n        )\n        self.assertEqual(\n            backend.authenticate(\n                request=None, username=user.username, password=user.username\n            ).pk,\n            user.pk,\n        )\n\n\n@pytest.mark.parametrize(\n    \"login_methods\",\n    [\n        {app_settings.LoginMethod.EMAIL},\n        {app_settings.LoginMethod.USERNAME},\n        {app_settings.LoginMethod.USERNAME, app_settings.LoginMethod.EMAIL},\n    ],\n)\ndef test_account_enumeration_timing_attack(user, db, rf, settings, login_methods):\n    settings.ACCOUNT_LOGIN_METHODS = login_methods\n    with patch(\"django.contrib.auth.models.User.set_password\") as set_password_mock:\n        with patch(\n            \"django.contrib.auth.models.User.check_password\", new=set_password_mock\n        ):\n            backend = AuthenticationBackend()\n            backend.authenticate(\n                rf.get(\"/\"),\n                email=\"not@known.org\",\n                username=\"not-known\",\n                password=\"secret\",\n            )\n            set_password_mock.assert_called_once()\n            set_password_mock.reset_mock()\n            backend.authenticate(rf.get(\"/\"), username=user.username, password=\"secret\")\n            set_password_mock.assert_called_once()\n            set_password_mock.reset_mock()\n            backend.authenticate(\n                rf.get(\"/\"), email=user.email, username=\"not-known\", password=\"secret\"\n            )\n            set_password_mock.assert_called_once()\n"
  },
  {
    "path": "tests/apps/account/test_change_email.py",
    "content": "import json\nfrom http import HTTPStatus\nfrom unittest.mock import patch\n\nfrom django.contrib.auth import get_user_model\nfrom django.urls import reverse\n\nimport pytest\nfrom pytest_django.asserts import assertTemplateNotUsed, assertTemplateUsed\n\nfrom allauth.account.app_settings import LoginMethod\nfrom allauth.account.models import EmailAddress, EmailConfirmationHMAC\nfrom allauth.account.utils import user_email\n\n\ndef test_ajax_get(auth_client, user):\n    primary = EmailAddress.objects.filter(user=user).first()\n    secondary = EmailAddress.objects.create(\n        email=\"secondary@email.org\", user=user, verified=False, primary=False\n    )\n    resp = auth_client.get(\n        reverse(\"account_email\"), HTTP_X_REQUESTED_WITH=\"XMLHttpRequest\"\n    )\n    data = json.loads(resp.content.decode(\"utf8\"))\n    assert data[\"data\"] == [\n        {\n            \"id\": primary.pk,\n            \"email\": primary.email,\n            \"primary\": True,\n            \"verified\": True,\n        },\n        {\n            \"id\": secondary.pk,\n            \"email\": secondary.email,\n            \"primary\": False,\n            \"verified\": False,\n        },\n    ]\n\n\ndef test_ajax_add(auth_client):\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_add\": \"\", \"email\": \"john3@example.org\"},\n        HTTP_X_REQUESTED_WITH=\"XMLHttpRequest\",\n    )\n    data = json.loads(resp.content.decode(\"utf8\"))\n    assert data[\"location\"] == reverse(\"account_email\")\n\n\ndef test_ajax_add_invalid(auth_client):\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_add\": \"\", \"email\": \"john3#example.org\"},\n        HTTP_X_REQUESTED_WITH=\"XMLHttpRequest\",\n    )\n    data = json.loads(resp.content.decode(\"utf8\"))\n    assert \"valid\" in data[\"form\"][\"fields\"][\"email\"][\"errors\"][0]\n\n\ndef test_ajax_remove_primary(auth_client, user, settings):\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_remove\": \"\", \"email\": user.email},\n        HTTP_X_REQUESTED_WITH=\"XMLHttpRequest\",\n    )\n    assertTemplateUsed(resp, \"account/messages/cannot_delete_primary_email.txt\")\n    data = json.loads(resp.content.decode(\"utf8\"))\n    assert data[\"location\"] == reverse(\"account_email\")\n\n\ndef test_remove_secondary(auth_client, user, settings, mailoutbox):\n    settings.ACCOUNT_EMAIL_NOTIFICATIONS = True\n\n    secondary = EmailAddress.objects.create(\n        email=\"secondary@email.org\", user=user, verified=False, primary=False\n    )\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_remove\": \"\", \"email\": secondary.email},\n    )\n\n    assert not EmailAddress.objects.filter(pk=secondary.pk).exists()\n    assertTemplateUsed(resp, \"account/messages/email_deleted.txt\")\n    assert len(mailoutbox) == 1\n    assert f\"{secondary.email} has been removed\" in mailoutbox[0].body\n\n\ndef test_set_primary_unverified(auth_client, user):\n    secondary = EmailAddress.objects.create(\n        email=\"secondary@email.org\", user=user, verified=False, primary=False\n    )\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_primary\": \"\", \"email\": secondary.email},\n    )\n    primary = EmailAddress.objects.get(email=user.email)\n    secondary.refresh_from_db()\n    assert not secondary.primary\n    assert primary.primary\n    assertTemplateUsed(resp, \"account/messages/unverified_primary_email.txt\")\n\n\ndef test_set_primary(auth_client, user):\n    primary = EmailAddress.objects.get(email=user.email)\n    secondary = EmailAddress.objects.create(\n        email=\"secondary@email.org\", user=user, verified=True, primary=False\n    )\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_primary\": \"\", \"email\": secondary.email},\n    )\n    primary.refresh_from_db()\n    secondary.refresh_from_db()\n    assert not primary.primary\n    assert secondary.primary\n    assertTemplateUsed(resp, \"account/messages/primary_email_set.txt\")\n\n\ndef test_verify(auth_client, user):\n    secondary = EmailAddress.objects.create(\n        email=\"secondary@email.org\", user=user, verified=False, primary=False\n    )\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_send\": \"\", \"email\": secondary.email},\n    )\n    assertTemplateUsed(resp, \"account/messages/email_confirmation_sent.txt\")\n\n\ndef test_verify_unknown_email(auth_client, user):\n    auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_send\": \"\", \"email\": \"email@unknown.org\"},\n    )\n    # This unknown email address must not be implicitly added.\n    assert EmailAddress.objects.filter(user=user).count() == 1\n\n\ndef test_add_with_two_limiter(auth_client, user, settings):\n    EmailAddress.objects.create(\n        email=\"secondary@email.org\", user=user, verified=False, primary=False\n    )\n    settings.ACCOUNT_MAX_EMAIL_ADDRESSES = 2\n    resp = auth_client.post(\n        reverse(\"account_email\"), {\"action_add\": \"\", \"email\": \"john3@example.org\"}\n    )\n    assertTemplateNotUsed(resp, \"account/messages/email_confirmation_sent.txt\")\n\n\ndef test_add_with_none_limiter(auth_client, settings):\n    settings.ACCOUNT_MAX_EMAIL_ADDRESSES = None\n    resp = auth_client.post(\n        reverse(\"account_email\"), {\"action_add\": \"\", \"email\": \"john3@example.org\"}\n    )\n    assertTemplateUsed(resp, \"account/messages/email_confirmation_sent.txt\")\n\n\ndef test_add_with_zero_limiter(auth_client, settings):\n    settings.ACCOUNT_MAX_EMAIL_ADDRESSES = 0\n    resp = auth_client.post(\n        reverse(\"account_email\"), {\"action_add\": \"\", \"email\": \"john3@example.org\"}\n    )\n    assertTemplateUsed(resp, \"account/messages/email_confirmation_sent.txt\")\n\n\n@pytest.mark.parametrize(\"has_email_field\", [True, False])\ndef test_set_email_as_primary_doesnt_override_existing_changes_on_the_user(\n    db, has_email_field, settings\n):\n    if not has_email_field:\n        settings.ACCOUNT_USER_MODEL_EMAIL_FIELD = None\n    user = get_user_model().objects.create(\n        username=\"@raymond.penners\", first_name=\"Before Update\"\n    )\n    email = EmailAddress.objects.create(\n        user=user,\n        email=\"raymond.penners@example.com\",\n        primary=True,\n        verified=True,\n    )\n    updated_first_name = \"Updated\"\n    get_user_model().objects.filter(id=user.id).update(first_name=updated_first_name)\n\n    email.set_as_primary()\n\n    user.refresh_from_db()\n    assert user.first_name == updated_first_name\n\n\ndef test_delete_email_changes_user_email(user_factory, client, email_factory):\n    user = user_factory(email_verified=False)\n    client.force_login(user)\n    first_email = EmailAddress.objects.get(user=user)\n    first_email.primary = False\n    first_email.save()\n    # other_unverified_email\n    EmailAddress.objects.create(\n        user=user, email=email_factory(), verified=False, primary=False\n    )\n    other_verified_email = EmailAddress.objects.create(\n        user=user, email=email_factory(), verified=True, primary=False\n    )\n    assert user_email(user) == first_email.email\n    resp = client.post(\n        reverse(\"account_email\"),\n        {\"action_remove\": \"\", \"email\": first_email.email},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    user.refresh_from_db()\n    assert user_email(user) == other_verified_email.email\n\n\ndef test_delete_email_wipes_user_email(user_factory, client):\n    user = user_factory(email_verified=False)\n    client.force_login(user)\n    first_email = EmailAddress.objects.get(user=user)\n    first_email.primary = False\n    first_email.save()\n    assert user_email(user) == first_email.email\n    resp = client.post(\n        reverse(\"account_email\"),\n        {\"action_remove\": \"\", \"email\": first_email.email},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    user.refresh_from_db()\n    assert user_email(user) == \"\"\n\n\ndef test_change_email(user_factory, client, settings, mailoutbox):\n    settings.ACCOUNT_CHANGE_EMAIL = True\n    settings.ACCOUNT_EMAIL_CONFIRMATION_HMAC = True\n    settings.ACCOUNT_EMAIL_NOTIFICATIONS = True\n\n    user = user_factory(email_verified=True)\n    client.force_login(user)\n    current_email = EmailAddress.objects.get(user=user)\n    resp = client.post(\n        reverse(\"account_email\"),\n        {\"action_add\": \"\", \"email\": \"change-to@this.org\"},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert len(mailoutbox) == 1\n    assert mailoutbox[0].subject == \"[example.com] Please Confirm Your Email Address\"\n    new_email = EmailAddress.objects.get(email=\"change-to@this.org\")\n    key = EmailConfirmationHMAC(new_email).key\n    with patch(\"allauth.account.signals.email_changed.send\") as email_changed_mock:\n        resp = client.post(reverse(\"account_confirm_email\", args=[key]))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert not EmailAddress.objects.filter(pk=current_email.pk).exists()\n    assert EmailAddress.objects.filter(user=user).count() == 1\n    new_email.refresh_from_db()\n    assert new_email.verified\n    assert new_email.primary\n    assert email_changed_mock.called\n    assert len(mailoutbox) == 2\n    assert mailoutbox[1].subject == \"[example.com] Email Changed\"\n    assert mailoutbox[1].to == [user.email]\n\n\ndef test_add(auth_client, user, settings):\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_add\": \"\", \"email\": \"john3@example.org\"},\n    )\n    EmailAddress.objects.get(\n        email=\"john3@example.org\",\n        user=user,\n        verified=False,\n        primary=False,\n    )\n    assertTemplateUsed(resp, \"account/messages/email_confirmation_sent.txt\")\n\n\ndef test_add_with_reauthentication(auth_client, user, user_password, settings):\n    settings.ACCOUNT_REAUTHENTICATION_REQUIRED = True\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_add\": \"\", \"email\": \"john3@example.org\"},\n    )\n    assert not EmailAddress.objects.filter(email=\"john3@example.org\").exists()\n    assert resp.status_code == HTTPStatus.FOUND\n    assert (\n        resp[\"location\"]\n        == f\"{reverse('account_reauthenticate')}?next=%2Faccounts%2Femail%2F\"\n    )\n    resp = auth_client.post(resp[\"location\"], {\"password\": user_password})\n    assert EmailAddress.objects.filter(email=\"john3@example.org\").exists()\n    assertTemplateUsed(resp, \"account/messages/email_confirmation_sent.txt\")\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_email\")\n\n\n@pytest.mark.parametrize(\n    \"prevent_enumeration\",\n    [\n        False,\n        True,\n        \"strict\",\n    ],\n)\ndef test_add_not_allowed(\n    auth_client, user, settings, user_factory, prevent_enumeration\n):\n    settings.ACCOUNT_PREVENT_ENUMERATION = prevent_enumeration\n    email = \"inuse@byotheruser.com\"\n    user_factory(email=email)\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_add\": \"\", \"email\": email},\n    )\n    if prevent_enumeration:\n        assert resp.status_code == HTTPStatus.FOUND\n        email_address = EmailAddress.objects.get(\n            email=email,\n            user=user,\n            verified=False,\n            primary=False,\n        )\n        assertTemplateUsed(resp, \"account/messages/email_confirmation_sent.txt\")\n        key = EmailConfirmationHMAC(email_address).key\n        resp = auth_client.post(reverse(\"account_confirm_email\", args=[key]))\n        assertTemplateUsed(resp, \"account/messages/email_confirmation_failed.txt\")\n        assert resp.status_code == HTTPStatus.FOUND\n        email_address.refresh_from_db()\n        assert not email_address.verified\n    else:\n        assert resp.status_code == HTTPStatus.OK\n        assert resp.context[\"form\"].errors == {\n            \"email\": [\"A user is already registered with this email address.\"]\n        }\n\n\n@pytest.mark.parametrize(\n    \"login_methods,primary_email,secondary_emails,delete_email,success\",\n    [\n        ({LoginMethod.EMAIL}, \"pri@ma.il\", [\"sec@ma.il\"], \"pri@ma.il\", False),\n        ({LoginMethod.EMAIL}, \"pri@ma.il\", [\"sec@ma.il\"], \"sec@ma.il\", True),\n        ({LoginMethod.EMAIL}, \"pri@ma.il\", [], \"pri@ma.il\", False),\n        ({LoginMethod.USERNAME}, \"pri@ma.il\", [\"sec@ma.il\"], \"pri@ma.il\", False),\n        ({LoginMethod.USERNAME}, \"pri@ma.il\", [\"sec@ma.il\"], \"sec@ma.il\", True),\n        ({LoginMethod.USERNAME}, \"pri@ma.il\", [], \"pri@ma.il\", True),\n        (\n            {LoginMethod.USERNAME, LoginMethod.EMAIL},\n            \"pri@ma.il\",\n            [\"sec@ma.il\"],\n            \"pri@ma.il\",\n            False,\n        ),\n        (\n            {LoginMethod.USERNAME, LoginMethod.EMAIL},\n            \"pri@ma.il\",\n            [\"sec@ma.il\"],\n            \"sec@ma.il\",\n            True,\n        ),\n        ({LoginMethod.USERNAME, LoginMethod.EMAIL}, \"pri@ma.il\", [], \"pri@ma.il\", True),\n    ],\n)\ndef test_remove_email(\n    client,\n    settings,\n    user_factory,\n    primary_email,\n    secondary_emails,\n    delete_email,\n    login_methods,\n    success,\n):\n    settings.ACCOUNT_LOGIN_METHODS = login_methods\n    user = user_factory(email=primary_email)\n    EmailAddress.objects.bulk_create(\n        [\n            EmailAddress(user=user, email=email, primary=False, verified=False)\n            for email in secondary_emails\n        ]\n    )\n    client.force_login(user)\n    resp = client.post(\n        reverse(\"account_email\"),\n        {\"action_remove\": \"\", \"email\": delete_email},\n    )\n    assert EmailAddress.objects.filter(email=delete_email).exists() == (not success)\n    if not success:\n        assertTemplateUsed(resp, \"account/messages/cannot_delete_primary_email.txt\")\n\n\n@pytest.mark.parametrize(\n    \"email,did_look_up\",\n    [\n        (\"valid@email.org\", True),\n        (\"not-an-email\", False),\n    ],\n)\ndef test_dont_lookup_invalid_email(auth_client, email, did_look_up):\n    with patch(\"allauth.account.views.EmailAddress.objects.get_for_user\") as gfu_mock:\n        gfu_mock.side_effect = EmailAddress.DoesNotExist\n        auth_client.post(\n            reverse(\"account_email\"),\n            {\"action_remove\": \"\", \"email\": email},\n        )\n        assert gfu_mock.called == did_look_up\n\n\ndef test_add_requires_reauthentication(settings, auth_client):\n    settings.ACCOUNT_REAUTHENTICATION_REQUIRED = True\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_add\": \"\", \"email\": \"john3@example.org\"},\n    )\n    assert not EmailAddress.objects.filter(email=\"john3@example.org\").exists()\n    assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n\n\ndef test_remove_requires_reauthentication(auth_client, user, settings):\n    settings.ACCOUNT_REAUTHENTICATION_REQUIRED = True\n    secondary = EmailAddress.objects.create(\n        email=\"secondary@email.org\", user=user, verified=False, primary=False\n    )\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_remove\": \"\", \"email\": secondary.email},\n    )\n    assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n    assert EmailAddress.objects.filter(pk=secondary.pk).exists()\n\n\ndef test_set_primary_requires_reauthentication(auth_client, user, settings):\n    settings.ACCOUNT_REAUTHENTICATION_REQUIRED = True\n    primary = EmailAddress.objects.get(email=user.email)\n    secondary = EmailAddress.objects.create(\n        email=\"secondary@email.org\", user=user, verified=True, primary=False\n    )\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_primary\": \"\", \"email\": secondary.email},\n    )\n    assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n    primary.refresh_from_db()\n    secondary.refresh_from_db()\n    assert primary.primary\n    assert not secondary.primary\n\n\ndef test_change_email_links_restrict_email(user_factory, client, settings, mailoutbox):\n    settings.ACCOUNT_CHANGE_EMAIL = True\n    settings.ACCOUNT_EMAIL_CONFIRMATION_HMAC = True\n    settings.ACCOUNT_EMAIL_NOTIFICATIONS = False\n\n    user = user_factory(email_verified=True)\n    client.force_login(user)\n\n    # Change the email...\n    resp = client.post(\n        reverse(\"account_email\"),\n        {\"action_add\": \"\", \"email\": \"change-to@this.org\"},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n\n    # Extract the verification link from the outbox.\n    assert len(mailoutbox) == 1\n    assert mailoutbox[-1].to[0] == \"change-to@this.org\"\n    assert mailoutbox[-1].subject == \"[example.com] Please Confirm Your Email Address\"\n    verify_link_1 = (\n        mailoutbox[-1].body[mailoutbox[-1].body.find(\"http://\") :].split()[0]\n    )\n\n    # Without verifying, change it once more.\n    resp = client.post(\n        reverse(\"account_email\"),\n        {\"action_add\": \"\", \"email\": \"change-to@that.org\"},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n\n    # And, extract the 2nd link.\n    assert len(mailoutbox) == 2\n    assert mailoutbox[-1].to[0] == \"change-to@that.org\"\n    assert mailoutbox[-1].subject == \"[example.com] Please Confirm Your Email Address\"\n    verify_link_2 = (\n        mailoutbox[-1].body[mailoutbox[-1].body.find(\"http://\") :].split()[0]\n    )\n\n    # Try and verify the first link. That should no longer be possible.\n    resp = client.post(verify_link_1)\n    assert resp.status_code == HTTPStatus.NOT_FOUND\n\n    # Confirm that the POST above had no effect.\n    assert EmailAddress.objects.filter(user=user).count() == 2\n    email_address = EmailAddress.objects.get(user=user, verified=True)\n    assert email_address.email == user.email\n    email_address = EmailAddress.objects.get(user=user, verified=False)\n    assert email_address.email == \"change-to@that.org\"\n\n    # Use the 2nd verification link\n    resp = client.post(verify_link_2)\n    assert resp.status_code == HTTPStatus.FOUND\n\n    # That one works.\n    assert EmailAddress.objects.filter(user=user).count() == 1\n    email_address = EmailAddress.objects.get(user=user)\n    assert email_address.verified\n    assert email_address.email == \"change-to@that.org\"\n\n\ndef test_change_unverified_email(user_factory, client, settings, mailoutbox):\n    settings.ACCOUNT_CHANGE_EMAIL = True\n    settings.ACCOUNT_EMAIL_CONFIRMATION_HMAC = True\n    settings.ACCOUNT_EMAIL_NOTIFICATIONS = True\n\n    user = user_factory(email_verified=False)\n    client.force_login(user)\n    current_email = EmailAddress.objects.get(user=user)\n    assert user.email == current_email.email\n    resp = client.post(\n        reverse(\"account_email\"),\n        {\"action_add\": \"\", \"email\": \"change-to@this.org\"},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert len(mailoutbox) == 1\n    assert not EmailAddress.objects.filter(pk=current_email.pk).exists()\n    user.refresh_from_db()\n    assert user.email == \"\"\n    assert mailoutbox[0].subject == \"[example.com] Please Confirm Your Email Address\"\n    new_email = EmailAddress.objects.get(email=\"change-to@this.org\")\n    key = EmailConfirmationHMAC(new_email).key\n    with patch(\"allauth.account.signals.email_changed.send\") as email_changed_mock:\n        resp = client.post(reverse(\"account_confirm_email\", args=[key]))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert not EmailAddress.objects.filter(pk=current_email.pk).exists()\n    assert EmailAddress.objects.filter(user=user).count() == 1\n    new_email.refresh_from_db()\n    assert new_email.verified\n    assert new_email.primary\n    assert email_changed_mock.called\n\n\ndef test_change_unverified_email_to_verified_email_of_other_user(\n    user_factory, client, settings, mailoutbox\n):\n    settings.ACCOUNT_CHANGE_EMAIL = True\n    settings.ACCOUNT_EMAIL_CONFIRMATION_HMAC = True\n    settings.ACCOUNT_EMAIL_NOTIFICATIONS = True\n\n    verified_user = user_factory(email_verified=True)\n\n    user = user_factory(email_verified=False)\n    client.force_login(user)\n    current_email = EmailAddress.objects.get(user=user)\n    assert user.email == current_email.email\n    resp = client.post(\n        reverse(\"account_email\"),\n        {\"action_add\": \"\", \"email\": verified_user.email},\n    )\n\n    assert resp.status_code == HTTPStatus.FOUND\n    assert len(mailoutbox) == 1\n    assert not EmailAddress.objects.filter(pk=current_email.pk).exists()\n    user.refresh_from_db()\n    assert user.email == \"\"\n    assert mailoutbox[0].subject == \"[example.com] Please Confirm Your Email Address\"\n    new_email = EmailAddress.objects.get(\n        user=user, verified=False, email=verified_user.email\n    )\n    key = EmailConfirmationHMAC(new_email).key\n    with patch(\"allauth.account.signals.email_changed.send\") as email_changed_mock:\n        resp = client.post(reverse(\"account_confirm_email\", args=[key]))\n    assert resp.status_code == HTTPStatus.FOUND\n\n    last_message = list(resp.context[\"messages\"])[-1]\n    assert last_message.message.startswith(\"Unable to confirm\")\n\n    assert EmailAddress.objects.filter(user=user).count() == 1\n    new_email.refresh_from_db()\n    assert not new_email.verified\n    assert not email_changed_mock.called\n"
  },
  {
    "path": "tests/apps/account/test_change_password.py",
    "content": "from http import HTTPStatus\n\nfrom django.urls import reverse, reverse_lazy\n\nimport pytest\n\n\ndef test_change_unusable_password_redirects_to_set(client, user, user_password):\n    user.set_unusable_password()\n    user.save()\n    client.force_login(user)\n    resp = client.get(reverse(\"account_change_password\"))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_set_password\")\n\n\ndef test_set_usable_password_redirects_to_change(auth_client, user):\n    resp = auth_client.get(reverse(\"account_set_password\"))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_change_password\")\n\n\n@pytest.mark.parametrize(\n    \"logout,next_url,redirect_chain\",\n    [\n        (False, \"\", [(reverse_lazy(\"account_change_password\"), HTTPStatus.FOUND)]),\n        (False, \"/foo\", [(\"/foo\", HTTPStatus.FOUND)]),\n        (\n            True,\n            \"\",\n            [\n                (reverse_lazy(\"account_change_password\"), HTTPStatus.FOUND),\n                (\n                    \"/accounts/login/?next=/accounts/password/change/\",\n                    HTTPStatus.FOUND,\n                ),\n            ],\n        ),\n        (True, \"/foo\", [(\"/foo\", HTTPStatus.FOUND)]),\n    ],\n)\ndef test_set_password(\n    client, user, next_url, password_factory, logout, settings, redirect_chain\n):\n    settings.ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE = logout\n    user.set_unusable_password()\n    user.save()\n    client.force_login(user)\n    password = password_factory()\n    data = {\"password1\": password, \"password2\": password}\n    if next_url:\n        data[\"next\"] = next_url\n    resp = client.post(\n        reverse(\"account_set_password\"),\n        data,\n        follow=True,\n    )\n    assert resp.redirect_chain == redirect_chain\n\n\n@pytest.mark.parametrize(\n    \"logout,next_url,redirect_chain\",\n    [\n        (False, \"\", [(reverse_lazy(\"account_change_password\"), HTTPStatus.FOUND)]),\n        (False, \"/foo\", [(\"/foo\", HTTPStatus.FOUND)]),\n        (\n            True,\n            \"\",\n            [\n                (reverse_lazy(\"account_change_password\"), HTTPStatus.FOUND),\n                (\n                    \"/accounts/login/?next=/accounts/password/change/\",\n                    HTTPStatus.FOUND,\n                ),\n            ],\n        ),\n        (True, \"/foo\", [(\"/foo\", HTTPStatus.FOUND)]),\n    ],\n)\ndef test_change_password(\n    auth_client,\n    user,\n    user_password,\n    next_url,\n    password_factory,\n    logout,\n    settings,\n    redirect_chain,\n    mailoutbox,\n):\n    settings.ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE = logout\n    settings.ACCOUNT_EMAIL_NOTIFICATIONS = True\n    password = password_factory()\n    data = {\"oldpassword\": user_password, \"password1\": password, \"password2\": password}\n    if next_url:\n        data[\"next\"] = next_url\n    resp = auth_client.post(\n        reverse(\"account_change_password\"),\n        data,\n        follow=True,\n    )\n    assert resp.redirect_chain == redirect_chain\n    assert len(mailoutbox) == 1\n    assert \"Your password has been changed\" in mailoutbox[0].body\n"
  },
  {
    "path": "tests/apps/account/test_commands.py",
    "content": "from django.core.management import call_command\n\n\ndef test_unset_multipleprimaryemails(db):\n    # This command needs to be dropped, in favor of having a conditional\n    # constraint.\n    call_command(\"account_unsetmultipleprimaryemails\")\n"
  },
  {
    "path": "tests/apps/account/test_decorators.py",
    "content": "from http import HTTPStatus\n\nfrom django.urls import reverse\n\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.account.decorators import verified_email_required\n\n\ndef test_verified_email_required(user_factory, request_factory):\n    user = user_factory(email_verified=False)\n\n    @verified_email_required\n    def view(request):\n        raise AssertionError()\n\n    request = request_factory.get(\"/\")\n    request.user = user\n    view(request)\n    assertTemplateUsed(\"account/verified_email_required.html\")\n\n\ndef test_secure_admin_login_skips_admin_login_next(client):\n    \"\"\"\n    Test that we're not using 'next=/admin/login%2Fnext=/foo'\n    \"\"\"\n    resp = client.get(f\"{reverse('admin:login')}?next=/foo\")\n    assert resp[\"location\"] == \"/accounts/login/?next=%2Ffoo\"\n\n\ndef test_secure_admin_login_denies_regular_users(auth_client):\n    resp = auth_client.get(reverse(\"admin:login\"))\n    assert resp.status_code == HTTPStatus.FORBIDDEN\n\n\ndef test_secure_admin_login_passes_staff(auth_client, user):\n    user.is_staff = True\n    user.is_superuser = True\n    user.save(update_fields=[\"is_staff\", \"is_superuser\"])\n    resp = auth_client.get(reverse(\"admin:auth_user_changelist\"))\n    assert resp.status_code == HTTPStatus.OK\n"
  },
  {
    "path": "tests/apps/account/test_email_verification.py",
    "content": "from datetime import timedelta\nfrom http import HTTPStatus\nfrom unittest.mock import Mock\n\nfrom django.contrib.auth import SESSION_KEY, get_user_model\nfrom django.core.cache import cache\nfrom django.urls import reverse\nfrom django.utils.timezone import now\n\nimport pytest\nfrom pytest_django.asserts import (\n    assertRedirects,\n    assertTemplateNotUsed,\n    assertTemplateUsed,\n)\n\nfrom allauth.account import app_settings\nfrom allauth.account.adapter import DefaultAccountAdapter\nfrom allauth.account.models import (\n    EmailAddress,\n    EmailConfirmation,\n    EmailConfirmationHMAC,\n)\nfrom allauth.account.signals import user_logged_in\n\n\nclass SignupRedirectEmailVerificationAdapter(DefaultAccountAdapter):\n    SIGNUP_REDIRECT_URL = \"/foobar\"\n\n    def get_signup_redirect_url(self, request):\n        return self.SIGNUP_REDIRECT_URL\n\n\n@pytest.mark.parametrize(\n    \"adapter,query,expected_location\",\n    [\n        (None, \"\", app_settings.SIGNUP_REDIRECT_URL),\n        (None, \"?next=/foo\", \"/foo\"),\n        (\n            \"tests.apps.account.test_email_verification.SignupRedirectEmailVerificationAdapter\",\n            \"\",\n            SignupRedirectEmailVerificationAdapter.SIGNUP_REDIRECT_URL,\n        ),\n    ],\n)\ndef test_login_on_verification(\n    adapter, client, db, query, expected_location, password_factory, settings\n):\n    settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.MANDATORY\n    settings.ACCOUNT_EMAIL_CONFIRMATION_HMAC = True\n    settings.ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = True\n    if adapter:\n        settings.ACCOUNT_ADAPTER = adapter\n    password = password_factory()\n    resp = client.post(\n        reverse(\"account_signup\"),\n        data={\n            \"username\": \"john\",\n            \"email\": \"a@a.com\",\n            \"password1\": password,\n            \"password2\": password,\n        },\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n\n    resp = client.get(resp[\"location\"])\n    assert resp.status_code == HTTPStatus.OK\n\n    email = EmailAddress.objects.get(email=\"a@a.com\")\n    key = EmailConfirmationHMAC(email).key\n\n    receiver_mock = Mock()  # we've logged if signal was called\n    user_logged_in.connect(receiver_mock)\n\n    resp = client.post(reverse(\"account_confirm_email\", args=[key]) + query)\n    assert resp[\"location\"] == expected_location\n    email = EmailAddress.objects.get(pk=email.pk)\n    assert email.verified\n\n    receiver_mock.assert_called_once_with(\n        sender=get_user_model(),\n        request=resp.wsgi_request,\n        response=resp,\n        user=email.user,\n        signal=user_logged_in,\n    )\n\n    user_logged_in.disconnect(receiver_mock)\n\n\ndef test_email_verification_failed(settings, user_factory, client):\n    settings.ACCOUNT_EMAIL_CONFIRMATION_HMAC = False\n    user_factory(email_verified=True, email=\"foo@bar.org\")\n    unverified_user = user_factory(email_verified=False, email=\"foo@bar.org\")\n    email_address = EmailAddress.objects.get_for_user(\n        unverified_user, unverified_user.email\n    )\n    assert not email_address.verified\n    confirmation = EmailConfirmation.objects.create(\n        email_address=email_address,\n        key=\"dummy\",\n        sent=now(),\n    )\n    resp = client.post(reverse(\"account_confirm_email\", args=[confirmation.key]))\n    assertTemplateUsed(resp, \"account/messages/email_confirmation_failed.txt\")\n\n\ndef test_email_verification_mandatory(settings, db, client, mailoutbox, enable_cache):\n    settings.ACCOUNT_EMAIL_CONFIRMATION_HMAC = False\n    settings.ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN = 10\n    settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.MANDATORY\n    # Signup\n    resp = client.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": \"john@example.com\",\n            \"password1\": \"johndoe\",\n            \"password2\": \"johndoe\",\n        },\n        follow=True,\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert mailoutbox[0].to == [\"john@example.com\"]\n    assert mailoutbox[0].body.find(\"http://\") > 0\n    assert len(mailoutbox) == 1\n    assertTemplateUsed(\n        resp,\n        f\"account/verification_sent.{app_settings.TEMPLATE_EXTENSION}\",\n    )\n    # Attempt to login, unverified\n    for attempt in [1, 2]:\n        resp = client.post(\n            reverse(\"account_login\"),\n            {\"login\": \"johndoe\", \"password\": \"johndoe\"},\n            follow=True,\n        )\n        # is_active is controlled by the admin to manually disable\n        # users. I don't want this flag to flip automatically whenever\n        # users verify their email addresses.\n        assert (\n            get_user_model().objects.filter(username=\"johndoe\", is_active=True).exists()\n        )\n\n        assertTemplateUsed(\n            resp,\n            f\"account/verification_sent.{app_settings.TEMPLATE_EXTENSION}\",\n        )\n        # Attempt 1: no mail is sent due to cool-down ,\n        # but there was already a mail in the outbox.\n        assert len(mailoutbox) == attempt\n        assert (\n            EmailConfirmation.objects.filter(\n                email_address__email=\"john@example.com\"\n            ).count()\n            == attempt\n        )\n        # Wait for cooldown -- wipe cache (incl. rate limits)\n        cache.clear()\n        # if we don't wipe the session, login will redirect to pending stage...\n        client.logout()\n\n    # Verify, and re-attempt to login.\n    confirmation = EmailConfirmation.objects.filter(\n        email_address__user__username=\"johndoe\"\n    )[:1].get()\n    resp = client.get(reverse(\"account_confirm_email\", args=[confirmation.key]))\n    assertTemplateUsed(resp, f\"account/email_confirm.{app_settings.TEMPLATE_EXTENSION}\")\n    client.post(reverse(\"account_confirm_email\", args=[confirmation.key]))\n    resp = client.post(\n        reverse(\"account_login\"),\n        {\"login\": \"johndoe\", \"password\": \"johndoe\"},\n    )\n    assertRedirects(resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False)\n\n\ndef test_optional_email_verification(settings, client, db, mailoutbox):\n    settings.ACCOUNT_SIGNUP_REDIRECT_URL = \"/accounts/welcome/\"\n    settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.OPTIONAL\n    settings.ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE = False\n    # Signup\n    client.get(reverse(\"account_signup\"))\n    resp = client.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": \"john@example.com\",\n            \"password1\": \"johndoe\",\n        },\n    )\n    # Logged in\n    assertRedirects(\n        resp, settings.ACCOUNT_SIGNUP_REDIRECT_URL, fetch_redirect_response=False\n    )\n    assert mailoutbox[0].to == [\"john@example.com\"]\n    assert len(mailoutbox) == 1\n    # Logout & login again\n    client.logout()\n    # Wait for cooldown\n    EmailConfirmation.objects.update(sent=now() - timedelta(days=1))\n    # Signup\n    resp = client.post(\n        reverse(\"account_login\"),\n        {\"login\": \"johndoe\", \"password\": \"johndoe\"},\n    )\n    assertRedirects(resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False)\n    assert mailoutbox[0].to == [\"john@example.com\"]\n    # There was an issue that we sent out email confirmation mails\n    # on each login in case of optional verification. Make sure\n    # this is not the case:\n    assert len(mailoutbox) == 1\n\n\ndef test_email_verification_hmac(settings, client, user_factory, mailoutbox, rf):\n    settings.ACCOUNT_EMAIL_CONFIRMATION_HMAC = True\n    user = user_factory(email_verified=False)\n    email = EmailAddress.objects.get_for_user(user, user.email)\n    confirmation = EmailConfirmationHMAC(email)\n    request = rf.get(\"/\")\n    confirmation.send(request=request)\n    assert len(mailoutbox) == 1\n    client.post(reverse(\"account_confirm_email\", args=[confirmation.key]))\n    email = EmailAddress.objects.get(pk=email.pk)\n    assert email.verified\n\n\ndef test_email_verification_hmac_timeout(\n    settings, user_factory, client, mailoutbox, rf\n):\n    settings.ACCOUNT_EMAIL_CONFIRMATION_HMAC = True\n    settings.ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 0\n    user = user_factory(email_verified=False)\n    email = EmailAddress.objects.get_for_user(user, user.email)\n    confirmation = EmailConfirmationHMAC(email)\n    request = rf.get(\"/\")\n    confirmation.send(request=request)\n    assert len(mailoutbox) == 1\n    client.post(reverse(\"account_confirm_email\", args=[confirmation.key]))\n    email = EmailAddress.objects.get(pk=email.pk)\n    assert not email.verified\n\n\ndef test_verify_email_with_another_user_logged_in(\n    settings, user_factory, client, mailoutbox\n):\n    \"\"\"Test the email verification view. If User B clicks on an email\n    verification link while logged in as User A, ensure User A gets\n    logged out.\"\"\"\n    settings.ACCOUNT_LOGIN_METHODS = {app_settings.AuthenticationMethod.EMAIL}\n    user = user_factory(email_verified=False)\n    client.force_login(user)\n    client.post(reverse(\"account_email\"), {\"email\": user.email, \"action_send\": \"\"})\n    assert len(mailoutbox) == 1\n    assert mailoutbox[0].to == [user.email]\n    client.logout()\n    body = mailoutbox[0].body\n    assert body.find(\"http://\") > 0\n\n    user2 = user_factory(email_verified=False, password=\"doe\")\n    resp = client.post(\n        reverse(\"account_login\"),\n        {\n            \"login\": user2.email,\n            \"password\": \"doe\",\n        },\n    )\n    assert user2 == resp.context[\"user\"]\n\n    url = body[body.find(\"/accounts/confirm-email/\") :].split()[0]\n    resp = client.post(url)\n\n    assertTemplateUsed(resp, \"account/messages/logged_out.txt\")\n    assertTemplateUsed(resp, \"account/messages/email_confirmed.txt\")\n\n    assertRedirects(resp, settings.LOGIN_URL, fetch_redirect_response=False)\n\n\ndef test_verify_email_with_same_user_logged_in(\n    settings, user_factory, client, mailoutbox\n):\n    \"\"\"If the user clicks on an email verification link while logged in, ensure\n    the user stays logged in.\n    \"\"\"\n    settings.ACCOUNT_LOGIN_METHODS = {app_settings.AuthenticationMethod.EMAIL}\n    user = user_factory(email_verified=False)\n    client.force_login(user)\n    client.post(reverse(\"account_email\"), {\"email\": user.email, \"action_send\": \"\"})\n    assert len(mailoutbox) == 1\n    assert mailoutbox[0].to == [user.email]\n\n    body = mailoutbox[0].body\n    assert body.find(\"http://\") > 0\n\n    url = body[body.find(\"/accounts/confirm-email/\") :].split()[0]\n    resp = client.post(url)\n\n    assertTemplateNotUsed(resp, \"account/messages/logged_out.txt\")\n    assertTemplateUsed(resp, \"account/messages/email_confirmed.txt\")\n\n    assertRedirects(resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False)\n\n    assert user == resp.wsgi_request.user\n\n\ndef test_verify_logs_out_user(auth_client, settings, user, user_factory):\n    \"\"\"\n    When a user is signed in, and you follow an email confirmation link of\n    another user within the same browser/session, be sure to sign out the signed\n    in user.\n    \"\"\"\n    settings.ACCOUNT_CONFIRM_EMAIL_ON_GET = False\n    confirming_user = user_factory(email_verified=False)\n    assert auth_client.session[SESSION_KEY] == str(user.pk)\n    email = EmailAddress.objects.get(user=confirming_user, verified=False)\n    auth_client.get(\n        reverse(\n            \"account_confirm_email\", kwargs={\"key\": EmailConfirmationHMAC(email).key}\n        )\n    )\n    assert not auth_client.session.get(SESSION_KEY)\n\n\ndef test_email_verification_login_redirect(client, db, settings, password_factory):\n    settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.MANDATORY\n    password = password_factory()\n    resp = client.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": \"user@email.org\",\n            \"password1\": password,\n            \"password2\": password,\n        },\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n    resp = client.get(reverse(\"account_login\"))\n    assert resp.status_code == HTTPStatus.OK\n\n\ndef test_email_verification_redirect_url(client, db, settings, user_password):\n    settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.MANDATORY\n    settings.ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL = \"/foobar\"\n    settings.ACCOUNT_CONFIRM_EMAIL_ON_GET = True\n    email = \"user@email.org\"\n    resp = client.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": email,\n            \"password1\": user_password,\n            \"password2\": user_password,\n        },\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n    confirmation = EmailConfirmationHMAC(EmailAddress.objects.get(email=email))\n    resp = client.get(reverse(\"account_confirm_email\", args=[confirmation.key]))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == \"/foobar\"\n\n\ndef test_verified_email_decorator__unverified(auth_client):\n    EmailAddress.objects.all().update(verified=False)\n    resp = auth_client.get(reverse(\"tests_account_check_verified_email\"))\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"account/verified_email_required.html\")\n\n\ndef test_verified_email_decorator__verified(auth_client):\n    EmailAddress.objects.all().update(verified=True)\n    resp = auth_client.get(reverse(\"tests_account_check_verified_email\"))\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.content == b\"VERIFIED\"\n"
  },
  {
    "path": "tests/apps/account/test_email_verification_by_code.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import patch\n\nfrom django.conf import settings\nfrom django.contrib.auth import get_user_model\nfrom django.test import Client\nfrom django.urls import reverse\n\nimport pytest\n\nfrom allauth.account.models import EmailAddress\n\n\n@pytest.fixture(autouse=True)\ndef email_verification_settings(settings):\n    settings.ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.ACCOUNT_AUTHENTICATION_METHOD = \"email\"\n    return settings\n\n\n@pytest.mark.parametrize(\n    \"query,expected_url\",\n    [\n        (\"\", settings.LOGIN_REDIRECT_URL),\n        (\"?next=/foo\", \"/foo\"),\n    ],\n)\ndef test_signup(\n    client,\n    db,\n    settings,\n    password_factory,\n    get_last_email_verification_code,\n    query,\n    expected_url,\n    mailoutbox,\n):\n    password = password_factory()\n    resp = client.post(\n        reverse(\"account_signup\") + query,\n        {\n            \"username\": \"johndoe\",\n            \"email\": \"john@example.com\",\n            \"password1\": password,\n            \"password2\": password,\n        },\n    )\n    assert get_user_model().objects.filter(username=\"johndoe\").count() == 1\n    code = get_last_email_verification_code(client, mailoutbox)\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n    resp = client.get(reverse(\"account_email_verification_sent\"))\n    assert resp.status_code == HTTPStatus.OK\n    resp = client.post(reverse(\"account_email_verification_sent\"), data={\"code\": code})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == expected_url\n\n\ndef test_signup_prevent_enumeration(\n    client, db, settings, password_factory, user, mailoutbox\n):\n    password = password_factory()\n    resp = client.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": user.email,\n            \"password1\": password,\n            \"password2\": password,\n        },\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n    assert not get_user_model().objects.filter(username=\"johndoe\").exists()\n    assert mailoutbox[0].subject == \"[example.com] Account Already Exists\"\n    resp = client.get(reverse(\"account_email_verification_sent\"))\n    assert resp.status_code == HTTPStatus.OK\n    resp = client.post(reverse(\"account_email_verification_sent\"), data={\"code\": \"\"})\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.context[\"form\"].errors == {\"code\": [\"This field is required.\"]}\n    resp = client.post(reverse(\"account_email_verification_sent\"), data={\"code\": \"123\"})\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.context[\"form\"].errors == {\"code\": [\"Incorrect code.\"]}\n    # Max attempts\n    resp = client.post(reverse(\"account_email_verification_sent\"), data={\"code\": \"456\"})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_login\")\n\n\n@pytest.mark.parametrize(\"change_email\", (False, True))\ndef test_add_or_change_email(\n    auth_client,\n    user,\n    get_last_email_verification_code,\n    change_email,\n    settings,\n    mailoutbox,\n):\n    settings.ACCOUNT_CHANGE_EMAIL = change_email\n    settings.ACCOUNT_EMAIL_VERIFICATION_SUPPORTS_RESEND = True\n    email = \"additional@email.org\"\n    assert EmailAddress.objects.filter(user=user).count() == 1\n    with patch(\"allauth.account.signals.email_added\") as email_added_signal:\n        with patch(\"allauth.account.signals.email_changed\") as email_changed_signal:\n            resp = auth_client.post(\n                reverse(\"account_email\"), {\"action_add\": \"\", \"email\": email}\n            )\n            assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n            assert not email_added_signal.send.called\n            assert not email_changed_signal.send.called\n    assert EmailAddress.objects.filter(email=email).count() == 0\n    code = get_last_email_verification_code(auth_client, mailoutbox)\n    resp = auth_client.get(reverse(\"account_email_verification_sent\"))\n    assert resp.status_code == HTTPStatus.OK\n    resp = auth_client.post(\n        reverse(\"account_email_verification_sent\"), {\"action\": \"resend\"}\n    )\n    assert EmailAddress.objects.filter(email=email).count() == 0\n    assert resp.status_code == HTTPStatus.FOUND\n    code2 = get_last_email_verification_code(auth_client, mailoutbox)\n    assert code != code2\n    with patch(\"allauth.account.signals.email_added\") as email_added_signal:\n        with patch(\"allauth.account.signals.email_changed\") as email_changed_signal:\n            with patch(\n                \"allauth.account.signals.email_confirmed\"\n            ) as email_confirmed_signal:\n                resp = auth_client.post(\n                    reverse(\"account_email_verification_sent\"), data={\"code\": code2}\n                )\n                assert resp.status_code == HTTPStatus.FOUND\n                assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n                assert email_added_signal.send.called\n                assert email_confirmed_signal.send.called\n                assert email_changed_signal.send.called == change_email\n    assert EmailAddress.objects.filter(email=email, verified=True).count() == 1\n    assert EmailAddress.objects.filter(user=user).count() == (1 if change_email else 2)\n\n\ndef test_email_verification_login_redirect(\n    client, db, settings, password_factory, email_verification_settings\n):\n    password = password_factory()\n    resp = client.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": \"user@email.org\",\n            \"password1\": password,\n            \"password2\": password,\n        },\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n    resp = client.get(reverse(\"account_login\"))\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n\n\ndef test_email_verification_rate_limits(\n    db,\n    user_password,\n    email_verification_settings,\n    settings,\n    user_factory,\n    password_factory,\n    enable_cache,\n):\n    settings.ACCOUNT_RATE_LIMITS = {\"confirm_email\": \"1/m/key\"}\n    email = \"user@email.org\"\n    user_factory(email=email, email_verified=False, password=user_password)\n    for attempt in range(2):\n        resp = Client().post(\n            reverse(\"account_login\"),\n            {\n                \"login\": email,\n                \"password\": user_password,\n            },\n        )\n        if attempt == 0:\n            assert resp.status_code == HTTPStatus.FOUND\n            assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n        else:\n            assert resp.status_code == HTTPStatus.OK\n            assert resp.context[\"form\"].errors == {\n                \"__all__\": [\"Too many failed login attempts. Try again later.\"]\n            }\n\n\ndef test_change_email_vs_enumeration_prevention(\n    client,\n    db,\n    settings,\n    password_factory,\n    get_last_email_verification_code,\n    mailoutbox,\n    messagesoutbox,\n    user,\n):\n    settings.ACCOUNT_EMAIL_VERIFICATION_SUPPORTS_RESEND = True\n    password = password_factory()\n    resp = client.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": user.email,\n            \"password1\": password,\n            \"password2\": password,\n        },\n    )\n    # No user signed up.\n    assert get_user_model().objects.filter(username=\"johndoe\").count() == 0\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n    assert len(mailoutbox) == 1\n    assert mailoutbox[0].subject == \"[example.com] Account Already Exists\"\n    assert len(messagesoutbox) == 1\n    assert (\n        messagesoutbox[-1][\"message_template\"]\n        == \"account/messages/email_confirmation_sent.txt\"\n    )\n\n    # Resend\n    resp = client.post(reverse(\"account_email_verification_sent\"), {\"action\": \"resend\"})\n    assert len(mailoutbox) == 1\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n    # No new emails sent.\n    assert len(mailoutbox) == 1\n    # Yet, pretend we did.\n    assert len(messagesoutbox) == 2\n    assert (\n        messagesoutbox[-1][\"message_template\"]\n        == \"account/messages/email_confirmation_sent.txt\"\n    )\n\n\ndef test_change_to_already_existing_email(\n    client,\n    db,\n    settings,\n    password_factory,\n    get_last_email_verification_code,\n    mailoutbox,\n    messagesoutbox,\n    user,\n):\n    settings.ACCOUNT_EMAIL_VERIFICATION_SUPPORTS_RESEND = True\n    settings.ACCOUNT_EMAIL_VERIFICATION_SUPPORTS_CHANGE = True\n    password = password_factory()\n    resp = client.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": \"new@user.org\",\n            \"password1\": password,\n            \"password2\": password,\n        },\n    )\n    # A user signed up.\n    new_user = get_user_model().objects.get(username=\"johndoe\")\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n    assert len(mailoutbox) == 1\n    assert mailoutbox[0].subject == \"[example.com] Please Confirm Your Email Address\"\n    assert len(messagesoutbox) == 1\n    assert (\n        messagesoutbox[-1][\"message_template\"]\n        == \"account/messages/email_confirmation_sent.txt\"\n    )\n\n    # Change to a conflicting email\n    resp = client.post(\n        reverse(\"account_email_verification_sent\"),\n        {\"action\": \"change\", \"email\": user.email},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n    assert len(mailoutbox) == 2\n    assert mailoutbox[1].subject == \"[example.com] Account Already Exists\"\n    assert len(messagesoutbox) == 2\n    assert (\n        messagesoutbox[-1][\"message_template\"]\n        == \"account/messages/email_confirmation_sent.txt\"\n    )\n    new_user.refresh_from_db()\n    assert new_user.email == \"new@user.org\"\n\n    # Change back to new email\n    resp = client.post(\n        reverse(\"account_email_verification_sent\"),\n        {\"action\": \"change\", \"email\": \"new2@user.org\"},\n    )\n    assert len(mailoutbox) == 3\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n    assert mailoutbox[2].subject == \"[example.com] Please Confirm Your Email Address\"\n    assert len(messagesoutbox) == 3\n    assert (\n        messagesoutbox[-1][\"message_template\"]\n        == \"account/messages/email_confirmation_sent.txt\"\n    )\n    new_user.refresh_from_db()\n    assert new_user.email == \"new2@user.org\"\n\n    code = get_last_email_verification_code(client, mailoutbox)\n    resp = client.post(reverse(\"account_email_verification_sent\"), data={\"code\": code})\n    assert resp.status_code == HTTPStatus.FOUND\n    email_address = EmailAddress.objects.filter(user=new_user).get()\n    assert email_address.verified\n    assert email_address.email == \"new2@user.org\"\n\n\ndef test_verified_email_decorator__unverified(\n    auth_client, mailoutbox, get_last_email_verification_code\n):\n    EmailAddress.objects.all().update(verified=False)\n    resp = auth_client.get(reverse(\"tests_account_check_verified_email\"))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"].startswith(reverse(\"account_email_verification_sent\"))\n    code = get_last_email_verification_code(auth_client, mailoutbox)\n    resp = auth_client.post(\n        reverse(\"account_email_verification_sent\"),\n        data={\"code\": code, \"next\": reverse(\"tests_account_check_verified_email\")},\n        follow=True,\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.content == b\"VERIFIED\"\n"
  },
  {
    "path": "tests/apps/account/test_login.py",
    "content": "import json\nfrom http import HTTPStatus\nfrom unittest.mock import ANY, patch\n\nfrom django.conf import settings\nfrom django.contrib.auth import get_user_model\nfrom django.core import mail\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\nfrom django.urls import NoReverseMatch, reverse\n\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.account import app_settings\nfrom allauth.account.authentication import AUTHENTICATION_METHODS_SESSION_KEY\nfrom allauth.account.forms import LoginForm\nfrom allauth.account.models import EmailAddress\n\n\n@override_settings(\n    ACCOUNT_DEFAULT_HTTP_PROTOCOL=\"https\",\n    ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY,\n    ACCOUNT_LOGIN_METHODS={app_settings.AuthenticationMethod.USERNAME},\n    ACCOUNT_SIGNUP_FORM_CLASS=None,\n    ACCOUNT_EMAIL_SUBJECT_PREFIX=None,\n    LOGIN_REDIRECT_URL=\"/accounts/profile/\",\n    ACCOUNT_SIGNUP_REDIRECT_URL=\"/accounts/welcome/\",\n    ACCOUNT_ADAPTER=\"allauth.account.adapter.DefaultAccountAdapter\",\n    ACCOUNT_USERNAME_REQUIRED=True,\n)\nclass LoginTests(TestCase):\n    @override_settings(\n        ACCOUNT_LOGIN_METHODS={\n            app_settings.LoginMethod.USERNAME,\n            app_settings.LoginMethod.EMAIL,\n        }\n    )\n    def test_username_containing_at(self):\n        user = get_user_model().objects.create(username=\"@raymond.penners\")\n        user.set_password(\"psst\")\n        user.save()\n        EmailAddress.objects.create(\n            user=user,\n            email=\"raymond.penners@example.com\",\n            primary=True,\n            verified=True,\n        )\n        resp = self.client.post(\n            reverse(\"account_login\"),\n            {\"login\": \"@raymond.penners\", \"password\": \"psst\"},\n        )\n        self.assertRedirects(\n            resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False\n        )\n        self.assertEqual(\n            self.client.session[AUTHENTICATION_METHODS_SESSION_KEY],\n            [\n                {\n                    \"at\": ANY,\n                    \"username\": \"@raymond.penners\",\n                    \"method\": \"password\",\n                }\n            ],\n        )\n\n    def _create_user(self, username=\"john\", password=\"doe\", **kwargs):\n        user = get_user_model().objects.create(\n            username=username, is_active=True, **kwargs\n        )\n        if password:\n            user.set_password(password)\n        else:\n            user.set_unusable_password()\n        user.save()\n        return user\n\n    def _create_user_and_login(self, usable_password=True):\n        password = \"doe\" if usable_password else False\n        user = self._create_user(password=password)\n        self.client.force_login(user)\n        return user\n\n    def test_redirect_when_authenticated(self):\n        self._create_user_and_login()\n        c = self.client\n        resp = c.get(reverse(\"account_login\"))\n        self.assertRedirects(resp, \"/accounts/profile/\", fetch_redirect_response=False)\n\n    def test_ajax_password_change(self):\n        self._create_user_and_login()\n        resp = self.client.post(\n            reverse(\"account_change_password\"),\n            data={\n                \"oldpassword\": \"doe\",\n                \"password1\": \"AbCdEf!123\",\n                \"password2\": \"AbCdEf!123456\",\n            },\n            HTTP_X_REQUESTED_WITH=\"XMLHttpRequest\",\n        )\n        self.assertEqual(resp[\"content-type\"], \"application/json\")\n        data = json.loads(resp.content.decode(\"utf8\"))\n        assert \"same password\" in data[\"form\"][\"fields\"][\"password2\"][\"errors\"][0]\n\n    @override_settings(\n        ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.OPTIONAL\n    )\n    def test_login_unverified_account_optional(self):\n        \"\"\"Tests login behavior when email verification is optional.\"\"\"\n        user = get_user_model().objects.create(username=\"john\")\n        user.set_password(\"doe\")\n        user.save()\n        EmailAddress.objects.create(\n            user=user, email=\"user@example.com\", primary=True, verified=False\n        )\n        resp = self.client.post(\n            reverse(\"account_login\"), {\"login\": \"john\", \"password\": \"doe\"}\n        )\n        self.assertRedirects(\n            resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False\n        )\n\n    @override_settings(\n        ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.OPTIONAL,\n        ACCOUNT_LOGIN_ATTEMPTS_LIMIT=3,\n        CACHES={\n            \"default\": {\n                \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n            }\n        },\n    )\n    def test_login_failed_attempts_exceeded(self):\n        user = get_user_model().objects.create(username=\"john\")\n        user.set_password(\"doe\")\n        user.save()\n        EmailAddress.objects.create(\n            user=user, email=\"user@example.com\", primary=True, verified=False\n        )\n        for i in range(5):\n            is_valid_attempt = i == 4\n            is_locked = i >= 3\n            resp = self.client.post(\n                reverse(\"account_login\"),\n                {\n                    \"login\": [\"john\", \"John\", \"JOHN\", \"JOhn\", \"joHN\"][i],\n                    \"password\": (\"doe\" if is_valid_attempt else \"wrong\"),\n                },\n            )\n            self.assertFormError(\n                resp.context[\"form\"],\n                None,\n                (\n                    \"Too many failed login attempts. Try again later.\"\n                    if is_locked\n                    else \"The username and/or password you specified are not correct.\"\n                ),\n            )\n\n    @override_settings(\n        ACCOUNT_LOGIN_METHODS={app_settings.LoginMethod.EMAIL},\n        ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY,\n        ACCOUNT_LOGIN_ATTEMPTS_LIMIT=1,\n        CACHES={\n            \"default\": {\n                \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n            }\n        },\n    )\n    def test_login_failed_attempts_exceeded_cleared_on_password_reset(self):\n        # Ensure that login attempts, once they hit the limit,\n        # can use the password reset mechanism to regain access.\n        user = get_user_model().objects.create(\n            username=\"john\", email=\"john@example.org\", is_active=True\n        )\n        user.set_password(\"doe\")\n        user.save()\n\n        EmailAddress.objects.create(\n            user=user, email=\"john@example.org\", primary=True, verified=True\n        )\n\n        resp = self.client.post(\n            reverse(\"account_login\"), {\"login\": user.email, \"password\": \"bad\"}\n        )\n        self.assertFormError(\n            resp.context[\"form\"],\n            None,\n            \"The email address and/or password you specified are not correct.\",\n        )\n        resp = self.client.post(\n            reverse(\"account_login\"), {\"login\": user.email, \"password\": \"bad\"}\n        )\n        self.assertFormError(\n            resp.context[\"form\"],\n            None,\n            \"Too many failed login attempts. Try again later.\",\n        )\n        self.client.post(reverse(\"account_reset_password\"), data={\"email\": user.email})\n\n        body = mail.outbox[0].body\n        self.assertGreater(body.find(\"https://\"), 0)\n\n        # Extract URL for `password_reset_from_key` view and access it\n        url = body[body.find(\"/accounts/password/reset/\") :].split()[0]\n        resp = self.client.get(url)\n        # Follow the redirect the actual password reset page with the key\n        # hidden.\n        url = resp.url\n        resp = self.client.get(url)\n        self.assertTemplateUsed(\n            resp,\n            f\"account/password_reset_from_key.{app_settings.TEMPLATE_EXTENSION}\",\n        )\n        self.assertFalse(\"token_fail\" in resp.context_data)\n\n        new_password = \"newpass123\"\n\n        # Reset the password\n        resp = self.client.post(\n            url, {\"password1\": new_password, \"password2\": new_password}\n        )\n        self.assertRedirects(resp, reverse(\"account_reset_password_from_key_done\"))\n\n        # Check the new password is in effect\n        user = get_user_model().objects.get(pk=user.pk)\n        self.assertTrue(user.check_password(new_password))\n\n        resp = self.client.post(\n            reverse(\"account_login\"),\n            {\"login\": user.email, \"password\": new_password},\n        )\n\n        self.assertRedirects(\n            resp, settings.LOGIN_REDIRECT_URL, fetch_redirect_response=False\n        )\n\n    @override_settings(\n        ACCOUNT_LOGIN_METHODS={app_settings.LoginMethod.EMAIL},\n        ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY,\n        ACCOUNT_LOGIN_ATTEMPTS_LIMIT=1,\n    )\n    def test_login_using_unverified_email_address_is_prohibited(self):\n        user = get_user_model().objects.create(\n            username=\"john\", email=\"john@example.org\", is_active=True\n        )\n        user.set_password(\"doe\")\n        user.save()\n\n        EmailAddress.objects.create(\n            user=user, email=\"john@example.org\", primary=True, verified=True\n        )\n        EmailAddress.objects.create(\n            user=user, email=\"john@example.com\", primary=False, verified=False\n        )\n\n        resp = self.client.post(\n            reverse(\"account_login\"), {\"login\": \"john@example.com\", \"password\": \"doe\"}\n        )\n        self.assertRedirects(\n            resp,\n            reverse(\"account_email_verification_sent\"),\n            fetch_redirect_response=False,\n        )\n        self.assertEqual(len(mail.outbox), 1)\n        assert mail.outbox[0].to == [\"john@example.com\"]\n\n    def test_login_unverified_account_mandatory(self):\n        \"\"\"Tests login behavior when email verification is mandatory.\"\"\"\n        user = get_user_model().objects.create(username=\"john\")\n        user.set_password(\"doe\")\n        user.save()\n        EmailAddress.objects.create(\n            user=user, email=\"user@example.com\", primary=True, verified=False\n        )\n        resp = self.client.post(\n            reverse(\"account_login\"), {\"login\": \"john\", \"password\": \"doe\"}\n        )\n        self.assertRedirects(resp, reverse(\"account_email_verification_sent\"))\n\n    def test_login_inactive_account(self):\n        \"\"\"\n        Tests login behavior with inactive accounts.\n\n        Inactive user accounts should be prevented from performing any actions,\n        regardless of their verified state.\n        \"\"\"\n        # Inactive and verified user account\n        user = get_user_model().objects.create(username=\"john\", is_active=False)\n        user.set_password(\"doe\")\n        user.save()\n        EmailAddress.objects.create(\n            user=user, email=\"john@example.com\", primary=True, verified=True\n        )\n        resp = self.client.post(\n            reverse(\"account_login\"), {\"login\": \"john\", \"password\": \"doe\"}\n        )\n        self.assertRedirects(resp, reverse(\"account_inactive\"))\n\n        # Inactive and unverified user account\n        user = get_user_model().objects.create(username=\"doe\", is_active=False)\n        user.set_password(\"john\")\n        user.save()\n        EmailAddress.objects.create(\n            user=user, email=\"user@example.com\", primary=True, verified=False\n        )\n        resp = self.client.post(\n            reverse(\"account_login\"), {\"login\": \"doe\", \"password\": \"john\"}\n        )\n        self.assertRedirects(resp, reverse(\"account_inactive\"))\n\n    @override_settings(ACCOUNT_AUTHENTICATED_LOGIN_REDIRECTS=False)\n    def test_account_authenticated_login_redirects_is_false(self):\n        self._create_user_and_login()\n        resp = self.client.get(reverse(\"account_login\"))\n        self.assertEqual(resp.status_code, HTTPStatus.OK)\n\n\ndef test_login_password_forgotten_link_not_present(client, db):\n    with patch(\"allauth.account.forms.reverse\") as reverse_mock:\n        reverse_mock.side_effect = NoReverseMatch\n        form = LoginForm()\n        assert form.fields[\"password\"].help_text == \"\"\n\n\ndef test_login_password_forgotten_link_present(client, db):\n    form = LoginForm()\n    assert (\n        form.fields[\"password\"].help_text\n        == '<a href=\"/accounts/password/reset/\">Forgot your password?</a>'\n    )\n\n\ndef test_login_while_authenticated(settings, client, user_factory):\n    settings.ACCOUNT_AUTHENTICATED_LOGIN_REDIRECTS = False\n    user_factory(username=\"john\", email=\"john@example.org\", password=\"doe\")\n    user_factory(username=\"jane\", email=\"jane@example.org\", password=\"doe\")\n    redirect_url = settings.LOGIN_REDIRECT_URL\n\n    resp = client.post(reverse(\"account_login\"), {\"login\": \"john\", \"password\": \"doe\"})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == redirect_url\n    resp = client.post(reverse(\"account_login\"), {\"login\": \"jane\", \"password\": \"doe\"})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == redirect_url\n\n\ndef test_login_page(client, db):\n    resp = client.get(reverse(\"account_login\"))\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"account/login.html\")\n"
  },
  {
    "path": "tests/apps/account/test_login_by_code.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY\n\nfrom django.urls import reverse\n\nimport pytest\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.account.authentication import AUTHENTICATION_METHODS_SESSION_KEY\nfrom allauth.account.internal.stagekit import LOGIN_SESSION_KEY\nfrom allauth.account.models import EmailAddress\nfrom allauth.account.stages import LoginByCodeStage\n\n\n@pytest.fixture\ndef get_expected_login_code():\n    def f(client):\n        return client.session[LOGIN_SESSION_KEY][\"state\"][\"stages\"][\n            LoginByCodeStage.key\n        ][\"data\"][\"code\"]\n\n    return f\n\n\n@pytest.fixture\ndef request_login_by_code(mailoutbox, get_expected_login_code):\n    def f(client, email):\n        resp = client.get(f\"{reverse('account_request_login_code')}?next=/foo\")\n        assert resp.status_code == HTTPStatus.OK\n        assert b'value=\"/foo\"' in resp.content\n        resp = client.post(\n            reverse(\"account_request_login_code\"), data={\"email\": email, \"next\": \"/foo\"}\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n        assert (\n            resp[\"location\"] == f\"{reverse('account_confirm_login_code')}?next=%2Ffoo\"\n        )\n        assert len(mailoutbox) == 1\n        code = get_expected_login_code(client)\n        assert len(code) == 9\n        assert code in mailoutbox[0].body\n        return code\n\n    return f\n\n\ndef test_login_by_code(client, user, request_login_by_code):\n    code = request_login_by_code(client, user.email)\n    code_with_ws = f\" {code[0:3]} {code[3:]}\"\n    resp = client.post(\n        reverse(\"account_confirm_login_code\"),\n        data={\"code\": code_with_ws, \"next\": \"/foo\"},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert LOGIN_SESSION_KEY not in client.session\n    assert resp[\"location\"] == \"/foo\"\n    assert client.session[AUTHENTICATION_METHODS_SESSION_KEY][-1] == {\n        \"method\": \"code\",\n        \"email\": user.email,\n        \"at\": ANY,\n    }\n\n\ndef test_login_by_code_resend_limited(\n    client, user, request_login_by_code, settings, get_expected_login_code\n):\n    settings.ACCOUNT_LOGIN_BY_CODE_SUPPORTS_RESEND = 2\n    code = request_login_by_code(client, user.email)\n    for i in range(3):\n        resp = client.post(\n            reverse(\"account_confirm_login_code\"), data={\"action\": \"resend\"}\n        )\n\n        assert resp.status_code == (\n            # Form error if resend not possible\n            HTTPStatus.OK\n            if i == 2\n            # If resend allowed, the resend form is valid and results in a redirect.\n            else HTTPStatus.FOUND\n        )\n        new_code = get_expected_login_code(client)\n        if i == 2:\n            assert new_code == code\n        else:\n            assert new_code != code\n            code = new_code\n\n\ndef test_login_by_code_resend_uses_new_code(\n    client, user, request_login_by_code, settings, get_expected_login_code\n):\n    settings.ACCOUNT_LOGIN_BY_CODE_SUPPORTS_RESEND = 2\n    code = request_login_by_code(client, user.email)\n    resp = client.post(reverse(\"account_confirm_login_code\"), data={\"action\": \"resend\"})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_confirm_login_code\")\n    new_code = get_expected_login_code(client)\n    assert new_code != code\n    resp = client.post(reverse(\"account_confirm_login_code\"), data={\"code\": new_code})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n\n\ndef test_login_by_code_max_attempts(client, user, request_login_by_code, settings):\n    settings.ACCOUNT_LOGIN_BY_CODE_MAX_ATTEMPTS = 2\n    request_login_by_code(client, user.email)\n    for i in range(3):\n        resp = client.post(\n            reverse(\"account_confirm_login_code\"), data={\"code\": \"wrong\"}\n        )\n        if i >= 1:\n            assert resp.status_code == HTTPStatus.FOUND\n            assert resp[\"location\"] == reverse(\"account_request_login_code\")\n            assert LOGIN_SESSION_KEY not in client.session\n        else:\n            assert resp.status_code == HTTPStatus.OK\n            assert LOGIN_SESSION_KEY in client.session\n            assert resp.context[\"form\"].errors == {\"code\": [\"Incorrect code.\"]}\n\n\ndef test_login_by_code_unknown_user(mailoutbox, client, db):\n    resp = client.post(\n        reverse(\"account_request_login_code\"),\n        data={\"email\": \"unknown@email.org\"},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_confirm_login_code\")\n    resp = client.post(reverse(\"account_confirm_login_code\"), data={\"code\": \"123456\"})\n\n\n@pytest.mark.parametrize(\n    \"setting,code_required\",\n    [\n        (True, True),\n        ({\"password\"}, True),\n        ({\"socialaccount\"}, False),\n    ],\n)\ndef test_login_by_code_required(\n    client, settings, user_factory, password_factory, setting, code_required\n):\n    password = password_factory()\n    user = user_factory(password=password, email_verified=False)\n    email_address = EmailAddress.objects.get(email=user.email)\n    assert not email_address.verified\n    settings.ACCOUNT_LOGIN_BY_CODE_REQUIRED = setting\n    resp = client.post(\n        reverse(\"account_login\"),\n        data={\"login\": user.username, \"password\": password},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    if code_required:\n        assert resp[\"location\"] == reverse(\"account_confirm_login_code\")\n        code = client.session[LOGIN_SESSION_KEY][\"state\"][\"stages\"][\n            LoginByCodeStage.key\n        ][\"data\"][\"code\"]\n        resp = client.get(\n            reverse(\"account_confirm_login_code\"),\n            data={\"login\": user.username, \"password\": password},\n        )\n        assert resp.status_code == HTTPStatus.OK\n        resp = client.post(reverse(\"account_confirm_login_code\"), data={\"code\": code})\n        email_address.refresh_from_db()\n        assert email_address.verified\n    assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n\n\ndef test_login_by_code_redirect(client, user, request_login_by_code):\n    request_login_by_code(client, user.email)\n    resp = client.get(reverse(\"account_login\"))\n    assert resp[\"location\"] == reverse(\"account_confirm_login_code\")\n\n\n@pytest.mark.parametrize(\"action\", [\"\", \"trust\"])\ndef test_trust_flow(\n    client,\n    user,\n    user_password,\n    settings_impacting_urls,\n    action,\n    settings,\n):\n    if not allauth_settings.MFA_ENABLED:\n        return\n\n    with settings_impacting_urls(\n        ACCOUNT_LOGIN_BY_CODE_TRUST_ENABLED=True, ACCOUNT_LOGIN_BY_CODE_REQUIRED=True\n    ):\n\n        # Login\n        resp = client.post(\n            reverse(\"account_login\"),\n            {\"login\": user.username, \"password\": user_password},\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n        assert resp[\"location\"] == reverse(\"account_confirm_login_code\")\n\n        code = client.session[LOGIN_SESSION_KEY][\"state\"][\"stages\"][\n            LoginByCodeStage.key\n        ][\"data\"][\"code\"]\n\n        # Enter code\n        resp = client.post(reverse(\"account_confirm_login_code\"), data={\"code\": code})\n        assert resp.status_code == HTTPStatus.FOUND\n        assert resp[\"location\"] == reverse(\"mfa_trust\")\n\n        # Indicate trust\n        resp = client.post(\n            reverse(\"mfa_trust\"),\n            {\"action\": action},\n        )\n        assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n\n        # Sign out\n        resp = client.post(\n            reverse(\"account_logout\"),\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n\n        # Sign in\n        resp = client.post(\n            reverse(\"account_login\"),\n            {\"login\": user.username, \"password\": user_password},\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n        assert resp[\"location\"] == (\n            settings.LOGIN_REDIRECT_URL\n            if action == \"trust\"\n            else reverse(\"account_confirm_login_code\")\n        )\n\n\ndef test_trust_while_already_register(\n    client, user, user_password, settings_impacting_urls, settings, mailoutbox\n):\n    if not allauth_settings.MFA_ENABLED:\n        return\n\n    with settings_impacting_urls(\n        ACCOUNT_SIGNUP_FIELDS=[\"email*\", \"password*\"],\n        ACCOUNT_LOGIN_BY_CODE_TRUST_ENABLED=True,\n        ACCOUNT_LOGIN_BY_CODE_REQUIRED=True,\n        ACCOUNT_PREVENT_ENUMERATION=True,\n        ACCOUNT_EMAIL_VERIFICATION=\"mandatory\",\n    ):\n        resp = client.post(\n            reverse(\"account_signup\"),\n            {\"email\": user.email, \"password\": user_password},\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n        assert resp[\"location\"] == reverse(\"account_confirm_login_code\")\n        assert mailoutbox[0].subject == \"[example.com] Account Already Exists\"\n"
  },
  {
    "path": "tests/apps/account/test_logout.py",
    "content": "from django.contrib.auth import get_user_model\nfrom django.core import validators\nfrom django.test import TestCase\nfrom django.test.client import Client\nfrom django.test.utils import override_settings\nfrom django.urls import reverse\n\nfrom allauth.account import app_settings\nfrom allauth.account.signals import user_logged_out\nfrom tests.mocking import Mock\n\n\ntest_username_validators = [\n    validators.RegexValidator(regex=r\"^[a-c]+$\", message=\"not abc\")\n]\n\n\n@override_settings(\n    ACCOUNT_DEFAULT_HTTP_PROTOCOL=\"https\",\n    ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY,\n    ACCOUNT_LOGIN_METHODS={app_settings.LoginMethod.USERNAME},\n    ACCOUNT_SIGNUP_FORM_CLASS=None,\n    ACCOUNT_EMAIL_SUBJECT_PREFIX=None,\n    LOGIN_REDIRECT_URL=\"/accounts/profile/\",\n    ACCOUNT_SIGNUP_REDIRECT_URL=\"/accounts/welcome/\",\n    ACCOUNT_ADAPTER=\"allauth.account.adapter.DefaultAccountAdapter\",\n    ACCOUNT_USERNAME_REQUIRED=True,\n)\nclass LogoutTests(TestCase):\n    @override_settings(ACCOUNT_LOGOUT_ON_GET=True)\n    def test_logout_view_on_get(self):\n        c, resp = self._logout_view(\"get\")\n        self.assertTemplateUsed(resp, \"account/messages/logged_out.txt\")\n\n    @override_settings(ACCOUNT_LOGOUT_ON_GET=False)\n    def test_logout_view_on_post(self):\n        c, resp = self._logout_view(\"get\")\n        self.assertTemplateUsed(\n            resp, f\"account/logout.{app_settings.TEMPLATE_EXTENSION}\"\n        )\n\n        receiver_mock = Mock()\n        user_logged_out.connect(receiver_mock)\n\n        resp = c.post(reverse(\"account_logout\"))\n\n        self.assertTemplateUsed(resp, \"account/messages/logged_out.txt\")\n        receiver_mock.assert_called_once_with(\n            sender=get_user_model(),\n            request=resp.wsgi_request,\n            user=get_user_model().objects.get(username=\"john\"),\n            signal=user_logged_out,\n        )\n\n        user_logged_out.disconnect(receiver_mock)\n\n    def _logout_view(self, method):\n        c = Client()\n        user = get_user_model().objects.create(username=\"john\", is_active=True)\n        user.set_password(\"doe\")\n        user.save()\n        c = Client()\n        c.login(username=\"john\", password=\"doe\")\n        return c, getattr(c, method)(reverse(\"account_logout\"))\n"
  },
  {
    "path": "tests/apps/account/test_middleware.py",
    "content": "import django\nfrom django.http import HttpResponse\nfrom django.test.client import AsyncClient\nfrom django.urls import path, reverse\n\nimport pytest\n\nfrom allauth.account.internal.decorators import login_not_required\nfrom allauth.core.exceptions import ImmediateHttpResponse\n\n\n@login_not_required\ndef raise_immediate_http_response(request):\n    response = HttpResponse(content=\"raised-response\")\n    raise ImmediateHttpResponse(response=response)\n\n\nurlpatterns = [path(\"raise\", raise_immediate_http_response)]\n\n\ndef test_immediate_http_response(settings, client):\n    settings.ROOT_URLCONF = \"tests.apps.account.test_middleware\"\n    resp = client.get(\"/raise\")\n    assert resp.content == b\"raised-response\"\n\n\nskip_django_lt_5 = pytest.mark.skipif(\n    django.VERSION[0] < 5, reason=\"This test is allowed to fail on Django <5.\"\n)\n\n\n@skip_django_lt_5\n@pytest.mark.asyncio\n@pytest.mark.django_db(transaction=True)\nasync def test_accounts_redirect_async_ctx(user, db):\n    aclient = AsyncClient()\n    await aclient.aforce_login(user)\n    resp = await aclient.get(\"/accounts/\")\n    assert resp[\"location\"] == reverse(\"account_email\")\n"
  },
  {
    "path": "tests/apps/account/test_models.py",
    "content": "import uuid\n\nfrom django.contrib.auth.models import AbstractUser\nfrom django.db import models\n\nfrom allauth.account.models import EmailAddress\n\n\nclass UUIDUser(AbstractUser):\n    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)\n\n    class Meta(AbstractUser.Meta):  # type: ignore[name-defined]\n        swappable = \"AUTH_USER_MODEL\"\n        app_label = \"dummy\"\n\n\ndef test_add_new_email(rf, user, settings):\n    settings.ACCOUNT_CHANGE_EMAIL = True\n    request = rf.get(\"/\")\n    assert EmailAddress.objects.filter(user=user).count() == 1\n    new_email = EmailAddress.objects.add_new_email(\n        request, user, \"new@email.org\", send_verification=False\n    )\n    assert not new_email.verified\n    assert not new_email.primary\n    assert EmailAddress.objects.filter(user=user).count() == 2\n    EmailAddress.objects.add_new_email(\n        request, user, \"new2@email.org\", send_verification=False\n    )\n    assert EmailAddress.objects.filter(user=user).count() == 2\n    assert not EmailAddress.objects.filter(pk=new_email.pk).exists()\n    assert EmailAddress.objects.filter(email=\"new2@email.org\", verified=False).exists()\n"
  },
  {
    "path": "tests/apps/account/test_phone.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY\n\nfrom django.conf import settings\nfrom django.test import Client\nfrom django.urls import reverse\n\nimport pytest\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.authentication import AUTHENTICATION_METHODS_SESSION_KEY\n\n\n@pytest.fixture\ndef phone_only_settings(settings_impacting_urls):\n    with settings_impacting_urls(\n        ACCOUNT_LOGIN_METHODS=(\"phone\",), ACCOUNT_SIGNUP_FIELDS=[\"phone*\"]\n    ):\n        yield\n\n\ndef test_signup(db, client, phone, sms_outbox, phone_only_settings):\n    assert len(sms_outbox) == 0\n    resp = client.post(reverse(\"account_signup\"), data={\"phone\": phone})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert len(sms_outbox) == 1\n    assert resp[\"location\"] == reverse(\"account_verify_phone\")\n    resp = client.get(resp[\"location\"])\n    assert resp.status_code == HTTPStatus.OK\n    resp = client.post(\n        reverse(\"account_verify_phone\"), data={\"code\": sms_outbox[-1][\"code\"]}\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    adapter = get_adapter()\n    user = adapter.get_user_by_phone(phone)\n    phone2, phone_verified = adapter.get_phone(user)\n    assert phone_verified\n    assert phone == phone2\n    assert not user.check_password(\"\")\n\n\ndef test_signup_invalid_attempts(db, client, phone, sms_outbox, phone_only_settings):\n    assert len(sms_outbox) == 0\n    resp = client.post(reverse(\"account_signup\"), data={\"phone\": phone})\n    assert resp.status_code == HTTPStatus.FOUND\n    adapter = get_adapter()\n    user = adapter.get_user_by_phone(phone)\n    _, phone_verified = adapter.get_phone(user)\n    assert not phone_verified\n    assert len(sms_outbox) == 1\n    assert resp[\"location\"] == reverse(\"account_verify_phone\")\n    resp = client.get(resp[\"location\"])\n    assert resp.status_code == HTTPStatus.OK\n    for i in range(3):\n        resp = client.post(reverse(\"account_verify_phone\"), data={\"code\": \"wrong\"})\n        assert resp.status_code == (HTTPStatus.OK if i < 2 else HTTPStatus.FOUND)\n\n\ndef test_login_sends_code(\n    user_with_phone, client, phone_only_settings, phone, sms_outbox\n):\n    resp = client.post(reverse(\"account_login\"), data={\"login\": phone})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_confirm_login_code\")\n    assert len(sms_outbox) == 1\n\n\ndef test_login_with_verified_phone_and_password(\n    client, settings_impacting_urls, phone, user_with_phone, user_password\n):\n    with settings_impacting_urls(\n        ACCOUNT_SIGNUP_FIELDS=[\"phone*\", \"password1*\"],\n        ACCOUNT_LOGIN_METHODS=[\"phone\"],\n    ):\n        resp = client.post(\n            reverse(\"account_login\"), data={\"login\": phone, \"password\": user_password}\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n        assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n\n\ndef test_login_with_unverified_phone_and_password(\n    client, settings_impacting_urls, phone, password_factory, user_factory, sms_outbox\n):\n    with settings_impacting_urls(\n        ACCOUNT_SIGNUP_FIELDS=[\"phone*\", \"password1*\"],\n        ACCOUNT_LOGIN_METHODS=[\"phone\"],\n    ):\n        password = password_factory()\n        user = user_factory(phone=phone, password=password, phone_verified=False)\n        resp = client.post(\n            reverse(\"account_login\"), data={\"login\": phone, \"password\": password}\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n        assert resp[\"location\"] == reverse(\"account_verify_phone\")\n        code = sms_outbox[-1][\"code\"]\n        resp = client.post(reverse(\"account_verify_phone\"), data={\"code\": code})\n        assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n        phone_verified = get_adapter().get_phone(user)\n        assert phone_verified == (phone, True)\n\n\ndef test_change_phone(\n    auth_client, user, phone_only_settings, phone_factory, sms_outbox\n):\n    new_phone = phone_factory()\n    resp = auth_client.get(reverse(\"account_change_phone\"))\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"account/phone_change.html\")\n\n    resp = auth_client.post(reverse(\"account_change_phone\"), {\"phone\": new_phone})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_verify_phone\")\n\n    code = sms_outbox[-1][\"code\"]\n    resp = auth_client.get(reverse(\"account_verify_phone\"))\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"account/confirm_phone_verification_code.html\")\n\n    resp = auth_client.post(reverse(\"account_verify_phone\"), {\"code\": code})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_change_phone\")\n\n    phone_verified = get_adapter().get_phone(user)\n    assert phone_verified == (new_phone, True)\n\n    resp = auth_client.get(reverse(\"account_verify_phone\"))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_change_phone\")\n\n\ndef test_change_phone_to_already_existing(\n    auth_client, user, phone_only_settings, phone_factory, sms_outbox, user_factory\n):\n    other_phone = phone_factory()\n    user_factory(phone=other_phone)\n\n    resp = auth_client.post(reverse(\"account_change_phone\"), {\"phone\": other_phone})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_verify_phone\")\n\n    code = sms_outbox[-1][\"code\"]\n    resp = auth_client.get(reverse(\"account_verify_phone\"))\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"account/confirm_phone_verification_code.html\")\n\n    resp = auth_client.post(reverse(\"account_verify_phone\"), {\"code\": code})\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.context[\"form\"].errors == {\n        \"code\": [\"A user is already registered with this phone number.\"]\n    }\n\n\ndef test_login_by_code_enumeration_prevention(\n    db, phone_only_settings, client, phone_factory, sms_outbox\n):\n    resp = client.post(\n        reverse(\"account_request_login_code\"), data={\"phone\": phone_factory()}\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_confirm_login_code\")\n    assert \"code\" not in sms_outbox[-1]\n    assert \"user_id\" not in sms_outbox[-1]\n\n\ndef test_reauthentication(\n    settings,\n    auth_client,\n    user_with_phone,\n    phone_factory,\n    settings_impacting_urls,\n    user_password,\n):\n    with settings_impacting_urls(\n        ACCOUNT_REAUTHENTICATION_REQUIRED=True,\n        ACCOUNT_LOGIN_METHODS=(\"phone\",),\n        ACCOUNT_SIGNUP_FIELDS=[\"phone*\", \"password1*\"],\n    ):\n        new_phone = phone_factory()\n        resp = auth_client.post(\n            reverse(\"account_change_phone\"),\n            {\"phone\": new_phone},\n        )\n        assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n\n        resp = auth_client.get(reverse(\"account_reauthenticate\"))\n        assertTemplateUsed(resp, \"account/reauthenticate.html\")\n        resp = auth_client.post(\n            reverse(\"account_reauthenticate\"), data={\"password\": user_password}\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n\n        methods = auth_client.session[AUTHENTICATION_METHODS_SESSION_KEY]\n        assert methods[-1] == {\"method\": \"password\", \"at\": ANY, \"reauthenticated\": True}\n\n        resp = auth_client.post(\n            reverse(\"account_change_phone\"),\n            {\"phone\": new_phone},\n        )\n        assert resp[\"location\"].startswith(reverse(\"account_verify_phone\"))\n\n\ndef test_signup_conflict(db, phone, sms_outbox, phone_only_settings):\n    assert len(sms_outbox) == 0\n    client = Client()\n    resp = client.post(reverse(\"account_signup\"), data={\"phone\": phone})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert len(sms_outbox) == 1\n\n    client = Client()\n    resp = client.post(reverse(\"account_signup\"), data={\"phone\": phone})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert len(sms_outbox) == 2\n    assert sms_outbox == [\n        {\"code\": ANY, \"phone\": phone, \"user_id\": 1},\n        {\"phone\": phone, \"reason\": \"exists\"},\n    ]\n\n\ndef test_change_to_already_existing_phone(\n    client,\n    db,\n    settings,\n    phone_factory,\n    sms_outbox,\n    messagesoutbox,\n    user_with_phone,\n    phone_only_settings,\n):\n    settings.ACCOUNT_PHONE_VERIFICATION_SUPPORTS_RESEND = True\n    settings.ACCOUNT_PHONE_VERIFICATION_SUPPORTS_CHANGE = True\n    settings.ACCOUNT_PREVENT_ENUMERATION = True\n    new_phone = phone_factory()\n    resp = client.post(\n        reverse(\"account_signup\"),\n        {\"phone\": new_phone},\n    )\n    # A user signed up.\n    new_user = get_adapter().get_user_by_phone(new_phone)\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_verify_phone\")\n    assert len(sms_outbox) == 1\n    assert sms_outbox[0] == {\"code\": ANY, \"phone\": new_phone, \"user_id\": new_user.pk}\n    # assert len(messagesoutbox) == 1\n    # assert (\n    #     messagesoutbox[-1][\"message_template\"]\n    #     == \"account/messages/email_confirmation_sent.txt\"\n    # )\n\n    # Change to a conflicting phone number\n    existing_phone_verified = get_adapter().get_phone(user_with_phone)\n    resp = client.post(\n        reverse(\"account_verify_phone\"),\n        {\"action\": \"change\", \"phone\": existing_phone_verified[0]},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_verify_phone\")\n    assert len(sms_outbox) == 2\n    assert sms_outbox[1] == {\"phone\": existing_phone_verified[0], \"reason\": \"exists\"}\n    # assert len(messagesoutbox) == 2\n    # assert (\n    #     messagesoutbox[-1][\"message_template\"]\n    #     == \"account/messages/email_confirmation_sent.txt\"\n    # )\n    assert get_adapter().get_phone(new_user)[0] == new_phone\n\n    # Change back to new phone\n    new_phone2 = phone_factory()\n    resp = client.post(\n        reverse(\"account_verify_phone\"),\n        {\"action\": \"change\", \"phone\": new_phone2},\n    )\n    assert len(sms_outbox) == 3\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_verify_phone\")\n    assert sms_outbox[2] == {\"code\": ANY, \"phone\": new_phone2, \"user_id\": ANY}\n    # assert len(messagesoutbox) == 3\n    # assert (\n    #     messagesoutbox[-1][\"message_template\"]\n    #     == \"account/messages/email_confirmation_sent.txt\"\n    # )\n    assert get_adapter().get_phone(new_user)[0] == new_phone2\n\n    resp = client.post(\n        reverse(\"account_verify_phone\"),\n        data={\"code\": sms_outbox[-1][\"code\"]},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert get_adapter().get_phone(new_user) == (new_phone2, True)\n\n\ndef test_signup_invalid_phone(db, client, sms_outbox, phone_only_settings):\n    assert len(sms_outbox) == 0\n    resp = client.post(reverse(\"account_signup\"), data={\"phone\": \"notaphone\"})\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.context[\"form\"].errors == {\n        \"phone\": [\"Enter a phone number including country code (e.g. +1 for the US).\"]\n    }\n"
  },
  {
    "path": "tests/apps/account/test_ratelimit.py",
    "content": "from http import HTTPStatus\n\nfrom django.urls import reverse\n\n\ndef test_case_insensitive_password_reset(settings, enable_cache, user_factory, client):\n    settings.ACCOUNT_RATE_LIMITS = {\"reset_password\": \"1/m\"}\n    user_factory(email=\"a@b.com\")\n    resp = client.post(reverse(\"account_reset_password\"), data={\"email\": \"a@b.com\"})\n    assert resp.status_code == HTTPStatus.FOUND\n    resp = client.post(reverse(\"account_reset_password\"), data={\"email\": \"A@B.COM\"})\n    assert resp.status_code == HTTPStatus.TOO_MANY_REQUESTS\n"
  },
  {
    "path": "tests/apps/account/test_reauthentication.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY\n\nfrom django.urls import reverse\n\nimport pytest\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth import app_settings as allauth_settings\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.authentication import AUTHENTICATION_METHODS_SESSION_KEY\n\n\n@pytest.mark.parametrize(\n    \"with_totp,with_password,expected_method_urlnames\",\n    [\n        (False, True, [\"account_reauthenticate\"]),\n        (True, True, [\"account_reauthenticate\", \"mfa_reauthenticate\"]),\n        (True, False, [\"mfa_reauthenticate\"]),\n    ],\n)\ndef test_user_with_mfa_only(\n    user_factory, with_totp, with_password, expected_method_urlnames, client\n):\n    if not allauth_settings.MFA_ENABLED and with_totp:\n        return\n    user = user_factory(with_totp=with_totp, password=None if with_password else \"!\")\n    assert user.has_usable_password() == with_password\n    client.force_login(user)\n    methods = get_adapter().get_reauthentication_methods(user)\n    assert len(methods) == len(expected_method_urlnames)\n    assert {m[\"url\"] for m in methods} == set(map(reverse, expected_method_urlnames))\n    for urlname in [\"account_reauthenticate\", \"mfa_reauthenticate\"]:\n        if urlname == \"mfa_reauthenticate\" and not allauth_settings.MFA_ENABLED:\n            continue\n        resp = client.get(f\"{reverse(urlname)}?next=/foo\")\n        if urlname in expected_method_urlnames:\n            assert resp.status_code == HTTPStatus.OK\n        else:\n            assert resp.status_code == HTTPStatus.FOUND\n            assert \"next=%2Ffoo\" in resp[\"location\"]\n\n\ndef test_reauthentication(settings, auth_client, user_password):\n    settings.ACCOUNT_REAUTHENTICATION_REQUIRED = True\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_add\": \"\", \"email\": \"john3@example.org\"},\n    )\n    assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n    resp = auth_client.get(reverse(\"account_reauthenticate\"))\n    assertTemplateUsed(resp, \"account/reauthenticate.html\")\n    resp = auth_client.post(\n        reverse(\"account_reauthenticate\"), data={\"password\": user_password}\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_add\": \"\", \"email\": \"john3@example.org\"},\n    )\n    assert resp[\"location\"].startswith(reverse(\"account_email\"))\n    methods = auth_client.session[AUTHENTICATION_METHODS_SESSION_KEY]\n    assert methods[-1] == {\"method\": \"password\", \"at\": ANY, \"reauthenticated\": True}\n"
  },
  {
    "path": "tests/apps/account/test_reset_password.py",
    "content": "import json\nfrom http import HTTPStatus\n\nfrom django.contrib.auth import get_user_model\nfrom django.contrib.auth.models import AnonymousUser\nfrom django.core import mail\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\nfrom django.urls import reverse, reverse_lazy\nfrom django.utils.http import urlencode\n\nimport pytest\nfrom pytest_django.asserts import assertRedirects, assertTemplateUsed\n\nfrom allauth.account import app_settings\nfrom allauth.account.forms import ResetPasswordForm, default_token_generator\nfrom allauth.account.models import EmailAddress\nfrom allauth.account.utils import user_pk_to_url_str\n\n\n@pytest.fixture\ndef password_reset_url():\n    def f(user):\n        temp_key = default_token_generator.make_token(user)\n        uid = user_pk_to_url_str(user)\n        return reverse(\n            \"account_reset_password_from_key\", kwargs={\"uidb36\": uid, \"key\": temp_key}\n        )\n\n    return f\n\n\n@pytest.mark.django_db\ndef test_reset_password_unknown_account(client, settings):\n    settings.ACCOUNT_PREVENT_ENUMERATION = True\n    resp = client.post(\n        reverse(\"account_reset_password\"),\n        data={\"email\": \"unknown@example.org\"},\n        follow=True,\n    )\n    assert len(mail.outbox) == 1\n    assert mail.outbox[0].to == [\"unknown@example.org\"]\n    assert resp.redirect_chain == [\n        (reverse(\"account_reset_password_done\"), HTTPStatus.FOUND)\n    ]\n\n\n@pytest.mark.django_db\ndef test_reset_password_unknown_account_disabled(client, settings):\n    settings.ACCOUNT_PREVENT_ENUMERATION = True\n    settings.ACCOUNT_EMAIL_UNKNOWN_ACCOUNTS = False\n    client.post(\n        reverse(\"account_reset_password\"),\n        data={\"email\": \"unknown@example.org\"},\n    )\n    assert len(mail.outbox) == 0\n\n\n@pytest.mark.parametrize(\n    \"query,expected_location\",\n    [(\"\", reverse_lazy(\"account_reset_password_done\")), (\"?next=/foo\", \"/foo\")],\n)\ndef test_reset_password_next_url(client, user, query, expected_location):\n    resp = client.post(\n        reverse(\"account_reset_password\") + query,\n        data={\"email\": user.email},\n    )\n    assert resp[\"location\"] == expected_location\n\n\n@override_settings(\n    ACCOUNT_PREVENT_ENUMERATION=False,\n    ACCOUNT_DEFAULT_HTTP_PROTOCOL=\"https\",\n    ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY,\n    ACCOUNT_LOGIN_METHODS={app_settings.AuthenticationMethod.USERNAME},\n    ACCOUNT_SIGNUP_FORM_CLASS=None,\n    ACCOUNT_EMAIL_SUBJECT_PREFIX=None,\n    LOGIN_REDIRECT_URL=\"/accounts/profile/\",\n    ACCOUNT_SIGNUP_REDIRECT_URL=\"/accounts/welcome/\",\n    ACCOUNT_ADAPTER=\"allauth.account.adapter.DefaultAccountAdapter\",\n    ACCOUNT_USERNAME_REQUIRED=True,\n    ACCOUNT_EMAIL_NOTIFICATIONS=True,\n)\nclass ResetPasswordTests(TestCase):\n    def test_user_email_not_sent_inactive_user(self):\n        User = get_user_model()\n        User.objects.create_user(\n            \"mike123\", \"mike@ixample.org\", \"test123\", is_active=False\n        )\n        data = {\"email\": \"mike@ixample.org\"}\n        form = ResetPasswordForm(data)\n        self.assertFalse(form.is_valid())\n\n    def test_password_reset_get(self):\n        resp = self.client.get(reverse(\"account_reset_password\"))\n        self.assertTemplateUsed(resp, \"account/password_reset.html\")\n\n    def test_set_password_not_allowed(self):\n        user = self._create_user_and_login(True)\n        pwd = \"!*123i1uwn12W23\"\n        self.assertFalse(user.check_password(pwd))\n        resp = self.client.post(\n            reverse(\"account_set_password\"),\n            data={\"password1\": pwd, \"password2\": pwd},\n        )\n        user.refresh_from_db()\n        self.assertFalse(user.check_password(pwd))\n        self.assertTrue(user.has_usable_password())\n        self.assertEqual(resp.status_code, HTTPStatus.FOUND)\n\n    def test_password_forgotten_username_hint(self):\n        user = self._request_new_password()\n        body = mail.outbox[0].body\n        assert user.username in body\n\n    @override_settings(ACCOUNT_LOGIN_METHODS={app_settings.AuthenticationMethod.EMAIL})\n    def test_password_forgotten_no_username_hint(self):\n        user = self._request_new_password()\n        body = mail.outbox[0].body\n        assert user.username not in body\n\n    def _request_new_password(self):\n        user = get_user_model().objects.create(\n            username=\"john\", email=\"john@example.org\", is_active=True\n        )\n        user.set_password(\"doe\")\n        user.save()\n        self.client.post(\n            reverse(\"account_reset_password\"),\n            data={\"email\": \"john@example.org\"},\n        )\n        self.assertEqual(len(mail.outbox), 1)\n        self.assertEqual(mail.outbox[0].to, [\"john@example.org\"])\n        return user\n\n    def test_password_reset_flow_with_empty_session(self):\n        \"\"\"\n        Test the password reset flow when the session is empty:\n        requesting a new password, receiving the reset link via email,\n        following the link, getting redirected to the\n        new link (without the token)\n        Copying the link and using it in a DIFFERENT client (Browser/Device).\n        \"\"\"\n        # Request new password\n        self._request_new_password()\n        body = mail.outbox[0].body\n        self.assertGreater(body.find(\"https://\"), 0)\n\n        # Extract URL for `password_reset_from_key` view\n        url = body[body.find(\"/accounts/password/reset/\") :].split()[0]\n        resp = self.client.get(url)\n\n        reset_pass_url = resp.url\n\n        # Accessing the url via a different session\n        resp = self.client_class().get(reset_pass_url)\n\n        # We should receive the token_fail context_data\n        self.assertTemplateUsed(\n            resp,\n            f\"account/password_reset_from_key.{app_settings.TEMPLATE_EXTENSION}\",\n        )\n\n        self.assertTrue(resp.context_data[\"token_fail\"])\n\n    @override_settings(ACCOUNT_LOGIN_METHODS={app_settings.AuthenticationMethod.EMAIL})\n    def test_password_reset_flow_with_another_user_logged_in(self):\n        \"\"\"\n        Tests the password reset flow: if User B requested a password\n        reset earlier and now User A is logged in, User B now clicks on\n        the link, ensure User A is logged out before continuing.\n        \"\"\"\n        # Request new password\n        self._request_new_password()\n        body = mail.outbox[0].body\n        self.assertGreater(body.find(\"https://\"), 0)\n\n        user2 = self._create_user(username=\"john2\", email=\"john2@example.com\")\n        EmailAddress.objects.create(\n            user=user2, email=user2.email, primary=True, verified=True\n        )\n        resp = self.client.post(\n            reverse(\"account_login\"),\n            {\n                \"login\": user2.email,\n                \"password\": \"doe\",\n            },\n        )\n        self.assertEqual(user2, resp.context[\"user\"])\n\n        # Extract URL for `password_reset_from_key` view and access it\n        url = body[body.find(\"/accounts/password/reset/\") :].split()[0]\n        resp = self.client.get(url)\n        # Follow the redirect the actual password reset page with the key\n        # hidden.\n        url = resp.url\n        resp = self.client.get(url)\n        self.assertTemplateUsed(\n            resp, f\"account/password_reset_from_key.{app_settings.TEMPLATE_EXTENSION}\"\n        )\n        self.assertFalse(\"token_fail\" in resp.context_data)\n\n        # Reset the password\n        resp = self.client.post(\n            url, {\"password1\": \"newpass123\", \"password2\": \"newpass123\"}, follow=True\n        )\n        self.assertRedirects(resp, reverse(\"account_reset_password_from_key_done\"))\n\n        self.assertNotEqual(user2, resp.context[\"user\"])\n        self.assertEqual(AnonymousUser(), resp.context[\"user\"])\n\n    def test_password_reset_flow_with_email_changed(self):\n        \"\"\"\n        Test that the password reset token is invalidated if\n        the user email address was changed.\n        \"\"\"\n        user = self._request_new_password()\n        body = mail.outbox[0].body\n        self.assertGreater(body.find(\"https://\"), 0)\n        EmailAddress.objects.create(user=user, email=\"other@email.org\")\n        # Extract URL for `password_reset_from_key` view\n        url = body[body.find(\"/accounts/password/reset/\") :].split()[0]\n        resp = self.client.get(url)\n        self.assertTemplateUsed(\n            resp,\n            f\"account/password_reset_from_key.{app_settings.TEMPLATE_EXTENSION}\",\n        )\n        self.assertTrue(\"token_fail\" in resp.context_data)\n\n    @override_settings(ACCOUNT_LOGIN_ON_PASSWORD_RESET=True)\n    def test_password_reset_ACCOUNT_LOGIN_ON_PASSWORD_RESET(self):\n        user = self._request_new_password()\n        body = mail.outbox[0].body\n        url = body[body.find(\"/accounts/password/reset/\") :].split()[0]\n        resp = self.client.get(url)\n        # Follow the redirect the actual password reset page with the key\n        # hidden.\n        resp = self.client.post(\n            resp.url, {\"password1\": \"newpass123\", \"password2\": \"newpass123\"}\n        )\n        self.assertTrue(user.is_authenticated)\n        # EmailVerificationMethod.MANDATORY sends us to the confirm-email page\n        self.assertRedirects(resp, \"/accounts/confirm-email/\")\n\n    def _create_user(self, username=\"john\", password=\"doe\", **kwargs):\n        user = get_user_model().objects.create(\n            username=username, is_active=True, **kwargs\n        )\n        if password:\n            user.set_password(password)\n        else:\n            user.set_unusable_password()\n        user.save()\n        return user\n\n    def _create_user_and_login(self, usable_password=True):\n        password = \"doe\" if usable_password else False\n        user = self._create_user(password=password)\n        self.client.force_login(user)\n        return user\n\n\ndef test_password_reset_flow(client, user, mailoutbox, settings):\n    \"\"\"\n    Tests the password reset flow: requesting a new password,\n    receiving the reset link via email and finally resetting the\n    password to a new value.\n    \"\"\"\n    settings.ACCOUNT_EMAIL_NOTIFICATIONS = True\n\n    # Request new password\n    client.post(\n        reverse(\"account_reset_password\"),\n        data={\"email\": user.email},\n    )\n    assert len(mail.outbox) == 1\n    assert mailoutbox[0].to == [user.email]\n    body = mailoutbox[0].body\n    assert body.find(\"http://\") > 0\n\n    # Extract URL for `password_reset_from_key` view and access it\n    url = body[body.find(\"/accounts/password/reset/\") :].split()[0]\n    resp = client.get(url)\n    # Follow the redirect the actual password reset page with the key\n    # hidden.\n    url = resp.url\n    resp = client.get(url)\n    assertTemplateUsed(\n        resp,\n        f\"account/password_reset_from_key.{app_settings.TEMPLATE_EXTENSION}\",\n    )\n    assert \"token_fail\" not in resp.context_data\n\n    # Reset the password\n    resp = client.post(url, {\"password1\": \"newpass123\", \"password2\": \"newpass123\"})\n    assertRedirects(resp, reverse(\"account_reset_password_from_key_done\"))\n    assert \"Your password has been reset\" in mailoutbox[-1].body\n\n    # Check the new password is in effect\n    user = get_user_model().objects.get(pk=user.pk)\n    assert user.check_password(\"newpass123\")\n\n    # Trying to reset the password against the same URL (or any other\n    # invalid/obsolete URL) returns a bad token response\n    resp = client.post(url, {\"password1\": \"newpass123\", \"password2\": \"newpass123\"})\n    assertTemplateUsed(\n        resp,\n        f\"account/password_reset_from_key.{app_settings.TEMPLATE_EXTENSION}\",\n    )\n    assert resp.context_data[\"token_fail\"]\n\n    # Same should happen when accessing the page directly\n    response = client.get(url)\n    assertTemplateUsed(\n        response,\n        f\"account/password_reset_from_key.{app_settings.TEMPLATE_EXTENSION}\",\n    )\n    assert response.context_data[\"token_fail\"]\n\n    # When in XHR views, it should respond with a 400 bad request\n    # code, and the response body should contain the JSON-encoded\n    # error from the adapter\n    response = client.post(\n        url,\n        {\"password1\": \"newpass123\", \"password2\": \"newpass123\"},\n        HTTP_X_REQUESTED_WITH=\"XMLHttpRequest\",\n    )\n    assert response.status_code == HTTPStatus.BAD_REQUEST\n    data = json.loads(response.content.decode(\"utf8\"))\n    assert \"invalid\" in data[\"form\"][\"errors\"][0]\n\n\n@pytest.mark.parametrize(\n    \"next_url,expected_location\",\n    [(None, reverse_lazy(\"account_reset_password_from_key_done\")), (\"/foo\", \"/foo\")],\n)\ndef test_reset_password_from_key_next_url(\n    user, client, password_factory, next_url, expected_location, password_reset_url\n):\n    url = password_reset_url(user)\n    query = \"\"\n    if next_url:\n        query = f\"?{urlencode({'next': next_url})}\"\n    resp = client.get(url + query)\n    assert resp.status_code == HTTPStatus.FOUND\n    assert (\n        resp[\"location\"]\n        == reverse(\n            \"account_reset_password_from_key\",\n            kwargs={\"uidb36\": user_pk_to_url_str(user), \"key\": \"set-password\"},\n        )\n        + query\n    )\n    password = password_factory()\n    data = {\"password1\": password, \"password2\": password}\n    if next_url:\n        data[\"next\"] = next_url\n    resp = client.post(resp[\"location\"], data)\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == expected_location\n"
  },
  {
    "path": "tests/apps/account/test_reset_password_by_code.py",
    "content": "from http import HTTPStatus\n\nfrom django.urls import reverse\n\nimport pytest\n\nfrom allauth.account.models import EmailAddress\n\n\n@pytest.fixture(autouse=True)\ndef prbc_settings(settings_impacting_urls):\n    with settings_impacting_urls(ACCOUNT_PASSWORD_RESET_BY_CODE_ENABLED=True):\n        yield\n\n\n@pytest.mark.parametrize(\"login_on_password_reset\", [False, True])\ndef test_flow(\n    user,\n    client,\n    mailoutbox,\n    get_last_password_reset_code,\n    password_factory,\n    login_on_password_reset,\n    settings,\n):\n    settings.ACCOUNT_LOGIN_ON_PASSWORD_RESET = login_on_password_reset\n    new_password = password_factory()\n    assert not user.check_password(new_password)\n    resp = client.post(reverse(\"account_reset_password\"), {\"email\": user.email})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_confirm_password_reset_code\")\n    resp = client.post(\n        reverse(\"account_confirm_password_reset_code\"),\n        {\"code\": get_last_password_reset_code(client, mailoutbox)},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_complete_password_reset\")\n    resp = client.post(\n        reverse(\"account_complete_password_reset\"),\n        {\"password1\": new_password, \"password2\": new_password},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert (\n        resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n        if login_on_password_reset\n        else reverse(\"account_password_reset_completed\")\n    )\n    user.refresh_from_db()\n    assert user.check_password(new_password)\n\n\ndef test_prevent_enumeration(db, client, mailoutbox):\n    resp = client.post(\n        reverse(\"account_reset_password\"), {\"email\": \"unknown@account.org\"}\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_confirm_password_reset_code\")\n    assert mailoutbox[0].subject == \"[example.com] Unknown Account\"\n    resp = client.post(\n        reverse(\"account_confirm_password_reset_code\"),\n        {\"code\": \"none?\"},\n    )\n    assert resp.status_code == HTTPStatus.OK\n\n\ndef test_indirect_email_verification(\n    db, client, mailoutbox, user_factory, get_last_password_reset_code\n):\n    user = user_factory(email_verified=False)\n    address = EmailAddress.objects.get(user=user, email=user.email, verified=False)\n    resp = client.post(reverse(\"account_reset_password\"), {\"email\": address.email})\n    assert resp.status_code == HTTPStatus.FOUND\n    resp = client.post(\n        reverse(\"account_confirm_password_reset_code\"),\n        {\"code\": get_last_password_reset_code(client, mailoutbox)},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    address.refresh_from_db()\n    assert address.verified\n"
  },
  {
    "path": "tests/apps/account/test_security.py",
    "content": "from allauth.account.forms import ResetPasswordForm\n\n\ndef test_user_email_unicode_collision(settings, rf, user_factory, mailoutbox):\n    settings.ACCOUNT_PREVENT_ENUMERATION = False\n    user_factory(username=\"mike123\", email=\"mike@example.org\")\n    user_factory(username=\"mike456\", email=\"mıke@example.org\")\n    data = {\"email\": \"mıke@example.org\"}\n    form = ResetPasswordForm(data)\n    assert form.is_valid()\n    form.save(rf.get(\"/\"))\n    assert len(mailoutbox) == 1\n    assert mailoutbox[0].to == [\"mıke@example.org\"]\n\n\ndef test_user_email_domain_unicode_collision(settings, rf, user_factory, mailoutbox):\n    settings.ACCOUNT_PREVENT_ENUMERATION = False\n    user_factory(username=\"mike123\", email=\"mike@ixample.org\")\n    user_factory(username=\"mike456\", email=\"mike@ıxample.org\")\n    data = {\"email\": \"mike@ıxample.org\"}\n    form = ResetPasswordForm(data)\n    assert form.is_valid()\n    form.save(rf.get(\"/\"))\n    assert len(mailoutbox) == 1\n    assert mailoutbox[0].to == [\"mike@ıxample.org\"]\n\n\ndef test_user_email_unicode_collision_nonexistent(settings, user_factory):\n    settings.ACCOUNT_PREVENT_ENUMERATION = False\n    user_factory(username=\"mike123\", email=\"mike@example.org\")\n    data = {\"email\": \"mıke@example.org\"}\n    form = ResetPasswordForm(data)\n    assert not form.is_valid()\n\n\ndef test_user_email_domain_unicode_collision_nonexistent(settings, user_factory):\n    settings.ACCOUNT_PREVENT_ENUMERATION = False\n    user_factory(username=\"mike123\", email=\"mike@ixample.org\")\n    data = {\"email\": \"mike@ıxample.org\"}\n    form = ResetPasswordForm(data)\n    assert not form.is_valid()\n"
  },
  {
    "path": "tests/apps/account/test_signup.py",
    "content": "from http import HTTPStatus\n\nfrom django import forms\nfrom django.contrib.auth import get_user_model\nfrom django.contrib.auth.models import AnonymousUser\nfrom django.contrib.messages.middleware import MessageMiddleware\nfrom django.contrib.sessions.middleware import SessionMiddleware\nfrom django.core import mail\nfrom django.test import TestCase\nfrom django.test.client import Client, RequestFactory\nfrom django.test.utils import override_settings\nfrom django.urls import reverse\n\nimport pytest\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.account import app_settings\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.forms import BaseSignupForm, SignupForm\nfrom allauth.account.models import EmailAddress\nfrom allauth.core import context\nfrom allauth.utils import get_username_max_length\n\n\nclass CustomSignupFormTests(TestCase):\n    @override_settings(\n        ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE=True,\n        ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE=True,\n    )\n    def test_custom_form_field_order(self):\n        expected_field_order = [\n            \"email\",\n            \"email2\",\n            \"password1\",\n            \"password2\",\n            \"username\",\n            \"last_name\",\n            \"first_name\",\n        ]\n\n        class TestSignupForm(forms.Form):\n            first_name = forms.CharField(max_length=30)\n            last_name = forms.CharField(max_length=30)\n\n            field_order = expected_field_order\n\n        class CustomSignupForm(SignupForm, TestSignupForm):\n            # ACCOUNT_SIGNUP_FORM_CLASS is only abided by when the\n            # BaseSignupForm definition is loaded the first time on Django\n            # startup. @override_settings() has therefore no effect.\n            pass\n\n        form = CustomSignupForm()\n        self.assertEqual(list(form.fields.keys()), expected_field_order)\n\n    def test_user_class_attribute(self):\n        from django.contrib.auth import get_user_model\n        from django.db.models.query_utils import DeferredAttribute\n\n        class CustomSignupForm(SignupForm):\n            # ACCOUNT_SIGNUP_FORM_CLASS is only abided by when the\n            # BaseSignupForm definition is loaded the first time on Django\n            # startup. @override_settings() has therefore no effect.\n            pass\n\n        User = get_user_model()\n        data = {\n            \"username\": \"username\",\n            \"email\": \"user@example.com\",\n            \"password1\": \"very-secret\",\n            \"password2\": \"very-secret\",\n        }\n        form = CustomSignupForm(data, email_required=True)\n\n        assert isinstance(User.username, DeferredAttribute)\n        form.is_valid()\n        assert isinstance(User.username, DeferredAttribute)\n\n\nclass BaseSignupFormTests(TestCase):\n    @override_settings(\n        ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_USERNAME_BLACKLIST=[\"username\"]\n    )\n    def test_username_in_blacklist(self):\n        data = {\n            \"username\": \"username\",\n            \"email\": \"user@example.com\",\n        }\n        form = BaseSignupForm(data, email_required=True)\n        self.assertFalse(form.is_valid())\n\n    @override_settings(\n        ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_USERNAME_BLACKLIST=[\"username\"]\n    )\n    def test_username_not_in_blacklist(self):\n        data = {\n            \"username\": \"theusername\",\n            \"email\": \"user@example.com\",\n        }\n        form = BaseSignupForm(data, email_required=True)\n        self.assertTrue(form.is_valid())\n\n    @override_settings(ACCOUNT_USERNAME_REQUIRED=True)\n    def test_username_maxlength(self):\n        data = {\n            \"username\": \"username\",\n            \"email\": \"user@example.com\",\n        }\n        form = BaseSignupForm(data, email_required=True)\n        max_length = get_username_max_length()\n        field = form.fields[\"username\"]\n        self.assertEqual(field.max_length, max_length)\n        widget = field.widget\n        self.assertEqual(widget.attrs.get(\"maxlength\"), str(max_length))\n\n\ndef test_signup_email_verification(settings, db):\n    settings.ACCOUNT_USERNAME_REQUIRED = True\n    settings.ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE = True\n    data = {\n        \"username\": \"username\",\n        \"email\": \"user@example.com\",\n    }\n    form = BaseSignupForm(data, email_required=True)\n    assert not form.is_valid()\n\n    data = {\n        \"username\": \"username\",\n        \"email\": \"user@example.com\",\n        \"email2\": \"USER@example.COM\",\n    }\n    form = BaseSignupForm(data, email_required=True)\n    assert form.is_valid()\n\n    data[\"email2\"] = \"anotheruser@example.com\"\n    form = BaseSignupForm(data, email_required=True)\n    assert not form.is_valid()\n\n\n@override_settings(\n    ACCOUNT_DEFAULT_HTTP_PROTOCOL=\"https\",\n    ACCOUNT_EMAIL_VERIFICATION=app_settings.EmailVerificationMethod.MANDATORY,\n    ACCOUNT_LOGIN_METHODS={app_settings.LoginMethod.USERNAME},\n    ACCOUNT_SIGNUP_FORM_CLASS=None,\n    ACCOUNT_EMAIL_SUBJECT_PREFIX=None,\n    LOGIN_REDIRECT_URL=\"/accounts/profile/\",\n    ACCOUNT_SIGNUP_REDIRECT_URL=\"/accounts/welcome/\",\n    ACCOUNT_ADAPTER=\"allauth.account.adapter.DefaultAccountAdapter\",\n    ACCOUNT_USERNAME_REQUIRED=True,\n)\nclass SignupTests(TestCase):\n    def test_signup_same_email_verified_externally(self):\n        user = self._test_signup_email_verified_externally(\n            \"john@example.com\", \"john@example.com\"\n        )\n        self.assertEqual(EmailAddress.objects.filter(user=user).count(), 1)\n        EmailAddress.objects.get(\n            verified=True, email=\"john@example.com\", user=user, primary=True\n        )\n\n    def test_signup_other_email_verified_externally(self):\n        \"\"\"\n        John is invited on john@example.org, but signs up via john@example.com.\n        Email verification is by-passed, their home email address is\n        used as a secondary.\n        \"\"\"\n        user = self._test_signup_email_verified_externally(\n            \"john@example.com\", \"john@example.org\"\n        )\n        self.assertEqual(EmailAddress.objects.filter(user=user).count(), 2)\n        EmailAddress.objects.get(\n            verified=False, email=\"john@example.com\", user=user, primary=False\n        )\n        EmailAddress.objects.get(\n            verified=True, email=\"john@example.org\", user=user, primary=True\n        )\n\n    def _test_signup_email_verified_externally(self, signup_email, verified_email):\n        username = \"johndoe\"\n        request = RequestFactory().post(\n            reverse(\"account_signup\"),\n            {\n                \"username\": username,\n                \"email\": signup_email,\n                \"password1\": \"johndoe\",\n                \"password2\": \"johndoe\",\n            },\n        )\n        # Fake stash_verified_email\n        SessionMiddleware(lambda request: None).process_request(request)\n        MessageMiddleware(lambda request: None).process_request(request)\n        request.user = AnonymousUser()\n        request.session[\"account_verified_email\"] = verified_email\n        from allauth.account.views import signup\n\n        with context.request_context(request):\n            resp = signup(request)\n        self.assertEqual(resp.status_code, HTTPStatus.FOUND)\n        self.assertEqual(\n            resp[\"location\"], get_adapter().get_signup_redirect_url(request)\n        )\n        self.assertEqual(len(mail.outbox), 0)\n        return get_user_model().objects.get(username=username)\n\n    @override_settings(\n        ACCOUNT_USERNAME_REQUIRED=True,\n        ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE=True,\n    )\n    def test_signup_password_twice_form_error(self):\n        resp = self.client.post(\n            reverse(\"account_signup\"),\n            data={\n                \"username\": \"johndoe\",\n                \"email\": \"john@example.org\",\n                \"password1\": \"johndoe\",\n                \"password2\": \"janedoe\",\n            },\n        )\n        self.assertFormError(\n            resp.context[\"form\"],\n            \"password2\",\n            \"You must type the same password each time.\",\n        )\n\n    @override_settings(\n        ACCOUNT_USERNAME_REQUIRED=True, ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE=True\n    )\n    def test_signup_email_twice(self):\n        request = RequestFactory().post(\n            reverse(\"account_signup\"),\n            {\n                \"username\": \"johndoe\",\n                \"email\": \"john@example.org\",\n                \"email2\": \"john@example.org\",\n                \"password1\": \"johndoe\",\n                \"password2\": \"johndoe\",\n            },\n        )\n        SessionMiddleware(lambda request: None).process_request(request)\n        MessageMiddleware(lambda request: None).process_request(request)\n        request.user = AnonymousUser()\n        from allauth.account.views import signup\n\n        with context.request_context(request):\n            signup(request)\n        user = get_user_model().objects.get(username=\"johndoe\")\n        self.assertEqual(user.email, \"john@example.org\")\n\n    @override_settings(\n        AUTH_PASSWORD_VALIDATORS=[\n            {\n                \"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\",\n                \"OPTIONS\": {\n                    \"min_length\": 9,\n                },\n            }\n        ]\n    )\n    def test_django_password_validation(self):\n        resp = self.client.post(\n            reverse(\"account_signup\"),\n            {\n                \"username\": \"johndoe\",\n                \"email\": \"john@example.com\",\n                \"password1\": \"johndoe\",\n                \"password2\": \"johndoe\",\n            },\n        )\n        self.assertFormError(resp.context[\"form\"], None, [])\n        self.assertFormError(\n            resp.context[\"form\"],\n            \"password1\",\n            [\"This password is too short. It must contain at least 9 characters.\"],\n        )\n\n\ndef test_prevent_enumeration_with_mandatory_verification(\n    settings, user_factory, email_factory\n):\n    settings.ACCOUNT_PREVENT_ENUMERATION = True\n    settings.ACCOUNT_LOGIN_METHODS = {app_settings.LoginMethod.EMAIL}\n    settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.MANDATORY\n    user = user_factory(username=\"john\", email=\"john@example.org\", password=\"doe\")\n    c = Client()\n    resp = c.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": email_factory(email=user.email, mixed_case=True),\n            \"password1\": \"johndoe\",\n            \"password2\": \"johndoe\",\n        },\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n    assertTemplateUsed(resp, \"account/email/account_already_exists_message.txt\")\n    assertTemplateUsed(resp, \"account/messages/email_confirmation_sent.txt\")\n    assert EmailAddress.objects.filter(email=\"john@example.org\").count() == 1\n\n\ndef test_prevent_enumeration_off(settings, user_factory, email_factory):\n    settings.ACCOUNT_PREVENT_ENUMERATION = False\n    settings.ACCOUNT_LOGIN_METHODS = {app_settings.LoginMethod.EMAIL}\n    settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.MANDATORY\n    user = user_factory(username=\"john\", email=\"john@example.org\", password=\"doe\")\n    c = Client()\n    resp = c.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": email_factory(email=user.email, mixed_case=True),\n            \"password1\": \"johndoe\",\n            \"password2\": \"johndoe\",\n        },\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.context[\"form\"].errors == {\n        \"email\": [\"A user is already registered with this email address.\"]\n    }\n\n\ndef test_prevent_enumeration_strictly(settings, user_factory, email_factory):\n    settings.ACCOUNT_PREVENT_ENUMERATION = \"strict\"\n    settings.ACCOUNT_LOGIN_METHODS = {app_settings.LoginMethod.EMAIL}\n    settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.NONE\n    user = user_factory(username=\"john\", email=\"john@example.org\", password=\"doe\")\n    c = Client()\n    resp = c.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": email_factory(email=user.email, mixed_case=True),\n            \"password1\": \"johndoe\",\n            \"password2\": \"johndoe\",\n        },\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n    assert EmailAddress.objects.filter(email=\"john@example.org\").count() == 2\n\n\ndef test_prevent_enumeration_on(settings, user_factory, email_factory):\n    settings.ACCOUNT_PREVENT_ENUMERATION = True\n    settings.ACCOUNT_LOGIN_METHODS = {app_settings.LoginMethod.EMAIL}\n    settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.NONE\n    user = user_factory(username=\"john\", email=\"john@example.org\", password=\"doe\")\n    c = Client()\n    resp = c.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": email_factory(email=user.email, mixed_case=True),\n            \"password1\": \"johndoe\",\n            \"password2\": \"johndoe\",\n        },\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.context[\"form\"].errors == {\n        \"email\": [\"A user is already registered with this email address.\"]\n    }\n\n\n@pytest.mark.django_db\ndef test_get_initial_with_valid_email():\n    \"\"\"Test that the email field is populated with a valid email.\"\"\"\n    request = RequestFactory().get(\"/signup/?email=test@example.com\")\n    from allauth.account.views import signup\n\n    SessionMiddleware(lambda request: None).process_request(request)\n    request.user = AnonymousUser()\n    with context.request_context(request):\n        view = signup(request)\n    assert view.context_data[\"view\"].get_initial()[\"email\"] == \"test@example.com\"\n\n\ndef test_signup_user_model_no_email(settings, client, password_factory, db, mailoutbox):\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.MANDATORY\n    settings.ACCOUNT_USER_MODEL_EMAIL_FIELD = None\n    password = password_factory()\n    email = \"user@example.com\"\n    resp = client.post(\n        reverse(\"account_signup\"),\n        {\n            \"email\": email,\n            \"password1\": password,\n            \"password2\": password,\n        },\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    email = EmailAddress.objects.get(email=email)\n    assert email.primary\n    assert not email.verified\n    assert len(mailoutbox) == 1\n\n\ndef test_email_lower_case(db, settings):\n    settings.ACCOUNT_LOGIN_METHODS = {app_settings.LoginMethod.EMAIL}\n    settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.NONE\n    c = Client()\n    resp = c.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": \"JoHn@DoE.oRg\",\n            \"password1\": \"johndoe\",\n            \"password2\": \"johndoe\",\n        },\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert EmailAddress.objects.filter(email=\"john@doe.org\").count() == 1\n\n\ndef test_does_not_create_user_when_honeypot_filled_out(client, db, settings):\n    settings.ACCOUNT_SIGNUP_FORM_HONEYPOT_FIELD = \"phone_number\"\n    resp = client.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": \"john@example.com\",\n            \"password1\": \"Password1@\",\n            \"password2\": \"Password1@\",\n            \"phone_number\": \"5551231234\",\n        },\n    )\n\n    assert not get_user_model().objects.all().exists()\n    assert resp.status_code == HTTPStatus.FOUND\n\n\ndef test_create_user_when_honeypot_not_filled_out(client, db, settings):\n    settings.ACCOUNT_SIGNUP_FORM_HONEYPOT_FIELD = \"phone_number\"\n    resp = client.post(\n        reverse(\"account_signup\"),\n        {\n            \"username\": \"johndoe\",\n            \"email\": \"john@example.com\",\n            \"password1\": \"Password1@\",\n            \"password2\": \"Password1@\",\n            \"phone_number\": \"\",\n        },\n    )\n    assert get_user_model().objects.filter(username=\"johndoe\").count() == 1\n    assert resp.status_code == HTTPStatus.FOUND\n\n\ndef test_signup_without_password(\n    db,\n    client,\n    email_factory,\n    settings_impacting_urls,\n):\n    with settings_impacting_urls(\n        ACCOUNT_LOGIN_BY_CODE_ENABLED=True,\n        ACCOUNT_EMAIL_VERIFICATION=\"mandatory\",\n        ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED=True,\n        ACCOUNT_SIGNUP_FIELDS=[\"email*\", \"password1\"],\n    ):\n        email = email_factory()\n        resp = client.post(\n            reverse(\"account_signup\"),\n            data={\n                \"username\": \"wizard\",\n                \"email\": email,\n            },\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n        user = get_user_model().objects.get(email=email)\n        assert not user.check_password(\"\")\n"
  },
  {
    "path": "tests/apps/account/test_utils.py",
    "content": "import uuid\nfrom unittest.mock import patch\n\nfrom django.contrib import messages\nfrom django.contrib.auth import get_user_model\nfrom django.contrib.messages.api import get_messages\nfrom django.contrib.messages.middleware import MessageMiddleware\nfrom django.contrib.sessions.middleware import SessionMiddleware\nfrom django.core import mail, validators\nfrom django.core.exceptions import ValidationError\nfrom django.template import Context, Template\nfrom django.test.client import RequestFactory\nfrom django.test.utils import override_settings\nfrom django.urls import reverse\n\nimport pytest\n\nimport allauth.app_settings\nfrom allauth.account.adapter import get_adapter\nfrom allauth.account.models import EmailAddress\nfrom allauth.account.utils import (\n    filter_users_by_username,\n    url_str_to_user_pk,\n    user_pk_to_url_str,\n    user_username,\n)\nfrom allauth.core import context\n\nfrom .test_models import UUIDUser\n\n\ntest_username_validators = [\n    validators.RegexValidator(regex=r\"^[a-c]+$\", message=\"not abc\")\n]\n\n\ndef test_url_str_to_pk_identifies_UUID_as_stringlike(db):\n    with patch(\"allauth.account.utils.get_user_model\") as mocked_gum:\n        mocked_gum.return_value = UUIDUser\n        user_id = uuid.uuid4().hex\n        assert url_str_to_user_pk(user_id) == uuid.UUID(user_id)\n\n\ndef test_pk_to_url_string_identifies_UUID_as_stringlike():\n    with patch(\"allauth.account.utils.get_user_model\") as mocked_gum:\n        mocked_gum.return_value = UUIDUser\n        user = UUIDUser(is_active=True, email=\"john@example.com\", username=\"john\")\n        assert user_pk_to_url_str(user) == user.pk.hex\n\n\n@override_settings(ACCOUNT_PRESERVE_USERNAME_CASING=False)\ndef test_username_lower_cased():\n    user = get_user_model()()\n    user_username(user, \"CamelCase\")\n    assert user_username(user) == \"camelcase\"\n    # TODO: Actually test something\n    filter_users_by_username(\"CamelCase\", \"FooBar\")\n\n\n@override_settings(ACCOUNT_PRESERVE_USERNAME_CASING=True)\ndef test_username_case_preserved():\n    user = get_user_model()()\n    user_username(user, \"CamelCase\")\n    assert user_username(user) == \"CamelCase\"\n    # TODO: Actually test something\n    filter_users_by_username(\"camelcase\", \"foobar\")\n\n\ndef test_user_display():\n    user = get_user_model()(username=\"john<br/>doe\")\n    expected_name = \"john&lt;br/&gt;doe\"\n    templates = [\n        \"{% load account %}{% user_display user %}\",\n        \"{% load account %}{% user_display user as x %}{{ x }}\",\n    ]\n    for template in templates:\n        t = Template(template)\n        content = t.render(Context({\"user\": user}))\n        assert content == expected_name\n\n\ndef test_message_escaping(db):\n    request = RequestFactory().get(\"/\")\n    SessionMiddleware(lambda request: None).process_request(request)\n    MessageMiddleware(lambda request: None).process_request(request)\n    user = get_user_model()()\n    user_username(user, \"'<8\")\n    context = {\"user\": user}\n    get_adapter().add_message(\n        request, messages.SUCCESS, \"account/messages/logged_in.txt\", context\n    )\n    msgs = get_messages(request)\n    actual_message = msgs._queued_messages[0].message\n    assert user.username in actual_message, actual_message\n\n\ndef test_email_escaping(db):\n    site_name = \"testserver\"\n    if allauth.app_settings.SITES_ENABLED:\n        from django.contrib.sites.models import Site\n\n        site = Site.objects.get_current()\n        site.name = site_name = '<enc&\"test>'\n        site.save()\n    u = get_user_model().objects.create(username=\"test\", email=\"user@example.com\")\n    request = RequestFactory().get(\"/\")\n    SessionMiddleware(lambda request: None).process_request(request)\n    MessageMiddleware(lambda request: None).process_request(request)\n    EmailAddress.objects.add_email(request, u, u.email, confirm=True)\n    assert mail.outbox[0].subject[1:].startswith(site_name)\n\n\n@override_settings(\n    ACCOUNT_USERNAME_VALIDATORS=\"tests.apps.account.test_utils.test_username_validators\"\n)\ndef test_username_validator(db):\n    get_adapter().clean_username(\"abc\")\n    with pytest.raises(ValidationError):\n        get_adapter().clean_username(\"def\")\n\n\n@override_settings(ALLOWED_HOSTS=[\"allowed_host\", \"testserver\"])\ndef test_is_safe_url_no_wildcard():\n    with context.request_context(RequestFactory().get(\"/\")):\n        assert get_adapter().is_safe_url(\"http://allowed_host/\")\n        assert not get_adapter().is_safe_url(\"http://other_host/\")\n\n\ndef test_is_safe_url_subdomain(settings):\n    settings.ALLOWED_HOSTS = [\".example.com\", \"testserver\"]\n    with context.request_context(RequestFactory().get(\"/\")):\n        assert get_adapter().is_safe_url(\"http://bla.example.com\")\n        assert get_adapter().is_safe_url(\"http://example.com\")\n        assert not get_adapter().is_safe_url(\"http://not-example.com\")\n\n\n@override_settings(ALLOWED_HOSTS=[\"*\"])\ndef test_is_safe_url_wildcard():\n    with context.request_context(RequestFactory().get(\"/\")):\n        assert get_adapter().is_safe_url(\"http://foobar.com/\")\n        assert get_adapter().is_safe_url(\"http://other_host/\")\n\n\n@override_settings(ALLOWED_HOSTS=[\"allowed_host\", \"testserver\"])\ndef test_is_safe_url_relative_path():\n    with context.request_context(RequestFactory().get(\"/\")):\n        assert get_adapter().is_safe_url(\"/foo/bar\")\n\n\ndef test_redirect_noreversematch(auth_client):\n    # We used to call `django.shortcuts.redirect()` as is, but that one throws a\n    # `NoReverseMatch`, resulting in 500s.\n    resp = auth_client.post(f\"{reverse('account_logout')}?next=badurlname\")\n    assert resp[\"location\"] == \"/badurlname\"\n"
  },
  {
    "path": "tests/apps/core/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/core/internal/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/core/internal/test_cryptokit.py",
    "content": "import pytest\n\nfrom allauth.core.internal.cryptokit import compare_user_code, generate_user_code\n\n\n@pytest.mark.parametrize(\n    \"actual,expected,result\",\n    [\n        (\"xkcd\", \"XKCD\", True),\n        (\"XKCD\", \"xkcd\", True),\n        (\"XK-CD\", \"XKCD\", True),\n        (\"XK CD\", \"XKCD\", True),\n        (\"XK - CD\", \"XKCD\", True),\n        (\"XKCD\", \"XK-CD\", True),\n        (\"ABCD\", \"XKCD\", False),\n        (\"\", \"XKCD\", False),\n        (\"XKCD\", \"\", False),\n        (\"\", \"\", False),\n    ],\n)\ndef test_compare_user_code(actual, expected, result):\n    assert compare_user_code(actual=actual, expected=expected) is result\n\n\n@pytest.mark.parametrize(\n    \"length,result\",\n    [\n        (2, \"X-X\"),\n        (3, \"XX-X\"),\n        (6, \"XXX-XXX\"),\n        (8, \"XXXX-XXXX\"),\n        (9, \"XXX-XXX-XXX\"),\n        (15, \"XXXXX-XXXXX-XXXXX\"),\n    ],\n)\ndef test_generate_user_code_dashing(length, result):\n    assert generate_user_code(length=length, allowed_chars=\"X\", dashed=True) == result\n"
  },
  {
    "path": "tests/apps/core/internal/test_httpkit.py",
    "content": "import json\n\nfrom django.http import HttpRequest\n\nimport pytest\n\nfrom allauth.core.internal import httpkit\n\n\n@pytest.mark.parametrize(\n    \"url,params,expected_url\",\n    [\n        (\"/\", {\"foo\": \"bar\", \"v\": 1}, \"/?foo=bar&v=1\"),\n        (\n            \"https://fqdn/?replace=this\",\n            {\"replace\": \"that\"},\n            \"https://fqdn/?replace=that\",\n        ),\n    ],\n)\ndef test_add_query_params(url, params, expected_url):\n    assert httpkit.add_query_params(url, params) == expected_url\n\n\n@pytest.mark.parametrize(\n    \"url_template,kwargs,expected_url\",\n    [\n        (\"/foo\", {}, \"http://testserver/foo\"),\n        (\"/foo?key={key}\", {\"key\": \" \"}, \"http://testserver/foo?key=+\"),\n        (\"/foo/{key}\", {\"key\": \" \"}, \"http://testserver/foo/%20\"),\n        (\"https://abs.org/foo?key={key}\", {\"key\": \" \"}, \"https://abs.org/foo?key=+\"),\n    ],\n)\ndef test_render_url(url_template, kwargs, expected_url, rf):\n    request = rf.get(\"/\")\n    assert httpkit.render_url(request, url_template, **kwargs) == expected_url\n\n\ndef test_deserialize_request(rf):\n    request = rf.get(\"/\")\n    assert not request.is_secure()\n    serialized = httpkit.serialize_request(request)\n    assert not httpkit.deserialize_request(serialized, HttpRequest()).is_secure()\n    data = json.loads(serialized)\n    data[\"scheme\"] = \"https\"\n    assert httpkit.deserialize_request(json.dumps(data), HttpRequest()).is_secure()\n"
  },
  {
    "path": "tests/apps/core/internal/test_modelkit.py",
    "content": "from datetime import date, datetime\n\nfrom django.contrib.postgres.fields import ArrayField\nfrom django.core.files.base import ContentFile\nfrom django.db import models\n\nfrom allauth.core.internal import modelkit\n\n\ndef test_serializer():\n    class SomeValue:\n        pass\n\n    some_value = SomeValue()\n\n    class SomeField(models.Field):\n        def get_prep_value(self, value):\n            return \"somevalue\"\n\n        def from_db_value(self, value, expression, connection):\n            return some_value\n\n    class SomeModel(models.Model):\n        dt = models.DateTimeField()\n        t = models.TimeField()\n        d = models.DateField()\n        img1 = models.ImageField()\n        img2 = models.ImageField()\n        img3 = models.ImageField()\n        something = SomeField()\n        ips = ArrayField(models.GenericIPAddressField(), default=list, blank=True)\n\n        class Meta:\n            app_label = \"dummy\"\n\n    def method(self):\n        pass\n\n    instance = SomeModel(\n        dt=datetime.now(),\n        d=date.today(),\n        something=some_value,\n        t=datetime.now().time(),\n        ips=[\"1.1.1.1\", \"1.2.3.4\"],\n    )\n    instance.img1 = ContentFile(b\"%PDF\", name=\"foo.pdf\")\n    instance.img2 = ContentFile(\n        b\"\\x89PNG\\r\\n\\x1a\\n\\x00\\x00\\x00\\rIHDR\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x01\\x00\"\n        b\"\\x00\\x00\\x007n\\xf9$\\x00\\x00\\x00\\nIDATx\\x9cc`\\x00\\x00\\x00\\x02\\x00\\x01H\\xaf\"\n        b\"\\xa4q\\x00\\x00\\x00\\x00IEND\\xaeB`\\x82\",\n        name=\"foo.png\",\n    )\n    # make sure serializer doesn't fail if a method is attached to\n    # the instance\n    instance.method = method\n    instance.nonfield = \"hello\"\n    data = modelkit.serialize_instance(instance)\n    instance2 = modelkit.deserialize_instance(SomeModel, data)\n    assert getattr(instance, \"method\", None) == method\n    assert getattr(instance2, \"method\", None) is None\n    assert instance2.something == some_value\n    assert instance2.img1.name == \"foo.pdf\"\n    assert instance2.img2.name == \"foo.png\"\n    assert instance2.img3.name == \"\"\n    assert instance.nonfield == instance2.nonfield\n    assert instance.d == instance2.d\n    assert instance.dt.date() == instance2.dt.date()\n    assert instance.ips == instance2.ips\n    for t1, t2 in [\n        (instance.t, instance2.t),\n        (instance.dt.time(), instance2.dt.time()),\n    ]:\n        assert t1.hour == t2.hour\n        assert t1.minute == t2.minute\n        assert t1.second == t2.second\n        # AssertionError: datetime.time(10, 6, 28, 705776)\n        #     != datetime.time(10, 6, 28, 705000)\n        assert int(t1.microsecond / 1000) == int(t2.microsecond / 1000)\n\n\ndef test_serializer_binary_field():\n    class SomeBinaryModel(models.Model):\n        bb = models.BinaryField()\n        bb_empty = models.BinaryField()\n\n        class Meta:\n            app_label = \"dummy\"\n\n    instance = SomeBinaryModel(bb=b\"some binary data\")\n\n    serialized = modelkit.serialize_instance(instance)\n    deserialized = modelkit.deserialize_instance(SomeBinaryModel, serialized)\n\n    assert serialized[\"bb\"] == \"c29tZSBiaW5hcnkgZGF0YQ==\"\n    assert serialized[\"bb_empty\"] == \"\"\n    assert deserialized.bb == b\"some binary data\"\n    assert deserialized.bb_empty == b\"\"\n"
  },
  {
    "path": "tests/apps/core/internal/test_ratelimit.py",
    "content": "import pytest\n\nfrom allauth.core.internal import ratelimit\n\n\ndef test_rollback_consume(rf, enable_cache):\n    def consume():\n        request = rf.post(\"/\")\n        config = {\"foo\": \"2/m/ip\"}\n        return ratelimit.consume(request, config=config, action=\"foo\")\n\n    usage1 = consume()\n    assert len(usage1.usage) > 0\n    usage2 = consume()\n    assert len(usage2.usage) > 0\n    no_usage = consume()\n    assert no_usage is None\n    usage1.rollback()\n    assert consume()\n    assert not consume()\n\n\n@pytest.mark.parametrize(\n    \"rate,values\",\n    [\n        (\"5/m\", [(5, 60, \"ip\")]),\n        (\"5/m/user\", [(5, 60, \"user\")]),\n        (\"2/3.5m/key\", [(2, 210, \"key\")]),\n        (\"3/5m/user,20/0.5m/ip\", [(3, 300, \"user\"), (20, 30, \"ip\")]),\n        (\"7/2h\", [(7, 7200, \"ip\")]),\n        (\"7/0.25d\", [(7, 21600, \"ip\")]),\n    ],\n)\ndef test_parse(rate, values):\n    rates = ratelimit.parse_rates(rate)\n    assert len(rates) == len(values)\n    for i, rate in enumerate(rates):\n        assert rate.amount == values[i][0]\n        assert rate.duration == values[i][1]\n        assert rate.per == values[i][2]\n"
  },
  {
    "path": "tests/apps/headless/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/headless/account/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/headless/account/test_change_email.py",
    "content": "from http import HTTPStatus\n\nfrom django.contrib.auth import get_user_model\n\nfrom allauth.account.models import EmailAddress\n\n\ndef test_list_email(auth_client, user, headless_reverse):\n    resp = auth_client.get(\n        headless_reverse(\"headless:account:manage_email\"),\n    )\n    assert len(resp.json()[\"data\"]) == 1\n\n\ndef test_list_email_anon(db, client, headless_reverse):\n    resp = client.get(\n        headless_reverse(\"headless:account:manage_email\"),\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n\n\ndef test_remove_email(auth_client, user, email_factory, headless_reverse):\n    addr = EmailAddress.objects.create(email=email_factory(), user=user)\n    assert EmailAddress.objects.filter(user=user).count() == 2\n    resp = auth_client.delete(\n        headless_reverse(\"headless:account:manage_email\"),\n        data={\"email\": addr.email},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert len(resp.json()[\"data\"]) == 1\n    assert not EmailAddress.objects.filter(pk=addr.pk).exists()\n\n\ndef test_add_email(auth_client, user, email_factory, headless_reverse):\n    new_email = email_factory()\n    resp = auth_client.post(\n        headless_reverse(\"headless:account:manage_email\"),\n        data={\"email\": new_email},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert len(resp.json()[\"data\"]) == 2\n    assert EmailAddress.objects.filter(email=new_email, verified=False).exists()\n\n\ndef test_change_primary(auth_client, user, email_factory, headless_reverse):\n    addr = EmailAddress.objects.create(\n        email=email_factory(), user=user, verified=True, primary=False\n    )\n    resp = auth_client.patch(\n        headless_reverse(\"headless:account:manage_email\"),\n        data={\"email\": addr.email, \"primary\": True},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert len(resp.json()[\"data\"]) == 2\n    assert EmailAddress.objects.filter(pk=addr.pk, primary=True).exists()\n\n\ndef test_resend_verification(\n    auth_client, user, email_factory, headless_reverse, mailoutbox\n):\n    addr = EmailAddress.objects.create(email=email_factory(), user=user, verified=False)\n    resp = auth_client.put(\n        headless_reverse(\"headless:account:manage_email\"),\n        data={\"email\": addr.email},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert len(mailoutbox) == 1\n\n\ndef test_email_rate_limit(\n    auth_client, user, email_factory, headless_reverse, settings, enable_cache\n):\n    settings.ACCOUNT_RATE_LIMITS = {\"manage_email\": \"1/m/ip\"}\n    for attempt in range(2):\n        new_email = email_factory()\n        resp = auth_client.post(\n            headless_reverse(\"headless:account:manage_email\"),\n            data={\"email\": new_email},\n            content_type=\"application/json\",\n        )\n        expected_status = (\n            HTTPStatus.OK if attempt == 0 else HTTPStatus.TOO_MANY_REQUESTS\n        )\n        assert resp.status_code == expected_status\n        assert resp.json()[\"status\"] == expected_status\n\n\ndef test_resend_verification_rate_limit(\n    auth_client,\n    user,\n    email_factory,\n    headless_reverse,\n    settings,\n    enable_cache,\n    mailoutbox,\n):\n    settings.ACCOUNT_RATE_LIMITS = {\"confirm_email\": \"1/m/ip\"}\n    for attempt in range(2):\n        addr = EmailAddress.objects.create(\n            email=email_factory(), user=user, verified=False\n        )\n        resp = auth_client.put(\n            headless_reverse(\"headless:account:manage_email\"),\n            data={\"email\": addr.email},\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.FORBIDDEN if attempt else HTTPStatus.OK\n        assert len(mailoutbox) == 1\n\n\ndef test_change_email_to_conflicting(\n    settings,\n    auth_client,\n    user,\n    email_factory,\n    headless_reverse,\n    user_factory,\n    get_last_email_verification_code,\n    mailoutbox,\n):\n    other_user = user_factory(email=\"taken@conflict.org\")\n    settings.ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True\n    settings.ACCOUNT_CHANGE_EMAIL = True\n    resp = auth_client.post(\n        headless_reverse(\"headless:account:manage_email\"),\n        data={\"email\": other_user.email},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert len(resp.json()[\"data\"]) == 2\n    assert EmailAddress.objects.filter(user=user).count() == 1\n    code = get_last_email_verification_code(auth_client, mailoutbox)\n    resp = auth_client.post(\n        headless_reverse(\"headless:account:verify_email\"),\n        data={\"key\": code},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\n        \"status\": HTTPStatus.BAD_REQUEST,\n        \"errors\": [\n            {\n                \"message\": \"A user is already registered with this email address.\",\n                \"code\": \"email_taken\",\n                \"param\": \"key\",\n            }\n        ],\n    }\n\n\ndef test_change_email_by_code(\n    settings,\n    auth_client,\n    user,\n    email_factory,\n    headless_reverse,\n    user_factory,\n    get_last_email_verification_code,\n    mailoutbox,\n):\n    settings.ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True\n    settings.ACCOUNT_CHANGE_EMAIL = True\n    new_email = email_factory()\n    resp = auth_client.post(\n        headless_reverse(\"headless:account:manage_email\"),\n        data={\"email\": new_email},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert len(resp.json()[\"data\"]) == 2\n    assert EmailAddress.objects.filter(user=user).count() == 1\n    code = get_last_email_verification_code(auth_client, mailoutbox)\n    resp = auth_client.post(\n        headless_reverse(\"headless:account:verify_email\"),\n        data={\"key\": code},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert EmailAddress.objects.filter(user=user).count() == 1\n    assert EmailAddress.objects.filter(user=user, email=new_email).exists()\n\n\ndef test_change_email_at_signup(\n    settings,\n    client,\n    user,\n    email_factory,\n    headless_reverse,\n    user_factory,\n    get_last_email_verification_code,\n    mailoutbox,\n    password_factory,\n):\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True\n    settings.ACCOUNT_CHANGE_EMAIL = True\n    settings.ACCOUNT_EMAIL_VERIFICATION_SUPPORTS_CHANGE = True\n    email = email_factory()\n    resp = client.post(\n        headless_reverse(\"headless:account:signup\"),\n        data={\n            \"username\": \"wizard\",\n            \"email\": email,\n            \"password\": password_factory(),\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n\n    user = get_user_model().objects.last()\n    assert EmailAddress.objects.filter(user=user).count() == 1\n    assert EmailAddress.objects.filter(user=user, email=email, verified=False).exists()\n\n    new_email = email_factory()\n    resp = client.post(\n        headless_reverse(\"headless:account:manage_email\"),\n        data={\"email\": new_email},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert len(resp.json()[\"data\"]) == 1\n    assert EmailAddress.objects.filter(user=user).count() == 1\n    assert EmailAddress.objects.filter(\n        user=user, email=new_email, verified=False\n    ).exists()\n\n    code = get_last_email_verification_code(client, mailoutbox)\n    resp = client.post(\n        headless_reverse(\"headless:account:verify_email\"),\n        data={\"key\": code},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert EmailAddress.objects.filter(user=user).count() == 1\n    assert EmailAddress.objects.filter(\n        user=user, email=new_email, verified=True\n    ).exists()\n"
  },
  {
    "path": "tests/apps/headless/account/test_change_password.py",
    "content": "import copy\nfrom http import HTTPStatus\nfrom unittest.mock import ANY\n\nimport pytest\n\n\n@pytest.mark.parametrize(\n    \"has_password,request_data,response_data,status_code\",\n    [\n        # Wrong current password\n        (\n            True,\n            {\"current_password\": \"wrong\", \"new_password\": \"{password_factory}\"},\n            {\n                \"status\": HTTPStatus.BAD_REQUEST,\n                \"errors\": [\n                    {\n                        \"param\": \"current_password\",\n                        \"message\": \"Please type your current password.\",\n                        \"code\": \"enter_current_password\",\n                    }\n                ],\n            },\n            HTTPStatus.BAD_REQUEST,\n        ),\n        # Happy flow, regular password change\n        (\n            True,\n            {\n                \"current_password\": \"{user_password}\",\n                \"new_password\": \"{password_factory}\",\n            },\n            {\n                \"status\": HTTPStatus.OK,\n                \"meta\": {\"is_authenticated\": True},\n                \"data\": {\n                    \"user\": ANY,\n                    \"methods\": [],\n                },\n            },\n            HTTPStatus.OK,\n        ),\n        # New password does not match constraints\n        (\n            True,\n            {\n                \"current_password\": \"{user_password}\",\n                \"new_password\": \"a\",\n            },\n            {\n                \"status\": HTTPStatus.BAD_REQUEST,\n                \"errors\": [\n                    {\n                        \"param\": \"new_password\",\n                        \"code\": \"password_too_short\",\n                        \"message\": \"This password is too short. It must contain at least 6 characters.\",\n                    }\n                ],\n            },\n            HTTPStatus.BAD_REQUEST,\n        ),\n        # New password not empty\n        (\n            True,\n            {\n                \"current_password\": \"{user_password}\",\n                \"new_password\": \"\",\n            },\n            {\n                \"status\": HTTPStatus.BAD_REQUEST,\n                \"errors\": [\n                    {\n                        \"param\": \"new_password\",\n                        \"code\": \"required\",\n                        \"message\": \"This field is required.\",\n                    }\n                ],\n            },\n            HTTPStatus.BAD_REQUEST,\n        ),\n        # Current password not blank\n        (\n            True,\n            {\n                \"current_password\": \"\",\n                \"new_password\": \"{password_factory}\",\n            },\n            {\n                \"status\": HTTPStatus.BAD_REQUEST,\n                \"errors\": [\n                    {\n                        \"param\": \"current_password\",\n                        \"message\": \"This field is required.\",\n                        \"code\": \"required\",\n                    }\n                ],\n            },\n            HTTPStatus.BAD_REQUEST,\n        ),\n        # Current password missing\n        (\n            True,\n            {\n                \"new_password\": \"{password_factory}\",\n            },\n            {\n                \"status\": HTTPStatus.BAD_REQUEST,\n                \"errors\": [\n                    {\n                        \"param\": \"current_password\",\n                        \"message\": \"This field is required.\",\n                        \"code\": \"required\",\n                    }\n                ],\n            },\n            HTTPStatus.BAD_REQUEST,\n        ),\n        # Current password not set, happy flow\n        (\n            False,\n            {\n                \"current_password\": \"\",\n                \"new_password\": \"{password_factory}\",\n            },\n            {\n                \"status\": HTTPStatus.OK,\n                \"meta\": {\"is_authenticated\": True},\n                \"data\": {\n                    \"user\": ANY,\n                    \"methods\": [],\n                },\n            },\n            HTTPStatus.OK,\n        ),\n        # Current password not set, current_password absent\n        (\n            False,\n            {\n                \"new_password\": \"{password_factory}\",\n            },\n            {\n                \"status\": HTTPStatus.OK,\n                \"meta\": {\"is_authenticated\": True},\n                \"data\": {\n                    \"user\": ANY,\n                    \"methods\": [],\n                },\n            },\n            HTTPStatus.OK,\n        ),\n    ],\n)\ndef test_change_password(\n    auth_client,\n    user,\n    request_data,\n    response_data,\n    status_code,\n    has_password,\n    user_password,\n    password_factory,\n    settings,\n    mailoutbox,\n    headless_reverse,\n    headless_client,\n):\n    request_data = copy.deepcopy(request_data)\n    response_data = copy.deepcopy(response_data)\n    settings.ACCOUNT_EMAIL_NOTIFICATIONS = True\n    if not has_password:\n        user.set_unusable_password()\n        user.save(update_fields=[\"password\"])\n        auth_client.force_login(user)\n    if request_data.get(\"current_password\") == \"{user_password}\":\n        request_data[\"current_password\"] = user_password\n    if request_data.get(\"new_password\") == \"{password_factory}\":\n        request_data[\"new_password\"] = password_factory()\n    resp = auth_client.post(\n        headless_reverse(\"headless:account:change_password\"),\n        data=request_data,\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == status_code\n    resp_json = resp.json()\n    if headless_client == \"app\" and resp.status_code == HTTPStatus.OK:\n        response_data[\"meta\"][\"session_token\"] = ANY\n    assert resp_json == response_data\n    user.refresh_from_db()\n    if resp.status_code == HTTPStatus.OK:\n        assert user.check_password(request_data[\"new_password\"])\n        assert len(mailoutbox) == 1\n    else:\n        assert user.check_password(user_password)\n        assert len(mailoutbox) == 0\n\n\ndef test_change_password_rate_limit(\n    enable_cache,\n    auth_client,\n    user,\n    user_password,\n    password_factory,\n    settings,\n    headless_reverse,\n):\n    settings.ACCOUNT_RATE_LIMITS = {\"change_password\": \"1/m/ip\"}\n    for attempt in range(2):\n        new_password = password_factory()\n        resp = auth_client.post(\n            headless_reverse(\"headless:account:change_password\"),\n            data={\n                \"current_password\": user_password,\n                \"new_password\": new_password,\n            },\n            content_type=\"application/json\",\n        )\n        user_password = new_password\n        expected_status = (\n            HTTPStatus.OK if attempt == 0 else HTTPStatus.TOO_MANY_REQUESTS\n        )\n        assert resp.status_code == expected_status\n        assert resp.json()[\"status\"] == expected_status\n"
  },
  {
    "path": "tests/apps/headless/account/test_email_verification.py",
    "content": "from http import HTTPStatus\n\nimport pytest\n\nfrom allauth.account.models import (\n    EmailAddress,\n    EmailConfirmationHMAC,\n    get_emailconfirmation_model,\n)\nfrom allauth.headless.constants import Flow\n\n\ndef test_verify_email_other_user(auth_client, user, user_factory, headless_reverse):\n    other_user = user_factory(email_verified=False)\n    email_address = EmailAddress.objects.get(user=other_user, verified=False)\n    assert not email_address.verified\n    key = EmailConfirmationHMAC(email_address).key\n    resp = auth_client.post(\n        headless_reverse(\"headless:account:verify_email\"),\n        data={\"key\": key},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    # We're still authenticated as the user originally logged in, not the\n    # other_user.\n    assert data[\"data\"][\"user\"][\"id\"] == user.pk\n\n\n@pytest.mark.parametrize(\n    \"login_on_email_verification,status_code\",\n    [(False, HTTPStatus.UNAUTHORIZED), (True, HTTPStatus.OK)],\n)\ndef test_auth_unverified_email(\n    client,\n    user_factory,\n    password_factory,\n    settings,\n    headless_reverse,\n    login_on_email_verification,\n    status_code,\n):\n    settings.ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = login_on_email_verification\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    password = password_factory()\n    user = user_factory(email_verified=False, password=password)\n    resp = client.post(\n        headless_reverse(\"headless:account:login\"),\n        data={\n            \"email\": user.email,\n            \"password\": password,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    data = resp.json()\n    flows = data[\"data\"][\"flows\"]\n    assert [f for f in flows if f[\"id\"] == Flow.VERIFY_EMAIL][0][\"is_pending\"]\n    emailaddress = EmailAddress.objects.filter(user=user, verified=False).get()\n    key = get_emailconfirmation_model().create(emailaddress).key\n    resp = client.post(\n        headless_reverse(\"headless:account:verify_email\"),\n        data={\"key\": key},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == status_code\n\n\ndef test_verify_email_bad_key(\n    client, settings, password_factory, user_factory, headless_reverse\n):\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    password = password_factory()\n    user = user_factory(email_verified=False, password=password)\n    resp = client.post(\n        headless_reverse(\"headless:account:login\"),\n        data={\n            \"email\": user.email,\n            \"password\": password,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    resp = client.get(\n        headless_reverse(\"headless:account:verify_email\"),\n        data={\"key\": \"bad\"},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    resp = client.post(\n        headless_reverse(\"headless:account:verify_email\"),\n        data={\"key\": \"bad\"},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\n        \"status\": HTTPStatus.BAD_REQUEST,\n        \"errors\": [\n            {\n                \"code\": \"invalid_or_expired_key\",\n                \"param\": \"key\",\n                \"message\": \"Invalid or expired key.\",\n            }\n        ],\n    }\n"
  },
  {
    "path": "tests/apps/headless/account/test_email_verification_by_code.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY\n\nfrom django.contrib.auth.models import User\n\nimport pytest\nfrom pytest_django.asserts import assertTemplateNotUsed, assertTemplateUsed\n\nfrom allauth.account import app_settings\nfrom allauth.account.models import EmailAddress\nfrom allauth.headless.constants import Flow\n\n\ndef test_email_verification_rate_limits_login(\n    client,\n    db,\n    user_password,\n    settings,\n    user_factory,\n    password_factory,\n    enable_cache,\n    headless_reverse,\n):\n    settings.ACCOUNT_AUTHENTICATION_METHOD = \"email\"\n    settings.ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.ACCOUNT_RATE_LIMITS = {\"confirm_email\": \"1/m/key\"}\n    email = \"user@email.org\"\n    user_factory(email=email, email_verified=False, password=user_password)\n    for attempt in range(2):\n        resp = client.post(\n            headless_reverse(\"headless:account:login\"),\n            data={\n                \"email\": email,\n                \"password\": user_password,\n            },\n            content_type=\"application/json\",\n        )\n        if attempt == 0:\n            assert resp.status_code == HTTPStatus.UNAUTHORIZED\n            flow = [\n                flow for flow in resp.json()[\"data\"][\"flows\"] if flow.get(\"is_pending\")\n            ][0]\n            assert flow[\"id\"] == Flow.VERIFY_EMAIL\n        else:\n            assert resp.status_code == HTTPStatus.BAD_REQUEST\n            assert resp.json() == {\n                \"status\": HTTPStatus.BAD_REQUEST,\n                \"errors\": [\n                    {\n                        \"message\": \"Too many failed login attempts. Try again later.\",\n                        \"code\": \"too_many_login_attempts\",\n                    }\n                ],\n            }\n\n\n@pytest.mark.parametrize(\"method\", [\"GET\", \"POST\"])\ndef test_email_verification_rate_limits_submitting_codes(\n    client,\n    db,\n    user_password,\n    settings,\n    user_factory,\n    password_factory,\n    enable_cache,\n    headless_reverse,\n    method,\n):\n    settings.ACCOUNT_AUTHENTICATION_METHOD = \"email\"\n    settings.ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.ACCOUNT_RATE_LIMITS = {\"confirm_email\": \"1/m/key\"}\n    email = \"user@email.org\"\n    user_factory(email=email, email_verified=False, password=user_password)\n    resp = client.post(\n        headless_reverse(\"headless:account:login\"),\n        data={\n            \"email\": email,\n            \"password\": user_password,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    flow = [flow for flow in resp.json()[\"data\"][\"flows\"] if flow.get(\"is_pending\")][0]\n    assert flow[\"id\"] == Flow.VERIFY_EMAIL\n\n    for i in range(app_settings.EMAIL_VERIFICATION_BY_CODE_MAX_ATTEMPTS):\n        if method == \"GET\":\n            resp = client.get(\n                headless_reverse(\"headless:account:verify_email\"),\n                HTTP_X_EMAIL_VERIFICATION_KEY=\"123\",\n            )\n        else:\n            resp = client.post(\n                headless_reverse(\"headless:account:verify_email\"),\n                data={\n                    \"key\": \"123\",\n                },\n                content_type=\"application/json\",\n            )\n        if i < app_settings.EMAIL_VERIFICATION_BY_CODE_MAX_ATTEMPTS:\n            assert resp.json() == {\n                \"status\": HTTPStatus.BAD_REQUEST,\n                \"errors\": [\n                    {\n                        \"message\": \"Incorrect code.\",\n                        \"code\": \"incorrect_code\",\n                        \"param\": \"key\",\n                    }\n                ],\n            }\n            assert resp.status_code == HTTPStatus.BAD_REQUEST\n        else:\n            assert resp.status_code == HTTPStatus.CONFLICT\n\n\ndef test_add_email(\n    auth_client,\n    user,\n    email_factory,\n    headless_reverse,\n    settings,\n    get_last_email_verification_code,\n    mailoutbox,\n):\n    settings.ACCOUNT_AUTHENTICATION_METHOD = \"email\"\n    settings.ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True\n    settings.ACCOUNT_CHANGE_EMAIL = True\n    new_email = email_factory()\n\n    # Let's add an email...\n    resp = auth_client.post(\n        headless_reverse(\"headless:account:manage_email\"),\n        data={\"email\": new_email},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n\n    assertTemplateNotUsed(resp, \"account/email/email_confirmation_signup_message.txt\")\n    assertTemplateUsed(resp, \"account/email/email_confirmation_message.txt\")\n\n    # It's in the response, albeit unverified.\n    assert len(resp.json()[\"data\"]) == 2\n    email_map = {addr[\"email\"]: addr for addr in resp.json()[\"data\"]}\n    assert not email_map[new_email][\"verified\"]\n\n    # Verify the email with an invalid code.\n    resp = auth_client.post(\n        headless_reverse(\"headless:account:verify_email\"),\n        data={\"key\": \"key\"},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\n        \"status\": HTTPStatus.BAD_REQUEST,\n        \"errors\": [\n            {\"message\": \"Incorrect code.\", \"code\": \"incorrect_code\", \"param\": \"key\"}\n        ],\n    }\n\n    # And with the valid code...\n    code = get_last_email_verification_code(auth_client, mailoutbox)\n    resp = auth_client.post(\n        headless_reverse(\"headless:account:verify_email\"),\n        data={\"key\": code},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.json()[\"data\"][\"user\"][\"email\"] == new_email\n\n    # ACCOUNT_CHANGE_EMAIL = True, so the other one is gone.\n    assert EmailAddress.objects.filter(user=user).count() == 1\n\n    # Re-verification won't work...\n    resp = auth_client.post(\n        headless_reverse(\"headless:account:verify_email\"),\n        data={\"key\": code},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.CONFLICT\n\n\n@pytest.mark.parametrize(\"login_on_email_verification\", [False, True])\ndef test_signup_with_email_verification(\n    db,\n    client,\n    email_factory,\n    password_factory,\n    settings,\n    headless_reverse,\n    headless_client,\n    get_last_email_verification_code,\n    login_on_email_verification,\n    mailoutbox,\n):\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    # This setting should have no affect:\n    settings.ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = login_on_email_verification\n    settings.ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True\n    email = email_factory()\n    resp = client.post(\n        headless_reverse(\"headless:account:signup\"),\n        data={\n            \"email\": email,\n            \"password\": password_factory(),\n        },\n        content_type=\"application/json\",\n    )\n    assertTemplateUsed(resp, \"account/email/email_confirmation_signup_message.txt\")\n\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    assert User.objects.filter(email=email).exists()\n    data = resp.json()\n    flow = next(f for f in data[\"data\"][\"flows\"] if f.get(\"is_pending\"))\n    assert flow[\"id\"] == \"verify_email\"\n\n    code = get_last_email_verification_code(client, mailoutbox)\n    resp = client.get(\n        headless_reverse(\"headless:account:verify_email\"),\n        HTTP_X_EMAIL_VERIFICATION_KEY=code,\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.json() == {\n        \"data\": {\n            \"email\": email,\n            \"user\": ANY,\n        },\n        \"meta\": {\"is_authenticating\": True},\n        \"status\": HTTPStatus.OK,\n    }\n    resp = client.post(\n        headless_reverse(\"headless:account:verify_email\"),\n        data={\"key\": code},\n        content_type=\"application/json\",\n    )\n    addr = EmailAddress.objects.get(email=email)\n    assert addr.verified\n\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert data[\"meta\"][\"is_authenticated\"]\n\n\n@pytest.mark.parametrize(\"rate_limit_enabled\", [(False,), (True,)])\ndef test_resend_at_signup(\n    db,\n    client,\n    email_factory,\n    password_factory,\n    settings,\n    headless_reverse,\n    headless_client,\n    get_last_email_verification_code,\n    mailoutbox,\n    rate_limit_enabled,\n    request,\n):\n    if rate_limit_enabled:\n        request.getfixturevalue(\"enable_cache\")\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    # This setting should have no affect:\n    settings.ACCOUNT_EMAIL_VERIFICATION_SUPPORTS_RESEND = True\n    settings.ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True\n    email = email_factory()\n    resp = client.post(\n        headless_reverse(\"headless:account:signup\"),\n        data={\n            \"email\": email,\n            \"password\": password_factory(),\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    assert User.objects.filter(email=email).exists()\n    data = resp.json()\n    flow = next(f for f in data[\"data\"][\"flows\"] if f.get(\"is_pending\"))\n    assert flow[\"id\"] == \"verify_email\"\n\n    code = get_last_email_verification_code(client, mailoutbox)\n    resp = client.get(\n        headless_reverse(\"headless:account:verify_email\"),\n        HTTP_X_EMAIL_VERIFICATION_KEY=code,\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.json() == {\n        \"data\": {\n            \"email\": email,\n            \"user\": ANY,\n        },\n        \"meta\": {\"is_authenticating\": True},\n        \"status\": HTTPStatus.OK,\n    }\n    resp = client.post(\n        headless_reverse(\"headless:account:resend_email_verification_code\"),\n    )\n    if rate_limit_enabled:\n        assert resp.status_code == HTTPStatus.TOO_MANY_REQUESTS\n    else:\n        assert resp.status_code == HTTPStatus.OK\n\n        new_code = get_last_email_verification_code(client, mailoutbox)\n        assert code != new_code\n\n\ndef test_add_resend_verify_email(\n    auth_client,\n    user,\n    email_factory,\n    headless_reverse,\n    settings_impacting_urls,\n    get_last_email_verification_code,\n    mailoutbox,\n):\n    with settings_impacting_urls(\n        ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED=True,\n        ACCOUNT_EMAIL_VERIFICATION_SUPPORTS_RESEND=True,\n    ):\n        new_email = email_factory()\n        resp = auth_client.post(\n            headless_reverse(\"headless:account:manage_email\"),\n            data={\"email\": new_email},\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.OK\n        assert len(resp.json()[\"data\"]) == 2\n        assert len(mailoutbox) == 1\n        assert not EmailAddress.objects.filter(email=new_email, verified=False).exists()\n        code = get_last_email_verification_code(auth_client, mailoutbox)\n        resp = auth_client.put(\n            headless_reverse(\"headless:account:manage_email\"),\n            data={\"email\": new_email},\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.OK\n        assert len(mailoutbox) == 2\n\n        code2 = get_last_email_verification_code(auth_client, mailoutbox)\n        assert code != code2\n        resp = auth_client.post(\n            headless_reverse(\"headless:account:verify_email\"),\n            data={\"key\": code2},\n            content_type=\"application/json\",\n        )\n        assert EmailAddress.objects.filter(email=new_email, verified=True).exists()\n\n\ndef test_remove_unverified_email(\n    auth_client,\n    user,\n    email_factory,\n    headless_reverse,\n    settings,\n    get_last_email_verification_code,\n    mailoutbox,\n):\n    settings.ACCOUNT_AUTHENTICATION_METHOD = \"email\"\n    settings.ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True\n    settings.ACCOUNT_CHANGE_EMAIL = True\n    new_email = email_factory()\n\n    # Let's add an email...\n    resp = auth_client.post(\n        headless_reverse(\"headless:account:manage_email\"),\n        data={\"email\": new_email},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n\n    # It's in the response, albeit unverified.\n    assert len(resp.json()[\"data\"]) == 2\n    email_map = {addr[\"email\"]: addr for addr in resp.json()[\"data\"]}\n    assert not email_map[new_email][\"verified\"]\n\n    # Delete the pending email.\n    resp = auth_client.delete(\n        headless_reverse(\"headless:account:manage_email\"),\n        data={\"email\": new_email},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert len(resp.json()[\"data\"]) == 1\n    assert new_email not in {addr[\"email\"] for addr in resp.json()[\"data\"]}\n"
  },
  {
    "path": "tests/apps/headless/account/test_login.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY\n\nimport pytest\n\nfrom allauth.account.signals import user_logged_in\nfrom allauth.headless.base.response import AuthenticationResponse\n\n\ndef test_auth_password_input_error(headless_reverse, client):\n    resp = client.post(\n        headless_reverse(\"headless:account:login\"),\n        data={},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\n        \"status\": HTTPStatus.BAD_REQUEST,\n        \"errors\": [\n            {\n                \"message\": \"This field is required.\",\n                \"code\": \"required\",\n                \"param\": \"username\",\n            },\n            {\n                \"message\": \"This field is required.\",\n                \"code\": \"required\",\n                \"param\": \"password\",\n            },\n        ],\n    }\n\n\ndef test_auth_password_bad_password(headless_reverse, client, user, settings):\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    resp = client.post(\n        headless_reverse(\"headless:account:login\"),\n        data={\n            \"email\": user.email,\n            \"password\": \"wrong\",\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\n        \"status\": HTTPStatus.BAD_REQUEST,\n        \"errors\": [\n            {\n                \"param\": \"password\",\n                \"message\": \"The email address and/or password you specified are not correct.\",\n                \"code\": \"email_password_mismatch\",\n            }\n        ],\n    }\n\n\ndef test_auth_password_success(\n    client, user, user_password, settings, headless_reverse, headless_client\n):\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\", \"username\"}\n    login_resp = client.post(\n        headless_reverse(\"headless:account:login\"),\n        data={\n            \"email\": user.email,\n            \"password\": user_password,\n        },\n        content_type=\"application/json\",\n    )\n    assert login_resp.status_code == HTTPStatus.OK\n    session_resp = client.get(\n        headless_reverse(\"headless:account:current_session\"),\n        content_type=\"application/json\",\n    )\n    assert session_resp.status_code == HTTPStatus.OK\n    for resp in [login_resp, session_resp]:\n        extra_meta = {}\n        if headless_client == \"app\" and resp == login_resp:\n            # The session is created on first login, and hence the token is\n            # exposed only at that moment.\n            extra_meta[\"session_token\"] = ANY\n        assert resp.json() == {\n            \"status\": HTTPStatus.OK,\n            \"data\": {\n                \"user\": {\n                    \"id\": user.pk,\n                    \"display\": str(user),\n                    \"email\": user.email,\n                    \"username\": user.username,\n                    \"has_usable_password\": True,\n                },\n                \"methods\": [\n                    {\n                        \"at\": ANY,\n                        \"email\": user.email,\n                        \"method\": \"password\",\n                    }\n                ],\n            },\n            \"meta\": {\"is_authenticated\": True, **extra_meta},\n        }\n\n\n@pytest.mark.parametrize(\n    \"is_active,status_code\", [(False, HTTPStatus.UNAUTHORIZED), (True, HTTPStatus.OK)]\n)\ndef test_auth_password_user_inactive(\n    client, user, user_password, settings, status_code, is_active, headless_reverse\n):\n    user.is_active = is_active\n    user.save(update_fields=[\"is_active\"])\n    resp = client.post(\n        headless_reverse(\"headless:account:login\"),\n        data={\n            \"username\": user.username,\n            \"password\": user_password,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == status_code\n\n\ndef test_login_failed_rate_limit(\n    client,\n    user,\n    settings,\n    headless_reverse,\n    headless_client,\n    enable_cache,\n):\n    settings.ACCOUNT_RATE_LIMITS = {\"login_failed\": \"1/m/ip\"}\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    for attempt in range(2):\n        resp = client.post(\n            headless_reverse(\"headless:account:login\"),\n            data={\n                \"email\": user.email,\n                \"password\": \"wrong\",\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.BAD_REQUEST\n        assert resp.json()[\"errors\"] == [\n            (\n                {\n                    \"code\": \"email_password_mismatch\",\n                    \"message\": \"The email address and/or password you specified are not correct.\",\n                    \"param\": \"password\",\n                }\n                if attempt == 0\n                else {\n                    \"message\": \"Too many failed login attempts. Try again later.\",\n                    \"code\": \"too_many_login_attempts\",\n                }\n            )\n        ]\n\n\ndef test_login_rate_limit(\n    client,\n    user,\n    user_password,\n    settings,\n    headless_reverse,\n    headless_client,\n    enable_cache,\n):\n    settings.ACCOUNT_RATE_LIMITS = {\"login\": \"1/m/ip\"}\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    for attempt in range(2):\n        resp = client.post(\n            headless_reverse(\"headless:account:login\"),\n            data={\n                \"email\": user.email,\n                \"password\": user_password,\n            },\n            content_type=\"application/json\",\n        )\n        expected_status = HTTPStatus.TOO_MANY_REQUESTS if attempt else HTTPStatus.OK\n        assert resp.status_code == expected_status\n\n\ndef test_login_already_logged_in(\n    auth_client, user, user_password, settings, headless_reverse\n):\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    resp = auth_client.post(\n        headless_reverse(\"headless:account:login\"),\n        data={\n            \"email\": user.email,\n            \"password\": user_password,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.CONFLICT\n\n\ndef test_custom_post_login_response(\n    settings, client, headless_reverse, user, user_password\n):\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n\n    def on_user_logged_in(**kwargs):\n        response = kwargs[\"response\"]\n        assert isinstance(response, AuthenticationResponse)\n\n    user_logged_in.connect(on_user_logged_in)\n    try:\n        login_resp = client.post(\n            headless_reverse(\"headless:account:login\"),\n            data={\n                \"email\": user.email,\n                \"password\": user_password,\n            },\n            content_type=\"application/json\",\n        )\n        assert login_resp.status_code == HTTPStatus.OK\n    finally:\n        user_logged_in.disconnect(on_user_logged_in)\n"
  },
  {
    "path": "tests/apps/headless/account/test_login_by_code.py",
    "content": "import time\nfrom http import HTTPStatus\n\nimport pytest\n\nfrom allauth.account.internal.stagekit import LOGIN_SESSION_KEY\nfrom allauth.account.models import EmailAddress\nfrom allauth.account.stages import LoginByCodeStage\nfrom allauth.headless.constants import Flow\n\n\n@pytest.fixture\ndef get_last_login_code(mailoutbox):\n    def f():\n        return [line for line in mailoutbox[-1].body.splitlines() if len(line) == 9][0]\n\n    return f\n\n\ndef test_login_by_code(headless_reverse, user, client, mailoutbox, get_last_login_code):\n    resp = client.post(\n        headless_reverse(\"headless:account:request_login_code\"),\n        data={\"email\": user.email},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    data = resp.json()\n    assert [f for f in data[\"data\"][\"flows\"] if f[\"id\"] == Flow.LOGIN_BY_CODE][0][\n        \"is_pending\"\n    ]\n    assert len(mailoutbox) == 1\n    code = get_last_login_code()\n    resp = client.post(\n        headless_reverse(\"headless:account:confirm_login_code\"),\n        data={\"code\": code},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert data[\"meta\"][\"is_authenticated\"]\n\n\ndef test_login_by_code_rate_limit(\n    headless_reverse, user, client, mailoutbox, settings, enable_cache\n):\n    settings.ACCOUNT_RATE_LIMITS = {\"request_login_code\": \"1/m/ip\"}\n    for attempt in range(2):\n        resp = client.post(\n            headless_reverse(\"headless:account:request_login_code\"),\n            data={\"email\": user.email},\n            content_type=\"application/json\",\n        )\n        expected_code = HTTPStatus.BAD_REQUEST if attempt else HTTPStatus.UNAUTHORIZED\n        assert resp.status_code == expected_code\n        data = resp.json()\n        assert data[\"status\"] == expected_code\n        if expected_code == HTTPStatus.BAD_REQUEST:\n            assert data[\"errors\"] == [\n                {\n                    \"code\": \"too_many_login_attempts\",\n                    \"message\": \"Too many failed login attempts. Try again later.\",\n                    \"param\": \"email\",\n                },\n            ]\n\n\ndef test_login_by_code_max_attemps(headless_reverse, user, client, settings):\n    settings.ACCOUNT_LOGIN_BY_CODE_MAX_ATTEMPTS = 2\n    resp = client.post(\n        headless_reverse(\"headless:account:request_login_code\"),\n        data={\"email\": user.email},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    for i in range(3):\n        resp = client.post(\n            headless_reverse(\"headless:account:confirm_login_code\"),\n            data={\"code\": \"wrong\"},\n            content_type=\"application/json\",\n        )\n        session_resp = client.get(\n            headless_reverse(\"headless:account:current_session\"),\n            data={\"code\": \"wrong\"},\n            content_type=\"application/json\",\n        )\n        assert session_resp.status_code == HTTPStatus.UNAUTHORIZED\n        pending_flows = [\n            f for f in session_resp.json()[\"data\"][\"flows\"] if f.get(\"is_pending\")\n        ]\n        if i >= 1:\n            assert (\n                resp.status_code == HTTPStatus.CONFLICT\n                if i >= 2\n                else HTTPStatus.BAD_REQUEST\n            )\n            assert len(pending_flows) == 0\n        else:\n            assert resp.status_code == HTTPStatus.BAD_REQUEST\n            assert len(pending_flows) == 1\n\n\ndef test_login_by_code_required(\n    client, settings, user_factory, password_factory, headless_reverse, mailoutbox\n):\n    settings.ACCOUNT_LOGIN_BY_CODE_REQUIRED = True\n    password = password_factory()\n    user = user_factory(password=password, email_verified=False)\n    email_address = EmailAddress.objects.get(email=user.email)\n    assert not email_address.verified\n    resp = client.post(\n        headless_reverse(\"headless:account:login\"),\n        data={\n            \"username\": user.username,\n            \"password\": password,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    pending_flow = [f for f in resp.json()[\"data\"][\"flows\"] if f.get(\"is_pending\")][0][\n        \"id\"\n    ]\n    assert pending_flow == Flow.LOGIN_BY_CODE\n    code = [line for line in mailoutbox[0].body.splitlines() if len(line) == 9][0]\n    resp = client.post(\n        headless_reverse(\"headless:account:confirm_login_code\"),\n        data={\"code\": code},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert data[\"meta\"][\"is_authenticated\"]\n    email_address.refresh_from_db()\n    assert email_address.verified\n\n\ndef test_login_by_code_expired(headless_reverse, user, client, mailoutbox):\n    resp = client.post(\n        headless_reverse(\"headless:account:request_login_code\"),\n        data={\"email\": user.email},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    data = resp.json()\n    assert [f for f in data[\"data\"][\"flows\"] if f[\"id\"] == Flow.LOGIN_BY_CODE][0][\n        \"is_pending\"\n    ]\n    assert len(mailoutbox) == 1\n    code = [line for line in mailoutbox[0].body.splitlines() if len(line) == 9][0]\n\n    # Expire code\n    session = client.headless_session()\n    login = session[LOGIN_SESSION_KEY]\n    login[\"state\"][\"stages\"][LoginByCodeStage.key][\"data\"][\"at\"] = (\n        time.time() - 24 * 60 * 60\n    )\n    session[\"account_login\"] = login\n    session.save()\n\n    # Post valid code\n    resp = client.post(\n        headless_reverse(\"headless:account:confirm_login_code\"),\n        data={\"code\": code},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.CONFLICT\n\n\ndef test_post_login_code_when_flow_not_pending(\n    db,\n    client,\n    settings_impacting_urls,\n    headless_reverse,\n    mailoutbox,\n    get_last_email_verification_code,\n):\n    with settings_impacting_urls(\n        ACCOUNT_LOGIN_METHODS={\"email\"},\n        ACCOUNT_SIGNUP_FIELDS=[\"email*\"],\n        ACCOUNT_EMAIL_VERIFICATION=\"mandatory\",\n        ACCOUNT_LOGIN_BY_CODE_ENABLED=True,\n        ACCOUNT_LOGIN_BY_CODE_REQUIRED=False,\n        ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED=True,\n    ):\n        resp = client.post(\n            headless_reverse(\"headless:account:signup\"),\n            data={\"email\": \"user@email.org\"},\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.UNAUTHORIZED\n        resp = client.post(\n            headless_reverse(\"headless:account:confirm_login_code\"),\n            data={\"code\": \"123\"},\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.CONFLICT\n\n\ndef test_login_by_code_resend_limited(\n    settings, headless_reverse, user, client, mailoutbox, get_last_login_code\n):\n    settings.ACCOUNT_LOGIN_BY_CODE_SUPPORTS_RESEND = 2\n    resp = client.post(\n        headless_reverse(\"headless:account:request_login_code\"),\n        data={\"email\": user.email},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    code = get_last_login_code()\n    for i in range(3):\n        resp = client.post(\n            headless_reverse(\"headless:account:resend_login_code\"),\n        )\n        assert resp.status_code == (HTTPStatus.CONFLICT if i == 2 else HTTPStatus.OK)\n        new_code = get_last_login_code()\n        if i == 2:\n            assert new_code == code\n        else:\n            assert new_code != code\n            code = new_code\n"
  },
  {
    "path": "tests/apps/headless/account/test_phone.py",
    "content": "from http import HTTPStatus\n\nfrom django.contrib.auth import get_user_model\n\nimport pytest\n\nfrom allauth.account.adapter import get_adapter as get_account_adapter\n\n\ndef test_change_phone_to_same(\n    auth_client, user_with_phone, phone, settings_impacting_urls, headless_reverse\n):\n    with settings_impacting_urls(\n        ACCOUNT_SIGNUP_FIELDS=[\"phone*\"],\n        ACCOUNT_LOGIN_METHODS=(\"phone\",),\n    ):\n        resp = auth_client.post(\n            headless_reverse(\"headless:account:manage_phone\"),\n            data={\n                \"phone\": phone,\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.BAD_REQUEST\n        assert resp.json() == {\n            \"errors\": [\n                {\n                    \"code\": \"same_as_current\",\n                    \"message\": \"The new value must be different from the current one.\",\n                    \"param\": \"phone\",\n                }\n            ],\n            \"status\": HTTPStatus.BAD_REQUEST,\n        }\n\n\ndef test_change_phone(\n    auth_client,\n    user_with_phone,\n    phone,\n    settings_impacting_urls,\n    headless_reverse,\n    phone_factory,\n    sms_outbox,\n):\n    with settings_impacting_urls(\n        ACCOUNT_SIGNUP_FIELDS=[\"phone*\"],\n        ACCOUNT_LOGIN_METHODS=(\"phone\",),\n    ):\n        new_phone = phone_factory()\n        resp = auth_client.post(\n            headless_reverse(\"headless:account:manage_phone\"),\n            data={\n                \"phone\": new_phone,\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.ACCEPTED\n        assert resp.json() == {\n            \"data\": [\n                {\n                    \"phone\": new_phone,\n                    \"verified\": False,\n                },\n            ],\n            \"status\": HTTPStatus.ACCEPTED,\n        }\n\n        resp = auth_client.post(\n            headless_reverse(\"headless:account:verify_phone\"),\n            data={\n                \"code\": sms_outbox[-1][\"code\"],\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.OK\n\n        resp = auth_client.post(\n            headless_reverse(\"headless:account:verify_phone\"),\n            data={\n                \"code\": sms_outbox[-1][\"code\"],\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.CONFLICT\n\n        resp = auth_client.get(\n            headless_reverse(\"headless:account:manage_phone\"),\n            content_type=\"application/json\",\n        )\n        assert resp.json() == {\n            \"data\": [\n                {\n                    \"phone\": new_phone,\n                    \"verified\": True,\n                },\n            ],\n            \"status\": HTTPStatus.OK,\n        }\n\n\ndef test_login(\n    client,\n    user_with_phone,\n    phone,\n    user_password,\n    headless_reverse,\n    settings_impacting_urls,\n):\n    with settings_impacting_urls(\n        ACCOUNT_SIGNUP_FIELDS=[\"phone*\", \"password1*\"],\n        ACCOUNT_LOGIN_METHODS=(\"phone\",),\n    ):\n        resp = client.post(\n            headless_reverse(\"headless:account:login\"),\n            data={\"phone\": phone, \"password\": user_password},\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.OK\n\n\ndef test_login_by_code(\n    client,\n    user_with_phone,\n    phone,\n    headless_reverse,\n    settings_impacting_urls,\n    sms_outbox,\n):\n    with settings_impacting_urls(\n        ACCOUNT_SIGNUP_FIELDS=[\"phone*\"],\n        ACCOUNT_LOGIN_METHODS=(\"phone\",),\n    ):\n        resp = client.post(\n            headless_reverse(\"headless:account:request_login_code\"),\n            data={\n                \"phone\": phone,\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.UNAUTHORIZED\n        code = sms_outbox[-1][\"code\"]\n        resp = client.post(\n            headless_reverse(\"headless:account:confirm_login_code\"),\n            data={\"code\": code},\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.OK\n        data = resp.json()\n        assert data[\"meta\"][\"is_authenticated\"]\n\n\ndef test_signup(\n    db,\n    client,\n    settings_impacting_urls,\n    phone,\n    headless_reverse,\n    headless_client,\n    password_factory,\n    sms_outbox,\n):\n    with settings_impacting_urls(\n        ACCOUNT_SIGNUP_FIELDS=[\"phone*\", \"password1*\"],\n        ACCOUNT_LOGIN_METHODS=(\"phone\",),\n    ):\n        resp = client.post(\n            headless_reverse(\"headless:account:signup\"),\n            data={\n                \"phone\": phone,\n                \"password\": password_factory(),\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.UNAUTHORIZED\n        pending_flow = [\n            flow for flow in resp.json()[\"data\"][\"flows\"] if flow.get(\"is_pending\")\n        ][0]\n        assert pending_flow[\"id\"] == \"verify_phone\"\n        assert len(sms_outbox) == 1\n        code = sms_outbox[-1][\"code\"]\n        resp = client.post(\n            headless_reverse(\"headless:account:verify_phone\"),\n            data={\n                \"code\": code,\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.json()[\"status\"] == HTTPStatus.OK\n\n\ndef test_reauthentication(\n    auth_client,\n    user_with_phone,\n    phone,\n    settings_impacting_urls,\n    headless_reverse,\n    phone_factory,\n    sms_outbox,\n):\n    with settings_impacting_urls(\n        ACCOUNT_REAUTHENTICATION_REQUIRED=True,\n        ACCOUNT_SIGNUP_FIELDS=[\"phone*\"],\n        ACCOUNT_LOGIN_METHODS=(\"phone\",),\n    ):\n        new_phone = phone_factory()\n        resp = auth_client.post(\n            headless_reverse(\"headless:account:manage_phone\"),\n            data={\n                \"phone\": new_phone,\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.UNAUTHORIZED\n        assert resp.json()[\"data\"][\"flows\"] == [{\"id\": \"reauthenticate\"}]\n\n\ndef test_change_phone_to_conflicting(\n    auth_client,\n    user_with_phone,\n    phone,\n    settings_impacting_urls,\n    headless_reverse,\n    user_factory,\n    phone_factory,\n    sms_outbox,\n):\n    other_phone = phone_factory()\n    user_factory(phone=other_phone)\n    with settings_impacting_urls(\n        ACCOUNT_SIGNUP_FIELDS=[\"phone*\"],\n        ACCOUNT_LOGIN_METHODS=(\"phone\",),\n    ):\n        resp = auth_client.post(\n            headless_reverse(\"headless:account:manage_phone\"),\n            data={\n                \"phone\": other_phone,\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.ACCEPTED\n        assert resp.json() == {\n            \"data\": [{\"phone\": other_phone, \"verified\": False}],\n            \"status\": HTTPStatus.ACCEPTED,\n        }\n        resp = auth_client.post(\n            headless_reverse(\"headless:account:verify_phone\"),\n            data={\n                \"code\": sms_outbox[-1][\"code\"],\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.BAD_REQUEST\n        assert resp.json() == {\n            \"errors\": [\n                {\n                    \"code\": \"phone_taken\",\n                    \"message\": \"A user is already registered with this phone number.\",\n                    \"param\": \"code\",\n                }\n            ],\n            \"status\": HTTPStatus.BAD_REQUEST,\n        }\n\n\ndef test_change_at_signup(\n    db,\n    client,\n    settings_impacting_urls,\n    phone,\n    headless_reverse,\n    headless_client,\n    password_factory,\n    sms_outbox,\n    phone_factory,\n):\n    with settings_impacting_urls(\n        ACCOUNT_SIGNUP_FIELDS=[\"phone*\", \"password1*\"],\n        ACCOUNT_LOGIN_METHODS=(\"phone\",),\n        ACCOUNT_PHONE_VERIFICATION_SUPPORTS_CHANGE=True,\n    ):\n        resp = client.post(\n            headless_reverse(\"headless:account:signup\"),\n            data={\n                \"phone\": phone,\n                \"password\": password_factory(),\n            },\n            content_type=\"application/json\",\n        )\n        user = get_user_model().objects.last()\n        assert resp.status_code == HTTPStatus.UNAUTHORIZED\n        assert len(sms_outbox) == 1\n\n        new_phone = phone_factory()\n        resp = client.post(\n            headless_reverse(\"headless:account:manage_phone\"),\n            data={\n                \"phone\": new_phone,\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.ACCEPTED\n        assert resp.json() == {\n            \"data\": [\n                {\n                    \"phone\": new_phone,\n                    \"verified\": False,\n                },\n            ],\n            \"status\": HTTPStatus.ACCEPTED,\n        }\n\n        assert len(sms_outbox) == 2\n        code = sms_outbox[-1][\"code\"]\n        resp = client.post(\n            headless_reverse(\"headless:account:verify_phone\"),\n            data={\n                \"code\": code,\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.json()[\"status\"] == HTTPStatus.OK\n        assert get_account_adapter().get_phone(user) == (new_phone, True)\n\n\n@pytest.mark.parametrize(\"rate_limit_enabled\", [(False,), (True,)])\ndef test_resend_at_signup(\n    db,\n    client,\n    settings_impacting_urls,\n    phone,\n    headless_reverse,\n    headless_client,\n    password_factory,\n    sms_outbox,\n    phone_factory,\n    rate_limit_enabled,\n    request,\n):\n    if rate_limit_enabled:\n        request.getfixturevalue(\"enable_cache\")\n    with settings_impacting_urls(\n        ACCOUNT_SIGNUP_FIELDS=[\"phone*\", \"password1*\"],\n        ACCOUNT_LOGIN_METHODS=(\"phone\",),\n        ACCOUNT_PHONE_VERIFICATION_SUPPORTS_RESEND=True,\n    ):\n        resp = client.post(\n            headless_reverse(\"headless:account:signup\"),\n            data={\n                \"phone\": phone,\n                \"password\": password_factory(),\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.UNAUTHORIZED\n        assert len(sms_outbox) == 1\n\n        resp = client.post(\n            headless_reverse(\"headless:account:resend_phone_verification_code\"),\n        )\n        if rate_limit_enabled:\n            assert resp.status_code == HTTPStatus.TOO_MANY_REQUESTS\n        else:\n            assert resp.status_code == HTTPStatus.OK\n            assert len(sms_outbox) == 2\n\n            old_code = sms_outbox[0][\"code\"]\n            new_code = sms_outbox[1][\"code\"]\n            assert old_code != new_code\n\n\ndef test_manage_phone_anon_no_500(\n    client, db, settings_impacting_urls, headless_reverse\n):\n    with settings_impacting_urls(\n        ACCOUNT_SIGNUP_FIELDS=[\"phone*\"],\n        ACCOUNT_LOGIN_METHODS=(\"phone\",),\n    ):\n        resp = client.get(\n            headless_reverse(\"headless:account:manage_phone\"),\n        )\n        assert resp.status_code == HTTPStatus.UNAUTHORIZED\n"
  },
  {
    "path": "tests/apps/headless/account/test_reauthentication.py",
    "content": "from http import HTTPStatus\n\n\ndef test_reauthenticate(\n    auth_client, user, user_password, headless_reverse, headless_client\n):\n    resp = auth_client.get(\n        headless_reverse(\"headless:account:current_session\"),\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    method_count = len(data[\"data\"][\"methods\"])\n\n    resp = auth_client.post(\n        headless_reverse(\"headless:account:reauthenticate\"),\n        data={\n            \"password\": user_password,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n\n    resp = auth_client.get(\n        headless_reverse(\"headless:account:current_session\"),\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert len(data[\"data\"][\"methods\"]) == method_count + 1\n    last_method = data[\"data\"][\"methods\"][-1]\n    assert last_method[\"method\"] == \"password\"\n\n\ndef test_reauthenticate_rate_limit(\n    auth_client,\n    user,\n    user_password,\n    headless_reverse,\n    headless_client,\n    settings,\n    enable_cache,\n):\n    settings.ACCOUNT_RATE_LIMITS = {\"reauthenticate\": \"1/m/ip\"}\n    for attempt in range(4):\n        resp = auth_client.post(\n            headless_reverse(\"headless:account:reauthenticate\"),\n            data={\n                \"password\": user_password,\n            },\n            content_type=\"application/json\",\n        )\n        expected_status = HTTPStatus.TOO_MANY_REQUESTS if attempt else HTTPStatus.OK\n        assert resp.status_code == expected_status\n        assert resp.json()[\"status\"] == expected_status\n"
  },
  {
    "path": "tests/apps/headless/account/test_reset_password.py",
    "content": "from http import HTTPStatus\n\nfrom django.urls import reverse\n\nimport pytest\n\n\ndef test_password_reset_flow(\n    client, user, mailoutbox, password_factory, settings, headless_reverse\n):\n    settings.ACCOUNT_EMAIL_NOTIFICATIONS = True\n\n    resp = client.post(\n        headless_reverse(\"headless:account:request_password_reset\"),\n        data={\n            \"email\": user.email,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert len(mailoutbox) == 1\n    body = mailoutbox[0].body\n    # Extract URL for `password_reset_from_key` view\n    url = body[body.find(\"/password/reset/\") :].split()[0]\n    key = url.split(\"/\")[-2]\n    password = password_factory()\n\n    # Too simple password\n    resp = client.post(\n        headless_reverse(\"headless:account:reset_password\"),\n        data={\n            \"key\": key,\n            \"password\": \"a\",\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\n        \"status\": HTTPStatus.BAD_REQUEST,\n        \"errors\": [\n            {\n                \"code\": \"password_too_short\",\n                \"message\": \"This password is too short. It must contain at least 6 characters.\",\n                \"param\": \"password\",\n            }\n        ],\n    }\n\n    assert len(mailoutbox) == 1\n\n    # Success\n    resp = client.post(\n        headless_reverse(\"headless:account:reset_password\"),\n        data={\n            \"key\": key,\n            \"password\": password,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n\n    user.refresh_from_db()\n    assert user.check_password(password)\n    assert len(mailoutbox) == 2  # The security notification\n\n\n@pytest.mark.parametrize(\"method\", [\"get\", \"post\"])\ndef test_password_reset_flow_wrong_key(\n    client, password_factory, headless_reverse, method\n):\n    password = password_factory()\n\n    if method == \"get\":\n        resp = client.get(\n            headless_reverse(\"headless:account:reset_password\"),\n            HTTP_X_PASSWORD_RESET_KEY=\"wrong\",\n        )\n    else:\n        resp = client.post(\n            headless_reverse(\"headless:account:reset_password\"),\n            data={\n                \"key\": \"wrong\",\n                \"password\": password,\n            },\n            content_type=\"application/json\",\n        )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\n        \"status\": HTTPStatus.BAD_REQUEST,\n        \"errors\": [\n            {\n                \"param\": \"key\",\n                \"code\": \"invalid_password_reset\",\n                \"message\": \"The password reset token was invalid.\",\n            }\n        ],\n    }\n\n\ndef test_password_reset_flow_unknown_user(\n    client, db, mailoutbox, password_factory, settings, headless_reverse\n):\n    resp = client.post(\n        headless_reverse(\"headless:account:request_password_reset\"),\n        data={\n            \"email\": \"not@registered.org\",\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert len(mailoutbox) == 1\n    body = mailoutbox[0].body\n    if getattr(settings, \"HEADLESS_ONLY\", False):\n        assert settings.HEADLESS_FRONTEND_URLS[\"account_signup\"] in body\n    else:\n        assert reverse(\"account_signup\") in body\n\n\ndef test_reset_password_rate_limit(\n    auth_client, user, headless_reverse, settings, enable_cache\n):\n    settings.ACCOUNT_RATE_LIMITS = {\"reset_password\": \"1/m/ip\"}\n    for attempt in range(2):\n        resp = auth_client.post(\n            headless_reverse(\"headless:account:request_password_reset\"),\n            data={\"email\": user.email},\n            content_type=\"application/json\",\n        )\n        expected_status = (\n            HTTPStatus.OK if attempt == 0 else HTTPStatus.TOO_MANY_REQUESTS\n        )\n        assert resp.status_code == expected_status\n        assert resp.json()[\"status\"] == expected_status\n\n\ndef test_password_reset_key_rate_limit(\n    client,\n    user,\n    settings,\n    headless_reverse,\n    password_reset_key_generator,\n    enable_cache,\n):\n    settings.ACCOUNT_RATE_LIMITS = {\"reset_password_from_key\": \"1/m/ip\"}\n    for attempt in range(2):\n        resp = client.post(\n            headless_reverse(\"headless:account:reset_password\"),\n            data={\n                \"key\": password_reset_key_generator(user),\n                \"password\": \"a\",  # too short\n            },\n            content_type=\"application/json\",\n        )\n        expected_status = (\n            HTTPStatus.TOO_MANY_REQUESTS if attempt else HTTPStatus.BAD_REQUEST\n        )\n        assert resp.status_code == expected_status\n        assert resp.json()[\"status\"] == expected_status\n"
  },
  {
    "path": "tests/apps/headless/account/test_reset_password_by_code.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY\n\nimport pytest\n\nfrom allauth.account import app_settings\nfrom allauth.account.internal.flows.login import AUTHENTICATION_METHODS_SESSION_KEY\nfrom allauth.account.models import EmailAddress\n\n\n@pytest.fixture(autouse=True)\ndef prbc_settings(settings_impacting_urls):\n    with settings_impacting_urls(ACCOUNT_PASSWORD_RESET_BY_CODE_ENABLED=True):\n        yield\n\n\ndef test_validating_codes_by_get_is_limited(client, user, headless_reverse):\n    resp = client.post(\n        headless_reverse(\"headless:account:request_password_reset\"),\n        data={\n            \"email\": user.email,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    for i in range(app_settings.PASSWORD_RESET_BY_CODE_MAX_ATTEMPTS + 1):\n        resp = client.get(\n            headless_reverse(\"headless:account:reset_password\"),\n            HTTP_X_PASSWORD_RESET_KEY=f\"attempt{i}\",\n        )\n        if i < app_settings.PASSWORD_RESET_BY_CODE_MAX_ATTEMPTS:\n            expected_status = HTTPStatus.BAD_REQUEST\n        else:\n            expected_status = HTTPStatus.CONFLICT\n        assert resp.status_code == expected_status\n\n\ndef test_validating_codes_by_get_limitation_carriers_over_to_post(\n    client, user, headless_reverse\n):\n    resp = client.post(\n        headless_reverse(\"headless:account:request_password_reset\"),\n        data={\n            \"email\": user.email,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    for i in range(app_settings.PASSWORD_RESET_BY_CODE_MAX_ATTEMPTS):\n        resp = client.get(\n            headless_reverse(\"headless:account:reset_password\"),\n            HTTP_X_PASSWORD_RESET_KEY=f\"attempt{i}\",\n        )\n        assert resp.status_code == HTTPStatus.BAD_REQUEST\n    resp = client.post(\n        headless_reverse(\"headless:account:reset_password\"),\n        data={\n            \"key\": \"wrong\",\n            \"password\": \"a\",\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.CONFLICT\n\n\n@pytest.mark.parametrize(\"login_on_password_reset\", [False, True])\ndef test_password_reset_flow(\n    client,\n    user,\n    mailoutbox,\n    password_factory,\n    settings,\n    headless_reverse,\n    get_last_password_reset_code,\n    login_on_password_reset,\n):\n    settings.ACCOUNT_EMAIL_NOTIFICATIONS = True\n    settings.ACCOUNT_LOGIN_ON_PASSWORD_RESET = login_on_password_reset\n\n    resp = client.post(\n        headless_reverse(\"headless:account:request_password_reset\"),\n        data={\n            \"email\": user.email,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    code = get_last_password_reset_code(client, mailoutbox)\n    password = password_factory()\n\n    # Get token info\n    resp = client.get(\n        headless_reverse(\"headless:account:reset_password\"),\n        content_type=\"application/json\",\n        HTTP_X_PASSWORD_RESET_KEY=code,\n    )\n    assert resp.status_code == HTTPStatus.OK\n\n    # Too simple password\n    resp = client.post(\n        headless_reverse(\"headless:account:reset_password\"),\n        data={\n            \"key\": code,\n            \"password\": \"a\",\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\n        \"status\": HTTPStatus.BAD_REQUEST,\n        \"errors\": [\n            {\n                \"code\": \"password_too_short\",\n                \"message\": \"This password is too short. It must contain at least 6 characters.\",\n                \"param\": \"password\",\n            }\n        ],\n    }\n\n    assert len(mailoutbox) == 1\n\n    # Success\n    resp = client.post(\n        headless_reverse(\"headless:account:reset_password\"),\n        data={\n            \"key\": code,\n            \"password\": password,\n        },\n        content_type=\"application/json\",\n    )\n    assert (\n        resp.status_code == HTTPStatus.OK\n        if login_on_password_reset\n        else HTTPStatus.UNAUTHORIZED\n    )\n    if login_on_password_reset:\n        assert client.headless_session()[AUTHENTICATION_METHODS_SESSION_KEY] == [\n            {\"method\": \"password_reset\", \"at\": ANY, \"email\": user.email}\n        ]\n    else:\n        assert AUTHENTICATION_METHODS_SESSION_KEY not in client.headless_session()\n\n    user.refresh_from_db()\n    assert user.check_password(password)\n    assert len(mailoutbox) == 2  # The security notification\n\n    # Try once more, shouldn't be allowed.\n    resp = client.post(\n        headless_reverse(\"headless:account:reset_password\"),\n        data={\n            \"key\": code,\n            \"password\": password,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.CONFLICT\n\n\ndef test_indirect_email_verification_on_get(\n    db, client, mailoutbox, get_last_password_reset_code, user_factory, headless_reverse\n):\n    user = user_factory(email_verified=False)\n    address = EmailAddress.objects.get(user=user, email=user.email, verified=False)\n    resp = client.post(\n        headless_reverse(\"headless:account:request_password_reset\"),\n        data={\n            \"email\": address.email,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    resp = client.get(\n        headless_reverse(\"headless:account:reset_password\"),\n        HTTP_X_PASSWORD_RESET_KEY=get_last_password_reset_code(client, mailoutbox),\n    )\n    assert resp.status_code == HTTPStatus.OK\n    address.refresh_from_db()\n    assert address.verified\n\n\ndef test_indirect_email_verification_on_post(\n    db,\n    client,\n    mailoutbox,\n    get_last_password_reset_code,\n    user_factory,\n    headless_reverse,\n    password_factory,\n):\n    user = user_factory(email_verified=False)\n    address = EmailAddress.objects.get(user=user, email=user.email, verified=False)\n    resp = client.post(\n        headless_reverse(\"headless:account:request_password_reset\"),\n        data={\n            \"email\": address.email,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    resp = client.post(\n        headless_reverse(\"headless:account:reset_password\"),\n        {\n            \"key\": get_last_password_reset_code(client, mailoutbox),\n            \"password\": password_factory(),\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    address.refresh_from_db()\n    assert address.verified\n"
  },
  {
    "path": "tests/apps/headless/account/test_session.py",
    "content": "from http import HTTPStatus\n\nfrom django.test.client import Client\nfrom django.urls import reverse\n\n\ndef test_app_session_gone(db, user):\n    # intentionally use a vanilla Django test client\n    client = Client()\n    # Force login, creates a Django session\n    client.force_login(user)\n    # That Django session should not play any role.\n    resp = client.get(\n        reverse(\"headless:app:account:current_session\"), HTTP_X_SESSION_TOKEN=\"gone\"\n    )\n    assert resp.status_code == HTTPStatus.GONE\n\n\ndef test_logout(auth_client, headless_reverse):\n    # That Django session should not play any role.\n    resp = auth_client.get(headless_reverse(\"headless:account:current_session\"))\n    assert resp.status_code == HTTPStatus.OK\n    resp = auth_client.delete(headless_reverse(\"headless:account:current_session\"))\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    resp = auth_client.get(headless_reverse(\"headless:account:current_session\"))\n    assert resp.status_code in [HTTPStatus.UNAUTHORIZED, HTTPStatus.GONE]\n\n\ndef test_logout_no_token(app_client, user):\n    app_client.force_login(user)\n    resp = app_client.get(reverse(\"headless:app:account:current_session\"))\n    assert resp.status_code == HTTPStatus.OK\n    resp = app_client.delete(reverse(\"headless:app:account:current_session\"))\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    assert \"session_token\" not in resp.json()[\"meta\"]\n"
  },
  {
    "path": "tests/apps/headless/account/test_signup.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY, patch\n\nfrom django.contrib.auth.models import User\n\nimport pytest\n\nfrom allauth.account.models import EmailAddress, EmailConfirmationHMAC\nfrom allauth.account.signals import user_logged_in\nfrom allauth.headless.base.response import AuthenticationResponse\nfrom allauth.headless.constants import Flow\n\n\ndef test_signup(\n    db,\n    client,\n    email_factory,\n    password_factory,\n    settings,\n    headless_reverse,\n    headless_client,\n):\n    def on_user_logged_in(**kwargs):\n        response = kwargs[\"response\"]\n        assert isinstance(response, AuthenticationResponse)\n\n    user_logged_in.connect(on_user_logged_in)\n    try:\n        resp = client.post(\n            headless_reverse(\"headless:account:signup\"),\n            data={\n                \"username\": \"wizard\",\n                \"email\": email_factory(),\n                \"password\": password_factory(),\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.OK\n        assert User.objects.filter(username=\"wizard\").exists()\n    finally:\n        user_logged_in.disconnect(on_user_logged_in)\n\n\ndef test_signup_with_email_verification(\n    db,\n    client,\n    email_factory,\n    password_factory,\n    settings,\n    headless_reverse,\n    headless_client,\n):\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    settings.ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = True\n    email = email_factory()\n    resp = client.post(\n        headless_reverse(\"headless:account:signup\"),\n        data={\n            \"email\": email,\n            \"password\": password_factory(),\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    assert User.objects.filter(email=email).exists()\n    data = resp.json()\n    flow = next(f for f in data[\"data\"][\"flows\"] if f.get(\"is_pending\"))\n    assert flow[\"id\"] == \"verify_email\"\n    addr = EmailAddress.objects.get(email=email)\n    key = EmailConfirmationHMAC(addr).key\n    resp = client.get(\n        headless_reverse(\"headless:account:verify_email\"),\n        HTTP_X_EMAIL_VERIFICATION_KEY=key,\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.json() == {\n        \"data\": {\n            \"email\": email,\n            \"user\": ANY,\n        },\n        \"meta\": {\"is_authenticating\": True},\n        \"status\": HTTPStatus.OK,\n    }\n    resp = client.post(\n        headless_reverse(\"headless:account:verify_email\"),\n        data={\"key\": key},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert data[\"meta\"][\"is_authenticated\"]\n    addr.refresh_from_db()\n    assert addr.verified\n\n\n@pytest.mark.parametrize(\"email_verification_by_code_enabled\", (False, True))\ndef test_signup_prevent_enumeration(\n    db,\n    client,\n    email_factory,\n    password_factory,\n    settings,\n    headless_reverse,\n    headless_client,\n    user,\n    mailoutbox,\n    email_verification_by_code_enabled,\n):\n    settings.ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = (\n        email_verification_by_code_enabled\n    )\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    settings.ACCOUNT_PREVENT_ENUMERATION = True\n    resp = client.post(\n        headless_reverse(\"headless:account:signup\"),\n        data={\n            \"email\": user.email,\n            \"password\": password_factory(),\n        },\n        content_type=\"application/json\",\n    )\n    assert len(mailoutbox) == 1\n    assert \"an account using that email address already exists\" in mailoutbox[0].body\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    data = resp.json()\n    assert [f for f in data[\"data\"][\"flows\"] if f[\"id\"] == Flow.VERIFY_EMAIL][0][\n        \"is_pending\"\n    ]\n    resp = client.get(headless_reverse(\"headless:account:current_session\"))\n    data = resp.json()\n    assert [f for f in data[\"data\"][\"flows\"] if f[\"id\"] == Flow.VERIFY_EMAIL][0][\n        \"is_pending\"\n    ]\n    resp = client.post(\n        headless_reverse(\"headless:account:verify_email\"),\n        data={\"key\": \"wrong\"},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n\n\ndef test_signup_rate_limit(\n    db,\n    client,\n    email_factory,\n    password_factory,\n    settings,\n    headless_reverse,\n    enable_cache,\n    headless_client,\n):\n    settings.ACCOUNT_RATE_LIMITS = {\"signup\": \"1/m/ip\"}\n    for attempt in range(2):\n        resp = client.post(\n            headless_reverse(\"headless:account:signup\"),\n            data={\n                \"username\": f\"wizard{attempt}\",\n                \"email\": email_factory(),\n                \"password\": password_factory(),\n            },\n            content_type=\"application/json\",\n        )\n        expected_status = HTTPStatus.TOO_MANY_REQUESTS if attempt else HTTPStatus.OK\n        assert resp.status_code == expected_status\n        assert resp.json()[\"status\"] == expected_status\n\n\ndef test_signup_closed(\n    db,\n    client,\n    email_factory,\n    password_factory,\n    settings,\n    headless_reverse,\n    headless_client,\n):\n    with patch(\n        \"allauth.account.adapter.DefaultAccountAdapter.is_open_for_signup\"\n    ) as iofs:\n        iofs.return_value = False\n        resp = client.post(\n            headless_reverse(\"headless:account:signup\"),\n            data={\n                \"username\": \"wizard\",\n                \"email\": email_factory(),\n                \"password\": password_factory(),\n            },\n            content_type=\"application/json\",\n        )\n    assert resp.status_code == HTTPStatus.FORBIDDEN\n    assert not User.objects.filter(username=\"wizard\").exists()\n\n\ndef test_signup_while_logged_in(\n    db,\n    auth_client,\n    email_factory,\n    password_factory,\n    settings,\n    headless_reverse,\n    headless_client,\n):\n    resp = auth_client.post(\n        headless_reverse(\"headless:account:signup\"),\n        data={\n            \"username\": \"wizard\",\n            \"email\": email_factory(),\n            \"password\": password_factory(),\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.CONFLICT\n    assert resp.json() == {\"status\": HTTPStatus.CONFLICT}\n\n\ndef test_signup_without_password(\n    db,\n    client,\n    email_factory,\n    password_factory,\n    headless_reverse,\n    headless_client,\n    settings_impacting_urls,\n):\n    with settings_impacting_urls(\n        ACCOUNT_LOGIN_BY_CODE_ENABLED=True,\n        ACCOUNT_EMAIL_VERIFICATION=\"mandatory\",\n        ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED=True,\n        ACCOUNT_SIGNUP_FIELDS=[\"email*\", \"password1\"],\n    ):\n        email = email_factory()\n        resp = client.post(\n            headless_reverse(\"headless:account:signup\"),\n            data={\n                \"username\": \"wizard\",\n                \"email\": email,\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.UNAUTHORIZED\n        user = User.objects.get(email=email)\n        assert not user.check_password(\"\")\n"
  },
  {
    "path": "tests/apps/headless/base/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/headless/base/test_views.py",
    "content": "from http import HTTPStatus\n\n\ndef test_config(db, client, headless_reverse):\n    resp = client.get(headless_reverse(\"headless:config\"))\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert set(data[\"data\"].keys()) == {\n        \"account\",\n        \"mfa\",\n        \"socialaccount\",\n        \"usersessions\",\n    }\n"
  },
  {
    "path": "tests/apps/headless/conftest.py",
    "content": "from django.test.client import Client\nfrom django.urls import reverse\n\nimport pytest\n\n\n@pytest.fixture(params=[\"app\", \"browser\"])\ndef headless_client(request):\n    return request.param\n\n\n@pytest.fixture\ndef headless_reverse(headless_client):\n    def rev(viewname, **kwargs):\n        viewname = viewname.replace(\"headless:\", f\"headless:{headless_client}:\")\n        return reverse(viewname, **kwargs)\n\n    return rev\n\n\nclass AppClient(Client):\n    session_token = None\n\n    def generic(self, *args, **kwargs):\n        if self.session_token:\n            kwargs[\"HTTP_X_SESSION_TOKEN\"] = self.session_token\n        resp = super().generic(*args, **kwargs)\n        if resp[\"content-type\"] == \"application/json\":\n            data = resp.json()\n            session_token = data.get(\"meta\", {}).get(\"session_token\")\n            if session_token:\n                self.session_token = session_token\n        return resp\n\n    def force_login(self, user):\n        ret = super().force_login(user)\n        self.session_token = self.session.session_key\n        return ret\n\n    def headless_session(self):\n        from allauth.headless.internal import sessionkit\n\n        return sessionkit.session_store(self.session_token)\n\n\n@pytest.fixture\ndef app_client():\n    return AppClient()\n\n\n@pytest.fixture\ndef client(headless_client):\n    if headless_client == \"browser\":\n        client = Client()\n        client.headless_session = lambda: client.session\n        return client\n    return AppClient()\n\n\n@pytest.fixture\ndef auth_client(client, user):\n    client.force_login(user)\n    return client\n"
  },
  {
    "path": "tests/apps/headless/contrib/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/headless/contrib/ninja/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/headless/contrib/ninja/test_security.py",
    "content": "from allauth.headless.constants import Client\nfrom allauth.headless.contrib.ninja.security import XSessionTokenAuth\n\n\ndef test_authenticate(rf, user, headless_client, auth_client):\n    if headless_client == Client.BROWSER:\n        return\n    request = rf.get(\"/\", HTTP_X_SESSION_TOKEN=auth_client.session_token)\n    auth_user = XSessionTokenAuth()(request)\n    assert auth_user.pk == user.pk\n\n\ndef test_invalid_authentication(rf, user, headless_client, auth_client):\n    if headless_client == Client.BROWSER:\n        return\n    request = rf.get(\"/\", HTTP_X_SESSION_TOKEN=\"wrong\")\n    result = XSessionTokenAuth()(request)\n    assert result is None\n"
  },
  {
    "path": "tests/apps/headless/contrib/rest_framework/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/headless/contrib/rest_framework/test_authentication.py",
    "content": "from allauth.headless.constants import Client\nfrom allauth.headless.contrib.rest_framework.authentication import (\n    XSessionTokenAuthentication,\n)\n\n\ndef test_authenticate(rf, user, headless_client, auth_client):\n    if headless_client == Client.BROWSER:\n        return\n    request = rf.get(\"/\", HTTP_X_SESSION_TOKEN=auth_client.session_token)\n    auth_user, session = XSessionTokenAuthentication().authenticate(request)\n    assert auth_user.pk == user.pk\n\n\ndef test_invalid_authentication(rf, user, headless_client, auth_client):\n    if headless_client == Client.BROWSER:\n        return\n    request = rf.get(\"/\", HTTP_X_SESSION_TOKEN=\"wrong\")\n    result = XSessionTokenAuthentication().authenticate(request)\n    assert result is None\n"
  },
  {
    "path": "tests/apps/headless/internal/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/headless/internal/test_authkit.py",
    "content": "from django.contrib.auth import BACKEND_SESSION_KEY, HASH_SESSION_KEY, SESSION_KEY\nfrom django.contrib.auth.middleware import AuthenticationMiddleware\nfrom django.contrib.sessions.middleware import SessionMiddleware\nfrom django.http import HttpResponse\n\nfrom allauth.headless.internal.authkit import purge_request_user_cache\n\n\ndef test_purge_request_user_cache(rf, user):\n    request = rf.get(\"/\")\n    smw = SessionMiddleware(lambda request: HttpResponse())\n    smw(request)\n    amw = AuthenticationMiddleware(lambda request: HttpResponse())\n    amw(request)\n    assert request.user.is_anonymous\n    assert not request.user.pk\n    purge_request_user_cache(request)\n    request.session[SESSION_KEY] = user.pk\n    request.session[BACKEND_SESSION_KEY] = (\n        \"allauth.account.auth_backends.AuthenticationBackend\"\n    )\n    request.session[HASH_SESSION_KEY] = user.get_session_auth_hash()\n    assert request.user.is_authenticated\n    assert request.user.pk == user.pk\n"
  },
  {
    "path": "tests/apps/headless/mfa/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/headless/mfa/test_recovery_codes.py",
    "content": "from http import HTTPStatus\n\nfrom allauth.mfa.models import Authenticator\n\n\ndef test_get_recovery_codes_requires_reauth(\n    auth_client, user_with_recovery_codes, headless_reverse\n):\n    rc = Authenticator.objects.get(\n        type=Authenticator.Type.RECOVERY_CODES, user=user_with_recovery_codes\n    )\n    resp = auth_client.get(headless_reverse(\"headless:mfa:manage_recovery_codes\"))\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    data = resp.json()\n    assert data[\"meta\"][\"is_authenticated\"]\n    resp = auth_client.post(\n        headless_reverse(\"headless:mfa:reauthenticate\"),\n        data={\"code\": rc.wrap().get_unused_codes()[0]},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n\n\ndef test_get_recovery_codes(\n    auth_client,\n    user_with_recovery_codes,\n    headless_reverse,\n    reauthentication_bypass,\n):\n    with reauthentication_bypass():\n        resp = auth_client.get(headless_reverse(\"headless:mfa:manage_recovery_codes\"))\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert data[\"data\"][\"type\"] == \"recovery_codes\"\n    assert len(data[\"data\"][\"unused_codes\"]) == 10\n\n    with reauthentication_bypass():\n        resp = auth_client.get(headless_reverse(\"headless:mfa:authenticators\"))\n    data = resp.json()\n    assert len(data[\"data\"]) == 2\n    rc = [autor for autor in data[\"data\"] if autor[\"type\"] == \"recovery_codes\"][0]\n    assert \"unused_codes\" not in rc\n\n\ndef test_generate_recovery_codes(\n    auth_client,\n    user_with_totp,\n    headless_reverse,\n    reauthentication_bypass,\n):\n    with reauthentication_bypass():\n        resp = auth_client.get(headless_reverse(\"headless:mfa:manage_recovery_codes\"))\n    assert resp.status_code == HTTPStatus.NOT_FOUND\n    with reauthentication_bypass():\n        resp = auth_client.post(\n            headless_reverse(\"headless:mfa:manage_recovery_codes\"),\n            content_type=\"application/json\",\n        )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert data[\"data\"][\"type\"] == \"recovery_codes\"\n    assert len(data[\"data\"][\"unused_codes\"]) == 10\n"
  },
  {
    "path": "tests/apps/headless/mfa/test_totp.py",
    "content": "from http import HTTPStatus\n\nimport pytest\n\nfrom allauth.account.internal.flows.login import AUTHENTICATION_METHODS_SESSION_KEY\nfrom allauth.mfa.models import Authenticator\n\n\n@pytest.mark.parametrize(\"email_verified\", [False, True])\ndef test_get_totp_not_active(auth_client, user, headless_reverse, email_verified):\n    resp = auth_client.get(headless_reverse(\"headless:mfa:manage_totp\"))\n    if email_verified:\n        assert resp.status_code == HTTPStatus.NOT_FOUND\n        data = resp.json()\n        assert len(data[\"meta\"][\"secret\"]) == 32\n        assert len(data[\"meta\"][\"totp_url\"]) == 145\n    else:\n        assert resp.status_code == HTTPStatus.CONFLICT\n        assert resp.json() == {\n            \"status\": HTTPStatus.CONFLICT,\n            \"errors\": [\n                {\n                    \"message\": \"You cannot activate two-factor authentication until you have verified your email address.\",\n                    \"code\": \"unverified_email\",\n                }\n            ],\n        }\n\n\ndef test_get_totp(\n    auth_client,\n    user_with_totp,\n    headless_reverse,\n):\n    resp = auth_client.get(headless_reverse(\"headless:mfa:manage_totp\"))\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert data[\"data\"][\"type\"] == \"totp\"\n    assert isinstance(data[\"data\"][\"created_at\"], float)\n\n\ndef test_deactivate_totp(\n    auth_client,\n    user_with_totp,\n    headless_reverse,\n    reauthentication_bypass,\n):\n    with reauthentication_bypass():\n        resp = auth_client.delete(headless_reverse(\"headless:mfa:manage_totp\"))\n    assert resp.status_code == HTTPStatus.OK\n    assert not Authenticator.objects.filter(user=user_with_totp).exists()\n\n\ndef test_deactivate_totp_with_reauthenticate(\n    auth_client,\n    user_with_totp,\n    headless_reverse,\n    totp_validation_bypass,\n):\n    # Let's ensure the session require reauthentication by having an old `at`.\n    session = auth_client.headless_session()\n    session[AUTHENTICATION_METHODS_SESSION_KEY] = [{\"at\": 0}]\n    session.save()\n\n    # Attempt to deactivate, should not be allowed.\n    resp = auth_client.delete(headless_reverse(\"headless:mfa:manage_totp\"))\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    assert resp.json()[\"data\"][\"flows\"] == [\n        {\"id\": \"reauthenticate\"},\n        {\"id\": \"mfa_reauthenticate\", \"types\": [\"totp\"]},\n    ]\n    assert Authenticator.objects.filter(user=user_with_totp).exists()\n\n    # Now, reauthenticate...\n    with totp_validation_bypass():\n        resp = auth_client.post(\n            headless_reverse(\"headless:mfa:reauthenticate\"),\n            data={\"code\": \"42\"},\n            content_type=\"application/json\",\n        )\n    assert resp.status_code == HTTPStatus.OK\n\n    # ... and try again.\n    resp = auth_client.delete(headless_reverse(\"headless:mfa:manage_totp\"))\n    assert resp.status_code == HTTPStatus.OK\n\n    # Success\n    assert not Authenticator.objects.filter(user=user_with_totp).exists()\n\n\n@pytest.mark.parametrize(\"email_verified\", [False, True])\ndef test_activate_totp(\n    auth_client,\n    user,\n    headless_reverse,\n    reauthentication_bypass,\n    settings,\n    totp_validation_bypass,\n    email_verified,\n):\n    with reauthentication_bypass():\n        with totp_validation_bypass():\n            resp = auth_client.post(\n                headless_reverse(\"headless:mfa:manage_totp\"),\n                data={\"code\": \"42\"},\n                content_type=\"application/json\",\n            )\n    if email_verified:\n        assert resp.status_code == HTTPStatus.OK\n        assert Authenticator.objects.filter(\n            user=user, type=Authenticator.Type.TOTP\n        ).exists()\n        data = resp.json()\n        assert data[\"data\"][\"type\"] == \"totp\"\n        assert isinstance(data[\"data\"][\"created_at\"], float)\n        assert data[\"data\"][\"last_used_at\"] is None\n    else:\n        assert resp.status_code == HTTPStatus.BAD_REQUEST\n"
  },
  {
    "path": "tests/apps/headless/mfa/test_trust.py",
    "content": "from http import HTTPStatus\n\nimport pytest\n\nfrom allauth.headless.constants import Client, Flow\n\n\n@pytest.mark.parametrize(\"trust\", [False, True])\ndef test_auth_unverified_email_and_mfa(\n    client,\n    user_with_totp,\n    user_password,\n    settings_impacting_urls,\n    totp_validation_bypass,\n    headless_reverse,\n    headless_client,\n    trust,\n):\n    with settings_impacting_urls(\n        ACCOUNT_LOGIN_METHODS={\"email\"},\n        ACCOUNT_EMAIL_VERIFICATION=\"mandatory\",\n        ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION=True,\n        MFA_TRUST_ENABLED=True,\n    ):\n        # Login\n        resp = client.post(\n            headless_reverse(\"headless:account:login\"),\n            data={\n                \"email\": user_with_totp.email,\n                \"password\": user_password,\n            },\n            content_type=\"application/json\",\n        )\n\n        # TOTP is the next stage\n        assert resp.status_code == HTTPStatus.UNAUTHORIZED\n        data = resp.json()\n        assert [f for f in data[\"data\"][\"flows\"] if f[\"id\"] == Flow.MFA_AUTHENTICATE][\n            0\n        ][\"is_pending\"]\n        with totp_validation_bypass():\n            resp = client.post(\n                headless_reverse(\"headless:mfa:authenticate\"),\n                data={\"code\": \"bad\"},\n                content_type=\"application/json\",\n            )\n\n        if headless_client == Client.APP:\n            # App client does not support trust\n            assert resp.status_code == HTTPStatus.OK\n        else:\n            # Trust stage is pending\n            assert resp.status_code == HTTPStatus.UNAUTHORIZED\n            data = resp.json()\n            assert [f for f in data[\"data\"][\"flows\"] if f[\"id\"] == Flow.MFA_TRUST][0][\n                \"is_pending\"\n            ]\n\n            # Indicate trust Y/N\n            resp = client.post(\n                headless_reverse(\"headless:mfa:trust\"),\n                data={\"trust\": trust},\n                content_type=\"application/json\",\n            )\n\n            # Logout\n            assert resp.status_code == HTTPStatus.OK\n            resp = client.delete(\n                headless_reverse(\"headless:account:current_session\"),\n            )\n            assert resp.status_code == HTTPStatus.UNAUTHORIZED\n\n            # Login\n            resp = client.post(\n                headless_reverse(\"headless:account:login\"),\n                data={\n                    \"email\": user_with_totp.email,\n                    \"password\": user_password,\n                },\n                content_type=\"application/json\",\n            )\n\n            # Trust used?\n            assert resp.status_code == (\n                HTTPStatus.OK if trust else HTTPStatus.UNAUTHORIZED\n            )\n"
  },
  {
    "path": "tests/apps/headless/mfa/test_views.py",
    "content": "from http import HTTPStatus\n\nfrom allauth.account.models import EmailAddress, get_emailconfirmation_model\nfrom allauth.headless.constants import Flow\n\n\ndef test_auth_unverified_email_and_mfa(\n    client,\n    user_factory,\n    password_factory,\n    settings,\n    totp_validation_bypass,\n    headless_reverse,\n    headless_client,\n):\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = True\n    password = password_factory()\n    user = user_factory(email_verified=False, password=password, with_totp=True)\n    resp = client.post(\n        headless_reverse(\"headless:account:login\"),\n        data={\n            \"email\": user.email,\n            \"password\": password,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    data = resp.json()\n    assert [f for f in data[\"data\"][\"flows\"] if f[\"id\"] == Flow.VERIFY_EMAIL][0][\n        \"is_pending\"\n    ]\n    emailaddress = EmailAddress.objects.filter(user=user, verified=False).get()\n    key = get_emailconfirmation_model().create(emailaddress).key\n    resp = client.post(\n        headless_reverse(\"headless:account:verify_email\"),\n        data={\"key\": key},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    flows = [\n        {\"id\": \"login\"},\n        {\"id\": \"login_by_code\"},\n        {\"id\": \"signup\"},\n    ]\n    if headless_client == \"browser\":\n        flows.append(\n            {\n                \"id\": \"provider_redirect\",\n                \"providers\": [\"dummy\", \"unittest-server\", \"other-server\"],\n            }\n        )\n    flows.append(\n        {\n            \"id\": \"provider_token\",\n            \"providers\": [\"dummy\", \"unittest-server\", \"other-server\"],\n        }\n    )\n    flows.append({\"id\": \"mfa_login_webauthn\"})\n    flows.append(\n        {\n            \"id\": \"mfa_authenticate\",\n            \"is_pending\": True,\n            \"types\": [\"totp\"],\n        }\n    )\n\n    assert resp.json() == {\n        \"data\": {\"flows\": flows},\n        \"meta\": {\"is_authenticated\": False},\n        \"status\": HTTPStatus.UNAUTHORIZED,\n    }\n    resp = client.post(\n        headless_reverse(\"headless:mfa:authenticate\"),\n        data={\"code\": \"bad\"},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\n        \"status\": HTTPStatus.BAD_REQUEST,\n        \"errors\": [\n            {\"message\": \"Incorrect code.\", \"code\": \"incorrect_code\", \"param\": \"code\"}\n        ],\n    }\n\n    with totp_validation_bypass():\n        resp = client.post(\n            headless_reverse(\"headless:mfa:authenticate\"),\n            data={\"code\": \"bad\"},\n            content_type=\"application/json\",\n        )\n    assert resp.status_code == HTTPStatus.OK\n\n\ndef test_dangling_mfa_is_logged_out(\n    client,\n    user_with_totp,\n    password_factory,\n    settings,\n    totp_validation_bypass,\n    headless_reverse,\n    headless_client,\n    user_password,\n):\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    resp = client.post(\n        headless_reverse(\"headless:account:login\"),\n        data={\n            \"email\": user_with_totp.email,\n            \"password\": user_password,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    data = resp.json()\n    flow = [f for f in data[\"data\"][\"flows\"] if f[\"id\"] == Flow.MFA_AUTHENTICATE][0]\n    assert flow[\"is_pending\"]\n    assert flow[\"types\"] == [\"totp\"]\n    resp = client.delete(headless_reverse(\"headless:account:current_session\"))\n    data = resp.json()\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    assert all(not f.get(\"is_pending\") for f in data[\"data\"][\"flows\"])\n"
  },
  {
    "path": "tests/apps/headless/mfa/test_webauthn.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY\n\nfrom django.contrib.auth import get_user_model\n\nimport pytest\n\nfrom allauth.account import app_settings\nfrom allauth.account.authentication import AUTHENTICATION_METHODS_SESSION_KEY\nfrom allauth.headless.constants import Flow\nfrom allauth.mfa.models import Authenticator\n\n\ndef test_passkey_login(\n    client, passkey, webauthn_authentication_bypass, headless_reverse\n):\n    with webauthn_authentication_bypass(passkey) as credential:\n        resp = client.get(headless_reverse(\"headless:mfa:login_webauthn\"))\n        assert \"request_options\" in resp.json()[\"data\"]\n        resp = client.post(\n            headless_reverse(\"headless:mfa:login_webauthn\"),\n            data={\"credential\": credential},\n            content_type=\"application/json\",\n        )\n    data = resp.json()\n    assert data[\"data\"][\"user\"][\"id\"] == passkey.user_id\n\n\ndef test_passkey_login_get_options(client, headless_client, headless_reverse, db):\n    resp = client.get(headless_reverse(\"headless:mfa:login_webauthn\"))\n    data = resp.json()\n    meta = {}\n    if headless_client == \"app\":\n        meta = {\n            \"meta\": {\"session_token\": ANY},\n        }\n    assert data == {\n        \"status\": HTTPStatus.OK,\n        \"data\": {\"request_options\": {\"publicKey\": ANY}},\n        **meta,\n    }\n\n\ndef test_reauthenticate(\n    auth_client,\n    passkey,\n    user_with_recovery_codes,\n    webauthn_authentication_bypass,\n    headless_reverse,\n):\n    # View recovery codes, confirm webauthn reauthentication is an option\n    resp = auth_client.get(headless_reverse(\"headless:mfa:manage_recovery_codes\"))\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    assert Flow.MFA_REAUTHENTICATE in [\n        flow[\"id\"] for flow in resp.json()[\"data\"][\"flows\"]\n    ]\n\n    # Get request options\n    with webauthn_authentication_bypass(passkey):\n        resp = auth_client.get(headless_reverse(\"headless:mfa:reauthenticate_webauthn\"))\n        data = resp.json()\n        assert data[\"status\"] == HTTPStatus.OK\n        assert data[\"data\"][\"request_options\"] == ANY\n\n    # Reauthenticate\n    with webauthn_authentication_bypass(passkey) as credential:\n        resp = auth_client.post(\n            headless_reverse(\"headless:mfa:reauthenticate_webauthn\"),\n            data={\"credential\": credential},\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.OK\n    resp = auth_client.get(headless_reverse(\"headless:mfa:manage_recovery_codes\"))\n    assert resp.status_code == HTTPStatus.OK\n\n\ndef test_update_authenticator(\n    auth_client, headless_reverse, passkey, reauthentication_bypass\n):\n    data = {\"id\": passkey.pk, \"name\": \"Renamed!\"}\n    resp = auth_client.put(\n        headless_reverse(\"headless:mfa:manage_webauthn\"),\n        data=data,\n        content_type=\"application/json\",\n    )\n    # Reauthentication required\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    with reauthentication_bypass():\n        resp = auth_client.put(\n            headless_reverse(\"headless:mfa:manage_webauthn\"),\n            data=data,\n            content_type=\"application/json\",\n        )\n    assert resp.status_code == HTTPStatus.OK\n    passkey.refresh_from_db()\n    assert passkey.wrap().name == \"Renamed!\"\n\n\ndef test_delete_authenticator(\n    auth_client, headless_reverse, passkey, reauthentication_bypass\n):\n    data = {\"authenticators\": [passkey.pk]}\n    resp = auth_client.delete(\n        headless_reverse(\"headless:mfa:manage_webauthn\"),\n        data=data,\n        content_type=\"application/json\",\n    )\n    # Reauthentication required\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    with reauthentication_bypass():\n        resp = auth_client.delete(\n            headless_reverse(\"headless:mfa:manage_webauthn\"),\n            data=data,\n            content_type=\"application/json\",\n        )\n    assert resp.status_code == HTTPStatus.OK\n    assert not Authenticator.objects.filter(pk=passkey.pk).exists()\n\n\n@pytest.mark.parametrize(\"email_verified\", [False, True])\ndef test_add_authenticator(\n    user,\n    auth_client,\n    headless_reverse,\n    webauthn_registration_bypass,\n    reauthentication_bypass,\n    email_verified,\n):\n    resp = auth_client.get(headless_reverse(\"headless:mfa:manage_webauthn\"))\n    # Reauthentication required\n    assert (\n        resp.status_code == HTTPStatus.UNAUTHORIZED\n        if email_verified\n        else HTTPStatus.CONFLICT\n    )\n\n    with reauthentication_bypass():\n        resp = auth_client.get(headless_reverse(\"headless:mfa:manage_webauthn\"))\n        if email_verified:\n            assert resp.status_code == HTTPStatus.OK\n            data = resp.json()\n            assert data[\"data\"][\"creation_options\"] == ANY\n        else:\n            assert resp.status_code == HTTPStatus.CONFLICT\n\n        with webauthn_registration_bypass(user, False) as credential:\n            resp = auth_client.post(\n                headless_reverse(\"headless:mfa:manage_webauthn\"),\n                data={\"credential\": credential},\n                content_type=\"application/json\",\n            )\n            webauthn_count = Authenticator.objects.filter(\n                type=Authenticator.Type.WEBAUTHN, user=user\n            ).count()\n            if email_verified:\n                assert resp.status_code == HTTPStatus.OK\n                assert webauthn_count == 1\n            else:\n                assert resp.status_code == HTTPStatus.CONFLICT\n                assert webauthn_count == 0\n\n\ndef test_2fa_login(\n    client,\n    user,\n    user_password,\n    passkey,\n    webauthn_authentication_bypass,\n    headless_reverse,\n):\n    resp = client.post(\n        headless_reverse(\"headless:account:login\"),\n        data={\n            \"username\": user.username,\n            \"password\": user_password,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    data = resp.json()\n    pending_flows = [f for f in data[\"data\"][\"flows\"] if f.get(\"is_pending\")]\n    assert len(pending_flows) == 1\n    pending_flow = pending_flows[0]\n    assert pending_flow == {\n        \"id\": \"mfa_authenticate\",\n        \"is_pending\": True,\n        \"types\": [\"webauthn\"],\n    }\n    with webauthn_authentication_bypass(passkey) as credential:\n        resp = client.get(headless_reverse(\"headless:mfa:authenticate_webauthn\"))\n        assert \"request_options\" in resp.json()[\"data\"]\n        resp = client.post(\n            headless_reverse(\"headless:mfa:authenticate_webauthn\"),\n            data={\"credential\": credential},\n            content_type=\"application/json\",\n        )\n    data = resp.json()\n    assert resp.status_code == HTTPStatus.OK\n    assert data[\"data\"][\"user\"][\"id\"] == passkey.user_id\n    assert client.headless_session()[AUTHENTICATION_METHODS_SESSION_KEY] == [\n        {\"method\": \"password\", \"at\": ANY, \"username\": passkey.user.username},\n        {\"method\": \"mfa\", \"at\": ANY, \"id\": ANY, \"type\": Authenticator.Type.WEBAUTHN},\n    ]\n\n\n@pytest.mark.parametrize(\"login_on_email_verification\", [False, True])\ndef test_passkey_signup(\n    client,\n    db,\n    webauthn_registration_bypass,\n    headless_reverse,\n    settings,\n    get_last_email_verification_code,\n    mailoutbox,\n    login_on_email_verification,\n):\n    settings.ACCOUNT_EMAIL_VERIFICATION = app_settings.EmailVerificationMethod.MANDATORY\n    settings.ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True\n    # This setting should have no influence when verifying by code:\n    settings.ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = login_on_email_verification\n\n    # Initiate passkey signup\n    resp = client.post(\n        headless_reverse(\"headless:mfa:signup_webauthn\"),\n        data={\"email\": \"pass@key.org\", \"username\": \"passkey\"},\n        content_type=\"application/json\",\n    )\n\n    # Email verification kicks in.\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    pending_flows = [\n        flow for flow in resp.json()[\"data\"][\"flows\"] if flow.get(\"is_pending\")\n    ]\n    assert len(pending_flows) == 1\n    flow = pending_flows[0]\n    assert flow[\"id\"] == Flow.VERIFY_EMAIL.value\n\n    # Verify email.\n    code = get_last_email_verification_code(client, mailoutbox)\n    resp = client.post(\n        headless_reverse(\"headless:account:verify_email\"),\n        data={\"key\": code},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n\n    # Now, the webauthn signup flow is pending.\n    pending_flows = [\n        flow for flow in resp.json()[\"data\"][\"flows\"] if flow.get(\"is_pending\")\n    ]\n    assert len(pending_flows) == 1\n    flow = pending_flows[0]\n    assert flow[\"id\"] == Flow.MFA_SIGNUP_WEBAUTHN.value\n\n    # Fetch flow creation options.\n    resp = client.get(headless_reverse(\"headless:mfa:signup_webauthn\"))\n    data = resp.json()\n    assert \"creation_options\" in data[\"data\"]\n\n    # Create a passkey.\n    user = get_user_model().objects.get(email=\"pass@key.org\")\n    with webauthn_registration_bypass(user, True) as credential:\n        resp = client.put(\n            headless_reverse(\"headless:mfa:signup_webauthn\"),\n            data={\"name\": \"Some key\", \"credential\": credential},\n            content_type=\"application/json\",\n        )\n\n    # Signed up successfully.\n    data = resp.json()\n    assert resp.status_code == HTTPStatus.OK\n    assert data[\"meta\"][\"is_authenticated\"]\n    authenticator = Authenticator.objects.get(user=user)\n    assert authenticator.wrap().name == \"Some key\"\n\n\ndef test_get_login_webauthn_doesnt_crash_with_jwt(\n    db, client, headless_reverse, settings\n):\n    settings.HEADLESS_TOKEN_STRATEGY = (\n        \"tests.apps.headless.tokens.test_jwttokenstrategy.CustomJWTTokenStrategy\"\n    )\n    resp = client.get(headless_reverse(\"headless:mfa:login_webauthn\"))\n    assert resp.status_code == HTTPStatus.OK\n"
  },
  {
    "path": "tests/apps/headless/socialaccount/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/headless/socialaccount/test_inputs.py",
    "content": "import pytest\n\nfrom allauth.headless.socialaccount.inputs import ProviderTokenInput\n\n\n@pytest.mark.parametrize(\"client_id\", [\"client1\", \"client2\"])\ndef test_provider_token_multiple_apps(settings, db, client_id):\n    gsettings = {\n        \"APPS\": [\n            {\"client_id\": \"client1\", \"secret\": \"secret\"},\n            {\"client_id\": \"client2\", \"secret\": \"secret\"},\n        ]\n    }\n    settings.SOCIALACCOUNT_PROVIDERS = {\"google\": gsettings}\n\n    inp = ProviderTokenInput(\n        {\n            \"provider\": \"google\",\n            \"process\": \"login\",\n            \"token\": {\"client_id\": client_id, \"id_token\": \"it\", \"access_token\": \"at\"},\n        }\n    )\n    assert not inp.is_valid()\n    assert inp.cleaned_data[\"provider\"].app.client_id == client_id\n    assert inp.errors == {\"token\": [\"Invalid token.\"]}\n\n\ndef test_provider_token_client_id_required(settings, db):\n    inp = ProviderTokenInput(\n        {\n            \"provider\": \"google\",\n            \"process\": \"login\",\n            \"token\": {\"id_token\": \"it\", \"access_token\": \"at\"},\n        }\n    )\n    assert not inp.is_valid()\n    assert inp.errors == {\"token\": [\"`client_id` required.\"]}\n"
  },
  {
    "path": "tests/apps/headless/socialaccount/test_views.py",
    "content": "import json\nfrom http import HTTPStatus\nfrom unittest.mock import patch\n\nfrom django.urls import reverse\n\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.base.constants import AuthProcess\n\n\ndef test_bad_redirect(client, headless_reverse, db, settings):\n    settings.HEADLESS_ONLY = False\n    resp = client.post(\n        headless_reverse(\"headless:socialaccount:redirect_to_provider\"),\n        data={\n            \"provider\": \"dummy\",\n            \"callback_url\": \"https://unsafe.org/hack\",\n            \"process\": AuthProcess.LOGIN,\n        },\n    )\n    assertTemplateUsed(resp, \"socialaccount/authentication_error.html\")\n\n\ndef test_valid_redirect(client, headless_reverse, db):\n    resp = client.post(\n        headless_reverse(\"headless:socialaccount:redirect_to_provider\"),\n        data={\n            \"provider\": \"dummy\",\n            \"callback_url\": \"/\",\n            \"process\": AuthProcess.LOGIN,\n        },\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n\n\ndef test_unknown_provider_redirect(client, headless_reverse, db, settings):\n    resp = client.post(\n        headless_reverse(\"headless:socialaccount:redirect_to_provider\"),\n        data={\n            \"provider\": \"unknown\",\n            \"callback_url\": \"/\",\n            \"process\": AuthProcess.LOGIN,\n        },\n    )\n    if getattr(settings, \"HEADLESS_ONLY\", False):\n        assert resp.status_code == HTTPStatus.FOUND\n    else:\n        assert resp.status_code == HTTPStatus.UNAUTHORIZED\n\n\ndef test_manage_providers(auth_client, user, headless_reverse, provider_id):\n    account_to_del = SocialAccount.objects.create(\n        user=user, provider=provider_id, uid=\"p123\"\n    )\n    account_to_keep = SocialAccount.objects.create(\n        user=user, provider=provider_id, uid=\"p456\"\n    )\n    resp = auth_client.get(\n        headless_reverse(\"headless:socialaccount:manage_providers\"),\n    )\n    data = resp.json()\n    assert data[\"status\"] == HTTPStatus.OK\n    assert len(data[\"data\"]) == 2\n    resp = auth_client.delete(\n        headless_reverse(\"headless:socialaccount:manage_providers\"),\n        data={\"provider\": account_to_del.provider, \"account\": account_to_del.uid},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.json() == {\n        \"status\": HTTPStatus.OK,\n        \"data\": [\n            {\n                \"display\": \"Unittest Server\",\n                \"provider\": {\n                    \"client_id\": \"Unittest client_id\",\n                    \"openid_configuration_url\": \"https://unittest.example.com/.well-known/openid-configuration\",\n                    \"flows\": [\"provider_redirect\", \"provider_token\"],\n                    \"id\": provider_id,\n                    \"name\": \"Unittest Server\",\n                },\n                \"uid\": \"p456\",\n            }\n        ],\n    }\n    assert not SocialAccount.objects.filter(pk=account_to_del.pk).exists()\n    assert SocialAccount.objects.filter(pk=account_to_keep.pk).exists()\n\n\ndef test_disconnect_bad_request(auth_client, user, headless_reverse, provider_id):\n    resp = auth_client.delete(\n        headless_reverse(\"headless:socialaccount:manage_providers\"),\n        data={\"provider\": provider_id, \"account\": \"unknown\"},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\n        \"status\": HTTPStatus.BAD_REQUEST,\n        \"errors\": [{\"code\": \"account_not_found\", \"message\": \"Unknown account.\"}],\n    }\n\n\ndef test_disconnect_not_allowed(auth_client, user, headless_reverse, provider_id):\n    user.set_unusable_password()\n    user.save(update_fields=[\"password\"])\n    auth_client.force_login(user)\n    account = SocialAccount.objects.create(user=user, uid=\"123\", provider=provider_id)\n    resp = auth_client.delete(\n        headless_reverse(\"headless:socialaccount:manage_providers\"),\n        data={\"provider\": provider_id, \"account\": account.uid},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\n        \"status\": HTTPStatus.BAD_REQUEST,\n        \"errors\": [\n            {\"code\": \"no_password\", \"message\": \"Your account has no password set up.\"}\n        ],\n    }\n\n\ndef test_valid_token(client, headless_reverse, db):\n    id_token = json.dumps(\n        {\n            \"id\": 123,\n            \"email\": \"a@b.com\",\n            \"email_verified\": True,\n        }\n    )\n    resp = client.post(\n        headless_reverse(\"headless:socialaccount:provider_token\"),\n        data={\n            \"provider\": \"dummy\",\n            \"token\": {\n                \"id_token\": id_token,\n            },\n            \"process\": AuthProcess.LOGIN,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert EmailAddress.objects.filter(email=\"a@b.com\", verified=True).exists()\n\n\ndef test_invalid_token(client, headless_reverse, db, google_provider_settings):\n    resp = client.post(\n        headless_reverse(\"headless:socialaccount:provider_token\"),\n        data={\n            \"provider\": \"google\",\n            \"token\": {\n                \"id_token\": \"dummy\",\n                \"client_id\": google_provider_settings[\"APPS\"][0][\"client_id\"],\n            },\n            \"process\": AuthProcess.LOGIN,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    data = resp.json()\n    assert data == {\n        \"status\": HTTPStatus.BAD_REQUEST,\n        \"errors\": [\n            {\"message\": \"Invalid token.\", \"code\": \"invalid_token\", \"param\": \"token\"}\n        ],\n    }\n\n\ndef test_valid_token_multiple_apps(\n    client, headless_reverse, db, google_provider_settings, settings, user_factory\n):\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    google_provider_settings[\"APPS\"].append(\n        {\"client_id\": \"client_id2\", \"secret\": \"secret2\"}\n    )\n    id_token = {\"sub\": \"uid-from-id-token\", \"email\": \"a@b.com\", \"email_verified\": True}\n    with patch(\n        \"allauth.socialaccount.providers.google.views._verify_and_decode\",\n        return_value=id_token,\n    ):\n        resp = client.post(\n            headless_reverse(\"headless:socialaccount:provider_token\"),\n            data={\n                \"provider\": \"google\",\n                \"token\": {\n                    \"id_token\": \"dummy\",\n                    \"client_id\": google_provider_settings[\"APPS\"][0][\"client_id\"],\n                },\n                \"process\": AuthProcess.LOGIN,\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.OK\n\n\ndef test_auth_error_no_headless_request(client, db, google_provider_settings, settings):\n    \"\"\"Authentication errors use the regular \"Third-Party Login Failure\"\n    template if headless is not used.\n    \"\"\"\n    settings.HEADLESS_ONLY = False\n    resp = client.get(reverse(\"google_callback\"))\n    assertTemplateUsed(resp, \"socialaccount/authentication_error.html\")\n\n\ndef test_auth_error_headless_request(\n    client, db, google_provider_settings, sociallogin_setup_state\n):\n    \"\"\"Authentication errors redirect to the next URL with ?error params for\n    headless requests.\n    \"\"\"\n    state = sociallogin_setup_state(client, headless=True, next=\"/foo\")\n    resp = client.get(f\"{reverse('google_callback')}?state={state}\")\n    assert resp[\"location\"] == \"/foo?error=unknown&error_process=login\"\n\n\ndef test_auth_error_no_headless_state_request_headless_only(\n    settings, client, db, google_provider_settings\n):\n    \"\"\"Authentication errors redirect to a fallback error URL for headless-only,\n    in case no next can be recovered from the state.\n    \"\"\"\n    settings.HEADLESS_ONLY = True\n    settings.HEADLESS_FRONTEND_URLS = {\"socialaccount_login_error\": \"/3rdparty/failure\"}\n    resp = client.get(reverse(\"google_callback\"))\n    assert (\n        resp[\"location\"]\n        == \"http://testserver/3rdparty/failure?error=unknown&error_process=login\"\n    )\n\n\ndef test_auth_error_headless_state_request_headless_only(\n    settings, client, db, google_provider_settings, sociallogin_setup_state\n):\n    \"\"\"Authentication errors redirect to a fallback error URL for headless-only,\n    in case no next can be recovered from the state.\n    \"\"\"\n    state = sociallogin_setup_state(client, headless=True, next=\"/foo\")\n    settings.HEADLESS_ONLY = True\n    settings.HEADLESS_FRONTEND_URLS = {\"socialaccount_login_error\": \"/3rdparty/failure\"}\n    resp = client.get(f\"{reverse('google_callback')}?state={state}\")\n    assert resp[\"location\"] == \"/foo?error=unknown&error_process=login\"\n\n\ndef test_token_signup_closed(client, headless_reverse, db):\n    id_token = json.dumps(\n        {\n            \"id\": 123,\n            \"email\": \"a@b.com\",\n            \"email_verified\": True,\n        }\n    )\n    with patch(\n        \"allauth.socialaccount.adapter.DefaultSocialAccountAdapter.is_open_for_signup\"\n    ) as iofs:\n        iofs.return_value = False\n        resp = client.post(\n            headless_reverse(\"headless:socialaccount:provider_token\"),\n            data={\n                \"provider\": \"dummy\",\n                \"token\": {\n                    \"id_token\": id_token,\n                },\n                \"process\": AuthProcess.LOGIN,\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.FORBIDDEN\n    assert not EmailAddress.objects.filter(email=\"a@b.com\", verified=True).exists()\n\n\ndef test_provider_signup(client, headless_reverse, db, settings):\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    account_uid = \"123\"\n    id_token = json.dumps(\n        {\n            \"id\": account_uid,\n        }\n    )\n    resp = client.post(\n        headless_reverse(\"headless:socialaccount:provider_token\"),\n        data={\n            \"provider\": \"dummy\",\n            \"token\": {\n                \"id_token\": id_token,\n            },\n            \"process\": AuthProcess.LOGIN,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    pending_flow = [f for f in resp.json()[\"data\"][\"flows\"] if f.get(\"is_pending\")][0]\n    assert pending_flow[\"id\"] == \"provider_signup\"\n\n    resp = client.get(headless_reverse(\"headless:socialaccount:provider_signup\"))\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.json() == {\n        \"data\": {\n            \"email\": [],\n            \"account\": {\n                \"display\": \"Dummy\",\n                \"provider\": {\n                    \"flows\": [\"provider_redirect\", \"provider_token\"],\n                    \"id\": \"dummy\",\n                    \"name\": \"Dummy\",\n                },\n                \"uid\": account_uid,\n            },\n            \"user\": {\"display\": \"user\", \"has_usable_password\": False},\n        },\n        \"status\": HTTPStatus.OK,\n    }\n\n    resp = client.post(\n        headless_reverse(\"headless:socialaccount:provider_signup\"),\n        data={\n            \"email\": \"a@b.com\",\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    pending_flow = [f for f in resp.json()[\"data\"][\"flows\"] if f.get(\"is_pending\")][0]\n    assert pending_flow[\"id\"] == \"verify_email\"\n    assert EmailAddress.objects.filter(email=\"a@b.com\").exists()\n\n\ndef test_signup_closed(client, headless_reverse, db, settings):\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    id_token = json.dumps(\n        {\n            \"id\": 123,\n        }\n    )\n    resp = client.post(\n        headless_reverse(\"headless:socialaccount:provider_token\"),\n        data={\n            \"provider\": \"dummy\",\n            \"token\": {\n                \"id_token\": id_token,\n            },\n            \"process\": AuthProcess.LOGIN,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    pending_flow = [f for f in resp.json()[\"data\"][\"flows\"] if f.get(\"is_pending\")][0]\n    assert pending_flow[\"id\"] == \"provider_signup\"\n    with patch(\n        \"allauth.socialaccount.adapter.DefaultSocialAccountAdapter.is_open_for_signup\"\n    ) as iofs:\n        iofs.return_value = False\n        resp = client.post(\n            headless_reverse(\"headless:socialaccount:provider_signup\"),\n            data={\n                \"email\": \"a@b.com\",\n            },\n            content_type=\"application/json\",\n        )\n    assert resp.status_code == HTTPStatus.FORBIDDEN\n\n\ndef test_connect(user, auth_client, sociallogin_setup_state, headless_reverse, db):\n    state = sociallogin_setup_state(\n        auth_client, process=\"connect\", next=\"/foo\", headless=True\n    )\n    resp = auth_client.post(\n        f\"{reverse('dummy_authenticate')}?state={state}\",\n        data={\n            \"id\": 123,\n        },\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == \"/foo\"\n    assert SocialAccount.objects.filter(user=user, provider=\"dummy\", uid=\"123\").exists()\n\n\ndef test_connect_reauthentication_required(\n    user, auth_client, sociallogin_setup_state, headless_reverse, db, settings\n):\n    settings.ACCOUNT_REAUTHENTICATION_REQUIRED = True\n\n    state = sociallogin_setup_state(\n        auth_client, process=\"connect\", next=\"/foo\", headless=True\n    )\n    resp = auth_client.post(\n        f\"{reverse('dummy_authenticate')}?state={state}\",\n        data={\n            \"id\": 123,\n        },\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert (\n        resp[\"location\"] == \"/foo?error=reauthentication_required&error_process=connect\"\n    )\n\n\ndef test_connect_already_connected(\n    user, user_factory, auth_client, sociallogin_setup_state, headless_reverse, db\n):\n    # The other user already connected the account.\n    other_user = user_factory()\n    SocialAccount.objects.create(user=other_user, uid=\"123\", provider=\"dummy\")\n    # Then, this user tries to connect...\n    state = sociallogin_setup_state(\n        auth_client, process=AuthProcess.CONNECT, next=\"/foo\", headless=True\n    )\n    resp = auth_client.post(\n        f\"{reverse('dummy_authenticate')}?state={state}\",\n        data={\n            \"id\": 123,\n        },\n    )\n    # We're redirected, and an error code is shown.\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == \"/foo?error=connected_other&error_process=connect\"\n    assert not SocialAccount.objects.filter(\n        user=user, provider=\"dummy\", uid=\"123\"\n    ).exists()\n\n\ndef test_token_connect(user, auth_client, headless_reverse, db):\n    id_token = json.dumps(\n        {\n            \"id\": 123,\n            \"email\": \"a@b.com\",\n            \"email_verified\": True,\n        }\n    )\n    resp = auth_client.post(\n        headless_reverse(\"headless:socialaccount:provider_token\"),\n        data={\n            \"provider\": \"dummy\",\n            \"token\": {\n                \"id_token\": id_token,\n            },\n            \"process\": AuthProcess.CONNECT,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert SocialAccount.objects.filter(uid=\"123\", user=user).exists()\n\n\ndef test_token_connect_already_connected(\n    user, auth_client, headless_reverse, db, user_factory\n):\n    # The other user already connected the account.\n    other_user = user_factory()\n    SocialAccount.objects.create(user=other_user, uid=\"123\", provider=\"dummy\")\n    id_token = json.dumps(\n        {\n            \"id\": 123,\n            \"email\": \"a@b.com\",\n            \"email_verified\": True,\n        }\n    )\n    resp = auth_client.post(\n        headless_reverse(\"headless:socialaccount:provider_token\"),\n        data={\n            \"provider\": \"dummy\",\n            \"token\": {\n                \"id_token\": id_token,\n            },\n            \"process\": AuthProcess.CONNECT,\n        },\n        content_type=\"application/json\",\n    )\n    assert not SocialAccount.objects.filter(uid=\"123\", user=user).exists()\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\n        \"status\": HTTPStatus.BAD_REQUEST,\n        \"errors\": [\n            {\n                \"code\": \"connected_other\",\n                \"message\": \"The third-party account is already connected to a different account.\",\n            }\n        ],\n    }\n\n\ndef test_provider_signup_not_pending(client, headless_reverse, db, settings):\n    resp = client.post(\n        headless_reverse(\"headless:socialaccount:provider_signup\"),\n        data={\n            \"email\": \"a@b.com\",\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.CONFLICT\n\n\ndef test_valid_openid_connect_token(\n    client, headless_reverse, db, openid_connect_provider_id\n):\n    provider = get_adapter().get_provider(None, openid_connect_provider_id)\n    id_token = json.dumps(\n        {\n            \"id\": 123,\n            \"email\": \"a@b.com\",\n            \"email_verified\": True,\n        }\n    )\n    with patch(\n        \"allauth.socialaccount.providers.openid_connect.views.OpenIDConnectOAuth2Adapter.openid_config\"\n    ):\n        with patch(\"allauth.socialaccount.internal.jwtkit.verify_and_decode\") as vad:\n            vad.return_value = {\"sub\": \"123\"}\n            resp = client.post(\n                headless_reverse(\"headless:socialaccount:provider_token\"),\n                data={\n                    \"provider\": openid_connect_provider_id,\n                    \"token\": {\n                        \"client_id\": provider.app.client_id,\n                        \"id_token\": id_token,\n                    },\n                    \"process\": AuthProcess.LOGIN,\n                },\n                content_type=\"application/json\",\n            )\n            assert resp.status_code == HTTPStatus.OK\n            assert SocialAccount.objects.filter(uid=\"123\").exists()\n"
  },
  {
    "path": "tests/apps/headless/spec/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/headless/spec/internal/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/headless/spec/internal/test_openapikit.py",
    "content": "from dataclasses import dataclass, field\nfrom typing import Optional\n\nfrom allauth.headless.spec.internal.openapikit import spec_for_dataclass\n\n\n@dataclass\nclass NestedDataClass:\n    string: str\n    integer: int = field(\n        metadata={\n            \"description\": \"Some nested int\",\n            \"example\": 42,\n        }\n    )\n\n\n@dataclass\nclass ExampleDataclass:\n    optional_integer: Optional[int]\n    integer: int\n    optional_string: Optional[str]\n    string: str\n    number: float = field(\n        metadata={\n            \"description\": \"Some float\",\n            \"example\": \"3.14\",\n        }\n    )\n    nested: Optional[NestedDataClass]\n\n\ndef test_spec_for_dataclass():\n    spec = spec_for_dataclass(ExampleDataclass)\n    assert spec == (\n        {\n            \"properties\": {\n                \"integer\": {\n                    \"type\": \"integer\",\n                },\n                \"number\": {\n                    \"description\": \"Some float\",\n                    \"example\": \"3.14\",\n                    \"format\": \"float\",\n                    \"type\": \"number\",\n                },\n                \"optional_integer\": {\n                    \"type\": \"integer\",\n                },\n                \"optional_string\": {\n                    \"type\": \"string\",\n                },\n                \"string\": {\n                    \"type\": \"string\",\n                },\n                \"nested\": {\n                    \"example\": {\"integer\": 42},\n                    \"properties\": {\n                        \"string\": {\n                            \"type\": \"string\",\n                        },\n                        \"integer\": {\n                            \"description\": \"Some nested int\",\n                            \"example\": 42,\n                            \"type\": \"integer\",\n                        },\n                    },\n                    \"required\": [\n                        \"string\",\n                        \"integer\",\n                    ],\n                    \"type\": \"object\",\n                },\n            },\n            \"required\": [\n                \"integer\",\n                \"string\",\n                \"number\",\n            ],\n            \"type\": \"object\",\n        },\n        {\n            \"number\": \"3.14\",\n        },\n    )\n"
  },
  {
    "path": "tests/apps/headless/spec/test_views.py",
    "content": "from http import HTTPStatus\n\nfrom django.urls import reverse\n\n\ndef test_openapi_json(client):\n    resp = client.get(reverse(\"headless:openapi_json\"))\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert data[\"openapi\"] == \"3.0.3\"\n    assert data[\"info\"][\"description\"].startswith(\"# Introduction\")\n"
  },
  {
    "path": "tests/apps/headless/tokens/test_jwttokenstrategy.py",
    "content": "from http import HTTPStatus\n\nfrom django.test.client import Client\nfrom django.urls import reverse, reverse_lazy\n\nimport jwt\nimport pytest\n\nfrom allauth.headless.tokens.strategies.jwt import JWTTokenStrategy\n\n\nclass CustomJWTTokenStrategy(JWTTokenStrategy):\n    def get_claims(self, user):\n        return {\"email\": user.email}\n\n\n@pytest.fixture\ndef custom_jwt_token_strategy(settings):\n    settings.HEADLESS_TOKEN_STRATEGY = (\n        \"tests.apps.headless.tokens.test_jwttokenstrategy.CustomJWTTokenStrategy\"\n    )\n\n\n@pytest.fixture\ndef obtain_tokens(user, user_password, headless_reverse):\n    def f(client):\n        # Let's sign in\n        resp = client.post(\n            headless_reverse(\"headless:account:login\"),\n            data={\n                \"username\": user.username,\n                \"password\": user_password,\n            },\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.OK\n\n        # On sign in, we receive an access/refresh token pair.\n        meta = resp.json()[\"meta\"]\n        assert meta[\"is_authenticated\"]\n        access_token = meta.get(\"access_token\")\n        refresh_token = meta.get(\"refresh_token\")\n        return access_token, refresh_token\n\n    return f\n\n\n@pytest.mark.parametrize(\"rotate\", [False, True])\ndef test_rotate_refresh_token(\n    headless_client,\n    headless_reverse,\n    client,\n    user,\n    rotate,\n    settings,\n    obtain_tokens,\n    custom_jwt_token_strategy,\n):\n    if headless_client == \"browser\":\n        return\n    settings.HEADLESS_JWT_ROTATE_REFRESH_TOKEN = rotate\n\n    access_token, refresh_token = obtain_tokens(client)\n\n    # Check our custom claim\n    access_token_data = jwt.decode(\n        access_token, algorithms=[\"RS256\"], options={\"verify_signature\": False}\n    )\n    assert access_token_data[\"email\"] == user.email\n\n    # Let's refresh\n    resp = Client().post(\n        headless_reverse(\"headless:tokens:refresh\"),\n        data={\"refresh_token\": refresh_token},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()[\"data\"]\n\n    # Check our custom claim in the new access token\n    access_token = data[\"access_token\"]\n    access_token_data = jwt.decode(\n        access_token, algorithms=[\"RS256\"], options={\"verify_signature\": False}\n    )\n    assert access_token_data[\"email\"] == user.email\n\n    new_refresh_token = data.get(\"refresh_token\")\n    assert bool(new_refresh_token) == rotate\n\n    # Let's refresh, again using the previous refresh token\n    resp = Client().post(\n        headless_reverse(\"headless:tokens:refresh\"),\n        data={\"refresh_token\": refresh_token},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == (HTTPStatus.BAD_REQUEST if rotate else HTTPStatus.OK)\n\n    # Let's refresh, using the new refresh token\n    if new_refresh_token:\n        resp = Client().post(\n            headless_reverse(\"headless:tokens:refresh\"),\n            data={\"refresh_token\": new_refresh_token},\n            content_type=\"application/json\",\n        )\n        assert resp.status_code == HTTPStatus.OK\n\n\n@pytest.mark.parametrize(\"stateful_validation_enabled\", [False, True])\ndef test_flow(\n    headless_client,\n    headless_reverse,\n    client,\n    user,\n    settings,\n    stateful_validation_enabled,\n    obtain_tokens,\n):\n    settings.HEADLESS_JWT_ROTATE_REFRESH_TOKEN = False\n    settings.HEADLESS_TOKEN_STRATEGY = (\n        \"allauth.headless.tokens.strategies.jwt.JWTTokenStrategy\"\n    )\n    settings.HEADLESS_JWT_STATEFUL_VALIDATION_ENABLED = stateful_validation_enabled\n\n    access_token, refresh_token = obtain_tokens(client)\n\n    # On sign in, we receive an access/refresh token pair.\n    if headless_client == \"browser\":\n        assert not access_token\n        assert not refresh_token\n        return\n\n    # With the access token, we can reach out to the allauth API.\n    at_client = Client(HTTP_AUTHORIZATION=f\"Bearer {access_token}\")\n    resp = at_client.get(headless_reverse(\"headless:account:current_session\"))\n    assert resp.status_code == HTTPStatus.OK\n\n    # Also check validity with DRF & Ninja endpoints\n    for url in [\n        reverse(\"headless_rest_framework_resource\"),\n        \"/headless/ninja/resource\",\n    ]:\n        resp = Client(HTTP_AUTHORIZATION=f\"Bearer {access_token}\").get(\n            f\"{url}?userinfo\"\n        )\n        assert resp.status_code == HTTPStatus.OK\n        assert resp.json() == {\"resource\": \"ok\", \"user_email\": user.email}\n\n    # With the refresh token, we can retrieve a new access token.\n    resp = Client().post(\n        headless_reverse(\"headless:tokens:refresh\"),\n        data={\"refresh_token\": refresh_token},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    new_access_token = resp.json()[\"data\"][\"access_token\"]\n    assert new_access_token != access_token\n\n    # And, of course, that new access token is valid.\n    at_client = Client(HTTP_AUTHORIZATION=f\"Bearer {new_access_token}\")\n    resp = at_client.get(headless_reverse(\"headless:account:current_session\"))\n    assert resp.status_code == HTTPStatus.OK\n\n    # Also check validity with DRF & Ninja endpoints\n    for url in [\n        reverse(\"headless_rest_framework_resource\"),\n        \"/headless/ninja/resource\",\n    ]:\n        resp = Client(HTTP_AUTHORIZATION=f\"Bearer {access_token}\").get(\n            f\"{url}?userinfo\"\n        )\n        assert resp.status_code == HTTPStatus.OK\n        assert resp.json() == {\"resource\": \"ok\", \"user_email\": user.email}\n\n    # But, when we logout...\n    resp = at_client.delete(headless_reverse(\"headless:account:current_session\"))\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n\n    # ... the refresh token no longer works.\n    resp = Client().post(\n        headless_reverse(\"headless:tokens:refresh\"),\n        data={\"refresh_token\": refresh_token},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n\n    # And, the access token no longer functions...\n    at_client = Client(HTTP_AUTHORIZATION=f\"Bearer {new_access_token}\")\n    resp = at_client.get(headless_reverse(\"headless:account:current_session\"))\n    assert resp.status_code == (\n        HTTPStatus.UNAUTHORIZED if stateful_validation_enabled else HTTPStatus.GONE\n    )\n\n    # Also check validity with DRF & Ninja endpoints\n    for url in [\n        reverse(\"headless_rest_framework_resource\"),\n        \"/headless/ninja/resource\",\n    ]:\n        resp = Client(HTTP_AUTHORIZATION=f\"Bearer {access_token}\").get(url)\n        assert resp.status_code == (\n            HTTPStatus.UNAUTHORIZED if stateful_validation_enabled else HTTPStatus.OK\n        )\n\n\n@pytest.mark.parametrize(\"stateful,query_count\", [(False, 0), (True, 1)])\n@pytest.mark.parametrize(\n    \"url\",\n    [\n        reverse_lazy(\"headless_rest_framework_resource\"),\n        \"/headless/ninja/resource\",\n    ],\n)\ndef test_access_token_query_counts(\n    headless_client,\n    headless_reverse,\n    client,\n    settings,\n    obtain_tokens,\n    django_assert_num_queries,\n    stateful,\n    query_count,\n    url,\n):\n    if headless_client == \"browser\":\n        return\n    settings.HEADLESS_TOKEN_STRATEGY = (\n        \"allauth.headless.tokens.strategies.jwt.JWTTokenStrategy\"\n    )\n    settings.HEADLESS_JWT_STATEFUL_VALIDATION_ENABLED = stateful\n    access_token, _ = obtain_tokens(client)\n    with django_assert_num_queries(query_count):\n        resp = Client(HTTP_AUTHORIZATION=f\"Bearer {access_token}\").get(url)\n        assert resp.status_code == (HTTPStatus.OK)\n\n\n@pytest.mark.parametrize(\"settings_scheme\", [\"Bearer\", \"Token\", \"JWT\"])\n@pytest.mark.parametrize(\"request_scheme\", [\"Bearer\", \"Token\", \"JWT\"])\ndef test_custom_authorization_header_scheme(\n    headless_client,\n    headless_reverse,\n    client,\n    settings,\n    obtain_tokens,\n    settings_scheme,\n    request_scheme,\n):\n    \"\"\"Test that JWT_AUTHORIZATION_HEADER_SCHEME setting is respected.\"\"\"\n    if headless_client == \"browser\":\n        return\n\n    # Set authorization header scheme in settings\n    settings.HEADLESS_JWT_AUTHORIZATION_HEADER_SCHEME = settings_scheme\n    settings.HEADLESS_TOKEN_STRATEGY = (\n        \"allauth.headless.tokens.strategies.jwt.JWTTokenStrategy\"\n    )\n\n    access_token, _ = obtain_tokens(client)\n\n    # Make request with the specified scheme\n    at_client = Client(HTTP_AUTHORIZATION=f\"{request_scheme} {access_token}\")\n    resp = at_client.get(headless_reverse(\"headless:account:current_session\"))\n\n    # Should succeed only when request scheme matches settings scheme\n    if settings_scheme == request_scheme:\n        assert resp.status_code == HTTPStatus.OK\n    else:\n        assert resp.status_code == HTTPStatus.UNAUTHORIZED\n\n\ndef test_hs256_algorithm(\n    headless_client,\n    headless_reverse,\n    client,\n    settings,\n    user,\n    obtain_tokens,\n):\n    if headless_client == \"browser\":\n        return\n    settings.HEADLESS_JWT_ALGORITHM = \"HS256\"\n    settings.HEADLESS_JWT_PRIVATE_KEY = \"super-secret\"\n    settings.HEADLESS_TOKEN_STRATEGY = (\n        \"allauth.headless.tokens.strategies.jwt.JWTTokenStrategy\"\n    )\n\n    access_token, _ = obtain_tokens(client)\n\n    header = jwt.get_unverified_header(access_token)\n    assert header[\"alg\"] == \"HS256\"\n    assert \"kid\" not in header\n\n    payload = jwt.decode(\n        access_token,\n        key=\"super-secret\",\n        algorithms=[\"HS256\"],\n        options={\"verify_signature\": True, \"verify_iss\": False, \"verify_aud\": False},\n    )\n    assert payload[\"sub\"] == str(user.pk)\n\n    at_client = Client(HTTP_AUTHORIZATION=f\"Bearer {access_token}\")\n    resp = at_client.get(headless_reverse(\"headless:account:current_session\"))\n    assert resp.status_code == HTTPStatus.OK\n\n\ndef test_hs256_fallback_to_secret_key(\n    headless_client,\n    headless_reverse,\n    client,\n    settings,\n    user,\n    obtain_tokens,\n):\n    if headless_client == \"browser\":\n        return\n    settings.HEADLESS_JWT_ALGORITHM = \"HS256\"\n    settings.HEADLESS_JWT_PRIVATE_KEY = \"\"  # Empty\n    settings.SECRET_KEY = \"django-secret-fallback\"\n    settings.HEADLESS_TOKEN_STRATEGY = (\n        \"allauth.headless.tokens.strategies.jwt.JWTTokenStrategy\"\n    )\n\n    access_token, _ = obtain_tokens(client)\n\n    payload = jwt.decode(\n        access_token,\n        key=\"django-secret-fallback\",\n        algorithms=[\"HS256\"],\n        options={\"verify_signature\": True, \"verify_iss\": False, \"verify_aud\": False},\n    )\n    assert payload[\"sub\"] == str(user.pk)\n"
  },
  {
    "path": "tests/apps/headless/tokens/test_tokens.py",
    "content": "from http import HTTPStatus\n\nfrom allauth.headless.tokens.strategies.sessions import SessionTokenStrategy\n\n\nclass DummyAccessTokenStrategy(SessionTokenStrategy):\n    def create_access_token(self, request):\n        return f\"at-user-{request.user.pk}\"\n\n\ndef test_access_token(\n    client,\n    user,\n    user_password,\n    settings,\n    headless_reverse,\n    headless_client,\n):\n    settings.HEADLESS_TOKEN_STRATEGY = (\n        \"tests.apps.headless.tokens.test_tokens.DummyAccessTokenStrategy\"\n    )\n    resp = client.post(\n        headless_reverse(\"headless:account:login\"),\n        data={\n            \"username\": user.username,\n            \"password\": user_password,\n        },\n        content_type=\"application/json\",\n    )\n    data = resp.json()\n    assert data[\"status\"] == HTTPStatus.OK\n    if headless_client == \"app\":\n        assert data[\"meta\"][\"access_token\"] == f\"at-user-{user.pk}\"\n    else:\n        assert \"access_token\" not in data[\"meta\"]\n"
  },
  {
    "path": "tests/apps/headless/usersessions/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/headless/usersessions/test_views.py",
    "content": "from http import HTTPStatus\n\nfrom allauth.usersessions.models import UserSession\n\n\ndef test_flow(client, user, user_password, headless_reverse, settings):\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    resp = client.post(\n        headless_reverse(\"headless:account:login\"),\n        data={\n            \"email\": user.email,\n            \"password\": user_password,\n        },\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    resp = client.get(headless_reverse(\"headless:usersessions:sessions\"))\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert len(data[\"data\"]) == 1\n    session_pk = data[\"data\"][0][\"id\"]\n    assert UserSession.objects.filter(pk=session_pk).exists()\n    resp = client.delete(\n        headless_reverse(\"headless:usersessions:sessions\"),\n        data={\"sessions\": [session_pk]},\n        content_type=\"application/json\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    assert not UserSession.objects.filter(pk=session_pk).exists()\n"
  },
  {
    "path": "tests/apps/idp/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/idp/oidc/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/idp/oidc/conftest.py",
    "content": "import time\nimport uuid\nfrom datetime import timedelta\nfrom types import SimpleNamespace\n\nfrom django.utils import timezone\n\nimport pytest\n\nfrom allauth.core.context import request_context\nfrom allauth.idp.oidc.adapter import get_adapter\nfrom allauth.idp.oidc.internal.oauthlib.request_validator import (\n    OAuthLibRequestValidator,\n)\nfrom allauth.idp.oidc.models import Client, Token\n\n\n@pytest.fixture\ndef oidc_client_secret():\n    return uuid.uuid4().hex\n\n\n@pytest.fixture\ndef oidc_client(db, oidc_client_secret):\n    client = Client.objects.create()\n    client.set_secret(oidc_client_secret)\n\n    client.set_redirect_uris([\"https://client/callback\"])\n    client.set_scopes([\"profile\", \"openid\", \"email\"])\n    client.set_grant_types([g.value for g in Client.GrantType])\n    client.set_response_types([\"code\", \"token\"])\n    client.save()\n    return client\n\n\n@pytest.fixture\ndef device_client(db):\n    client = Client.objects.create()\n    client.type = Client.Type.PUBLIC\n    client.set_redirect_uris([\"https://client/callback\"])\n    client.set_scopes([\"profile\", \"openid\", \"email\"])\n    client.set_grant_types([g.value for g in Client.GrantType])\n    client.set_response_types([\"code\", \"token\"])\n    client.save()\n    return client\n\n\n@pytest.fixture\ndef id_token_generator(rf):\n    def f(client, user):\n        with request_context(rf.get(\"/\")):\n            request = SimpleNamespace(client=client, user=user, scopes=[\"openid\"])\n            return OAuthLibRequestValidator().finalize_id_token(\n                {\n                    \"aud\": client.id,\n                    \"iat\": int(time.time()),\n                },\n                {},\n                None,\n                request,\n            )\n\n    return f\n\n\n@pytest.fixture\ndef access_token_generator():\n    def f(client, user, scopes=[\"openid\"]):\n        token = uuid.uuid4().hex\n        token_hash = get_adapter().hash_token(token)\n        instance = Token(\n            type=Token.Type.ACCESS_TOKEN,\n            user=user,\n            client=client,\n            hash=token_hash,\n        )\n        instance.set_scopes(scopes)\n        instance.save()\n        return token, instance\n\n    return f\n\n\n@pytest.fixture\ndef refresh_token_factory():\n    def f(*, user, client, scopes=None):\n        adapter = get_adapter()\n        value = uuid.uuid4().hex\n        rt = Token.objects.create(\n            client=client,\n            user=user,\n            type=Token.Type.REFRESH_TOKEN,\n            hash=adapter.hash_token(value),\n            expires_at=timezone.now() + timedelta(seconds=60),\n        )\n        if scopes is None:\n            scopes = [\"openid\", \"profile\"]\n        rt.set_scopes(scopes)\n        rt.save()\n        return value, rt\n\n    return f\n"
  },
  {
    "path": "tests/apps/idp/oidc/contrib/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/idp/oidc/contrib/ninja/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/idp/oidc/contrib/ninja/test_views.py",
    "content": "from http import HTTPStatus\n\n\ndef test_resource(db, client, access_token_generator, user, oidc_client):\n    token, _ = access_token_generator(\n        client=oidc_client, user=user, scopes=[\"view-resource\"]\n    )\n    resp = client.get(\"/idp/ninja/resource\", HTTP_AUTHORIZATION=f\"bearer {token}\")\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.json()[\"user_email\"] == user.email\n\n\ndef test_resource_using_id_token(db, client, id_token_generator, user, oidc_client):\n    token = id_token_generator(client=oidc_client, user=user)\n    resp = client.get(\"/idp/ninja/resource\", HTTP_AUTHORIZATION=f\"bearer {token}\")\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n\n\ndef test_resource_forbidden(db, client, access_token_generator, user, oidc_client):\n    token, _ = access_token_generator(\n        client=oidc_client, user=user, scopes=[\"other-resource\"]\n    )\n    resp = client.get(\"/idp/ninja/resource\", HTTP_AUTHORIZATION=f\"bearer {token}\")\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n\n\ndef test_resource_user_inactive(db, client, access_token_generator, user, oidc_client):\n    user.is_active = False\n    user.save(update_fields=[\"is_active\"])\n    token, _ = access_token_generator(\n        client=oidc_client, user=user, scopes=[\"view-resource\"]\n    )\n    resp = client.get(\"/idp/ninja/resource\", HTTP_AUTHORIZATION=f\"bearer {token}\")\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n"
  },
  {
    "path": "tests/apps/idp/oidc/contrib/rest_framework/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/idp/oidc/contrib/rest_framework/test_views.py",
    "content": "from http import HTTPStatus\n\nfrom django.urls import reverse\n\n\ndef test_resource(db, client, access_token_generator, user, oidc_client):\n    token, _ = access_token_generator(\n        client=oidc_client, user=user, scopes=[\"view-resource\"]\n    )\n    resp = client.get(\n        reverse(\"idp_rest_framework_resource\"), HTTP_AUTHORIZATION=f\"bearer {token}\"\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.json()[\"user_email\"] == user.email\n\n\ndef test_resource_without_user(db, client, access_token_generator, oidc_client):\n    token, _ = access_token_generator(\n        client=oidc_client, user=None, scopes=[\"view-resource\"]\n    )\n    resp = client.get(\n        reverse(\"idp_rest_framework_resource\"), HTTP_AUTHORIZATION=f\"bearer {token}\"\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.json()[\"user_email\"] is None\n\n\ndef test_resource_forbidden(db, client, access_token_generator, user, oidc_client):\n    token, _ = access_token_generator(\n        client=oidc_client, user=user, scopes=[\"other-resource\"]\n    )\n    resp = client.get(\n        reverse(\"idp_rest_framework_resource\"), HTTP_AUTHORIZATION=f\"bearer {token}\"\n    )\n    assert resp.status_code == HTTPStatus.FORBIDDEN\n"
  },
  {
    "path": "tests/apps/idp/oidc/internal/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/idp/oidc/internal/oauthlib/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/idp/oidc/internal/oauthlib/test_request_validator.py",
    "content": "from types import SimpleNamespace\n\nimport pytest\n\nfrom allauth.idp.oidc.internal.oauthlib.request_validator import (\n    OAuthLibRequestValidator,\n)\n\n\n@pytest.mark.parametrize(\n    \"origin,allowed_origins,is_allowed\",\n    [\n        (\"http://origin\", [\"https://origin\"], False),\n        (\"https://origin\", [\"https://origin\"], True),\n        (\"https://origin\", [], False),\n        (\"https://origin\", [\"https://notthis\", \"https://origin\"], True),\n    ],\n)\ndef test_is_origin_allowed(origin, allowed_origins, is_allowed, oidc_client):\n    oidc_client.set_cors_origins(allowed_origins)\n    oidc_client.save()\n    request = SimpleNamespace()\n    assert (\n        OAuthLibRequestValidator().is_origin_allowed(oidc_client.id, origin, request)\n        == is_allowed\n    )\n"
  },
  {
    "path": "tests/apps/idp/oidc/internal/oauthlib/test_utils.py",
    "content": "import pytest\n\nfrom allauth.idp.oidc.internal.oauthlib.utils import get_uri\n\n\n@pytest.mark.parametrize(\n    \"input,output\",\n    [\n        (\"/foo?q=param\", \"/foo?q=param\"),\n        (\n            \"/foo?q=a|b&c=c^d&p=`\",\n            \"/foo?q=a%7Cb&c=c%5Ed&p=%60\",\n        ),\n    ],\n)\ndef test_get_uri(rf, input, output):\n    request = rf.get(input)\n    assert get_uri(request) == output\n"
  },
  {
    "path": "tests/apps/idp/oidc/test_authorization.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY\nfrom urllib.parse import parse_qs, urlparse\n\nfrom django.test import Client\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nimport jwt\nimport pytest\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.idp.oidc.models import Token\nfrom allauth.socialaccount.providers.oauth2.utils import generate_code_challenge\n\n\ndef test_cancel_authorization(auth_client, oidc_client):\n    redirect_uri = oidc_client.get_redirect_uris()[0]\n    resp = auth_client.get(\n        reverse(\"idp:oidc:authorization\")\n        + \"?\"\n        + urlencode(\n            {\n                \"client_id\": oidc_client.id,\n                \"response_type\": \"code\",\n                \"redirect_uri\": redirect_uri,\n            }\n        )\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"idp/oidc/authorization_form.html\")\n    resp = auth_client.post(\n        reverse(\"idp:oidc:authorization\"),\n        {\n            \"request\": resp.context[\"form\"][\"request\"].value(),\n        },\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == f\"{redirect_uri}?error=access_denied\"\n\n\n@pytest.mark.parametrize(\n    \"access_token_format,scopes,has_secondary_email,choose_secondary_email\",\n    [\n        (\"opaque\", (\"openid\", \"profile\", \"email\"), False, False),\n        (\"opaque\", (\"openid\", \"profile\", \"email\"), True, False),\n        (\"opaque\", (\"openid\", \"profile\", \"email\"), True, True),\n        (\"opaque\", (\"openid\", \"profile\"), False, False),\n        (\"opaque\", (\"openid\",), False, False),\n        (\"jwt\", (\"openid\",), False, False),\n    ],\n)\ndef test_authorization_code_flow(\n    auth_client,\n    user,\n    oidc_client,\n    oidc_client_secret,\n    enable_cache,\n    scopes,\n    has_secondary_email,\n    choose_secondary_email,\n    email_factory,\n    settings,\n    access_token_format,\n):\n    settings.IDP_OIDC_ACCESS_TOKEN_FORMAT = access_token_format\n    secondary_email = email_factory()\n    EmailAddress.objects.create(\n        user=user,\n        email=secondary_email,\n        primary=False,\n        verified=True,\n    )\n    redirect_uri = oidc_client.get_redirect_uris()[0]\n    resp = auth_client.get(\n        reverse(\"idp:oidc:authorization\")\n        + \"?\"\n        + urlencode(\n            {\n                \"client_id\": oidc_client.id,\n                \"redirect_uri\": redirect_uri,\n                \"response_type\": \"code\",\n                \"scope\": \" \".join(scopes),\n                \"nonce\": \"some-nonce\",\n                \"state\": \"some-state\",\n            }\n        )\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"idp/oidc/authorization_form.html\")\n    post_data = {\n        \"scopes\": scopes,\n        \"action\": \"grant\",\n        \"request\": resp.context[\"form\"][\"request\"].value(),\n    }\n    expected_email = secondary_email if choose_secondary_email else user.email\n    if has_secondary_email and \"email\" in scopes:\n        post_data[\"email\"] = expected_email\n    resp = auth_client.post(\n        reverse(\"idp:oidc:authorization\"),\n        post_data,\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    redirected_uri = resp[\"location\"]\n    assert redirected_uri.startswith(redirected_uri)\n    parts = urlparse(redirected_uri)\n    params = parse_qs(parts.query)\n    code = params[\"code\"][0]\n    assert params[\"state\"][0] == \"some-state\"\n    resp = auth_client.post(\n        reverse(\"idp:oidc:token\"),\n        {\n            \"code\": code,\n            \"grant_type\": \"authorization_code\",\n            \"client_id\": oidc_client.id,\n            \"client_secret\": oidc_client_secret,\n            \"redirect_uri\": redirect_uri,\n        },\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert set(data.keys()) == {\n        \"access_token\",\n        \"expires_in\",\n        \"token_type\",\n        \"scope\",\n        \"refresh_token\",\n        \"id_token\",\n    }\n\n    access_token = Token.objects.lookup(Token.Type.ACCESS_TOKEN, data[\"access_token\"])\n    assert bool(access_token.get_scope_email()) == bool(\n        \"email\" in scopes and has_secondary_email and choose_secondary_email\n    )\n\n    # Access token\n    if access_token_format == \"jwt\":\n        decoded = jwt.decode(data[\"access_token\"], options={\"verify_signature\": False})\n        assert decoded == {\n            \"client_id\": oidc_client.id,\n            \"exp\": ANY,\n            \"iat\": ANY,\n            \"iss\": \"http://testserver\",\n            \"jti\": ANY,\n            \"scope\": \" \".join(scopes),\n            \"sub\": str(user.pk),\n            \"token_use\": \"access\",\n        }\n\n    # ID token\n    id_token = data[\"id_token\"]\n    decoded = jwt.decode(id_token, options={\"verify_signature\": False})\n    assert decoded[\"sub\"] == str(user.pk)\n    assert decoded[\"nonce\"] == \"some-nonce\"\n    if \"email\" in scopes:\n        assert decoded[\"email\"] == expected_email\n    else:\n        assert \"email\" not in decoded\n    if \"profile\" in scopes:\n        assert decoded[\"preferred_username\"] == user.username\n    else:\n        assert \"preferred_username\" not in decoded\n\n\ndef test_authorization_code_flow_skip_consent(\n    auth_client, user, oidc_client, oidc_client_secret, enable_cache\n):\n    oidc_client.skip_consent = True\n    oidc_client.save()\n    redirect_uri = oidc_client.get_redirect_uris()[0]\n    resp = auth_client.get(\n        reverse(\"idp:oidc:authorization\")\n        + \"?\"\n        + urlencode(\n            {\n                \"client_id\": oidc_client.id,\n                \"response_type\": \"code\",\n                \"scope\": \"openid profile email\",\n                \"nonce\": \"some-nonce\",\n                \"state\": \"some-state\",\n                \"redirect_uri\": redirect_uri,\n            }\n        )\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    redirected_uri = resp[\"location\"]\n    assert redirected_uri.startswith(redirect_uri)\n    parts = urlparse(redirected_uri)\n    params = parse_qs(parts.query)\n    code = params[\"code\"][0]\n    resp = auth_client.post(\n        reverse(\"idp:oidc:token\"),\n        {\n            \"code\": code,\n            \"grant_type\": \"authorization_code\",\n            \"client_id\": oidc_client.id,\n            \"client_secret\": oidc_client_secret,\n            \"redirect_uri\": redirect_uri,\n        },\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert set(data.keys()) == {\n        \"access_token\",\n        \"expires_in\",\n        \"token_type\",\n        \"scope\",\n        \"refresh_token\",\n        \"id_token\",\n    }\n\n\ndef test_authorization_id_token_hint_match(\n    user, id_token_generator, oidc_client, auth_client, user_factory\n):\n    redirect_uri = oidc_client.get_redirect_uris()[0]\n    # Pass along ID token as hint\n    resp = auth_client.get(\n        reverse(\"idp:oidc:authorization\")\n        + \"?\"\n        + urlencode(\n            {\n                \"client_id\": oidc_client.id,\n                \"id_token_hint\": id_token_generator(oidc_client, user),\n                \"response_type\": \"code\",\n                \"scope\": \"openid\",\n                \"nonce\": \"some-nonce\",\n                \"state\": \"some-state\",\n                \"redirect_uri\": redirect_uri,\n            }\n        )\n    )\n    assert resp.status_code == HTTPStatus.OK\n\n\ndef test_authorization_id_token_hint_mismatch(\n    user, id_token_generator, oidc_client, auth_client, user_factory\n):\n    redirect_uri = oidc_client.get_redirect_uris()[0]\n    # Pass along ID token as hint\n    resp = auth_client.get(\n        reverse(\"idp:oidc:authorization\")\n        + \"?\"\n        + urlencode(\n            {\n                \"client_id\": oidc_client.id,\n                \"id_token_hint\": id_token_generator(oidc_client, user_factory()),\n                \"response_type\": \"code\",\n                \"redirect_uri\": redirect_uri,\n                \"scope\": \"openid\",\n                \"nonce\": \"some-nonce\",\n                \"state\": \"some-state\",\n            }\n        )\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    parts = urlparse(resp[\"location\"])\n    params = parse_qs(parts.query)\n    assert params[\"error\"] == [\"login_required\"]\n    assert params[\"error_description\"] == [\n        \"Session user does not match client supplied user.\"\n    ]\n\n\ndef test_authorization_post_redirects_to_get(auth_client):\n    payload = {\n        \"client_id\": \"c123\",\n        \"response_type\": \"code\",\n        \"scope\": \"openid\",\n        \"nonce\": \"some-nonce\",\n        \"state\": \"some-state\",\n    }\n    resp = auth_client.post(reverse(\"idp:oidc:authorization\"), data=payload)\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"idp:oidc:authorization\") + \"?\" + urlencode(\n        payload\n    )\n\n\ndef test_authorization_post_redirects_anon_to_get(db, client):\n    payload = {\n        \"client_id\": \"c123\",\n        \"response_type\": \"code\",\n        \"scope\": \"openid\",\n        \"nonce\": \"some-nonce\",\n        \"state\": \"some-state\",\n    }\n    resp = client.post(reverse(\"idp:oidc:authorization\"), data=payload, follow=True)\n    assert resp.status_code == HTTPStatus.OK\n    url = f\"{reverse('idp:oidc:authorization')}?{urlencode(payload)}\"\n    assert resp.redirect_chain == [\n        (url, HTTPStatus.FOUND),\n        (\n            reverse(\"account_login\")\n            + \"?\"\n            + urlencode({\"next\": url}).replace(\"%2F\", \"/\"),\n            HTTPStatus.FOUND,\n        ),\n    ]\n\n\ndef test_authorization_post_is_csrf_protected(user):\n    client = Client(enforce_csrf_checks=True)\n    client.force_login(user)\n    payload = {\n        \"request\": \"dummy\",\n        \"scopes\": \"openid\",\n    }\n    resp = client.post(reverse(\"idp:oidc:authorization\"), data=payload)\n    assert resp.status_code == HTTPStatus.FORBIDDEN\n    assert b\"CSRF Failed\" in resp.content\n\n\n@pytest.mark.parametrize(\"valid_code_verifier\", [False, True])\ndef test_authorization_code_flow_with_pkce(\n    auth_client,\n    user,\n    oidc_client,\n    enable_cache,\n    valid_code_verifier,\n):\n    oidc_client.type = oidc_client.Type.PUBLIC\n    oidc_client.save()\n    redirect_uri = oidc_client.get_redirect_uris()[0]\n    scopes = [\"openid\", \"profile\", \"email\"]\n    pkce = generate_code_challenge()\n    resp = auth_client.get(\n        reverse(\"idp:oidc:authorization\")\n        + \"?\"\n        + urlencode(\n            {\n                \"client_id\": oidc_client.id,\n                \"redirect_uri\": redirect_uri,\n                \"response_type\": \"code\",\n                \"scope\": \" \".join(scopes),\n                \"nonce\": \"some-nonce\",\n                \"state\": \"some-state\",\n                \"code_challenge\": pkce[\"code_challenge\"],\n                \"code_challenge_method\": pkce[\"code_challenge_method\"],\n            }\n        )\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"idp/oidc/authorization_form.html\")\n    resp = auth_client.post(\n        reverse(\"idp:oidc:authorization\"),\n        {\n            \"scopes\": scopes,\n            \"action\": \"grant\",\n            \"request\": resp.context[\"form\"][\"request\"].value(),\n        },\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    redirected_uri = resp[\"location\"]\n    assert redirected_uri.startswith(redirected_uri)\n    parts = urlparse(redirected_uri)\n    params = parse_qs(parts.query)\n    code = params[\"code\"][0]\n    assert params[\"state\"][0] == \"some-state\"\n    resp = auth_client.post(\n        reverse(\"idp:oidc:token\"),\n        {\n            \"grant_type\": \"authorization_code\",\n            \"code\": code,\n            \"client_id\": oidc_client.id,\n            \"redirect_uri\": redirect_uri,\n            \"state\": \"some-state\",\n            \"code_verifier\": pkce[\"code_verifier\"] if valid_code_verifier else \"WRONG\",\n        },\n    )\n    if not valid_code_verifier:\n        assert resp.status_code == HTTPStatus.BAD_REQUEST\n        return\n\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert set(data.keys()) == {\n        \"access_token\",\n        \"expires_in\",\n        \"id_token\",\n        \"token_type\",\n        \"scope\",\n        \"refresh_token\",\n    }\n\n\n@pytest.mark.parametrize(\"client_fixture\", [\"auth_client\", \"client\"])\n@pytest.mark.parametrize(\n    \"prompt,next_prompt\", [(\"login\", None), (\"login consent\", \"consent\")]\n)\ndef test_redirect_to_login_with_prompt_login(\n    request, client_fixture, oidc_client, prompt, next_prompt\n):\n    client = request.getfixturevalue(client_fixture)\n    redirect_uri = oidc_client.get_redirect_uris()[0]\n    resp = client.get(\n        reverse(\"idp:oidc:authorization\")\n        + \"?\"\n        + urlencode(\n            {\n                \"client_id\": oidc_client.id,\n                \"response_type\": \"code\",\n                \"redirect_uri\": redirect_uri,\n                \"prompt\": prompt,\n            }\n        )\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    parts = urlparse(resp[\"location\"])\n    assert parts.path == reverse(\n        \"account_login\" if client_fixture == \"client\" else \"account_reauthenticate\"\n    )\n    params = parse_qs(parts.query)\n    params = parse_qs(urlparse(params[\"next\"][0]).query)\n    if next_prompt:\n        assert params[\"prompt\"][0] == next_prompt\n    else:\n        assert \"prompt\" not in params\n\n\n@pytest.mark.parametrize(\n    \"client_fixture,scope,error\",\n    [\n        (\"auth_client\", \"openid\", None),\n        (\"auth_client\", \"openid profile\", \"consent_required\"),\n        (\"client\", \"openid\", \"login_required\"),\n    ],\n)\ndef test_prompt_none(\n    request,\n    client_fixture,\n    scope,\n    error,\n    oidc_client,\n    user,\n    access_token_generator,\n):\n    access_token_generator(oidc_client, user, scopes=[\"openid\"])\n    client = request.getfixturevalue(client_fixture)\n    redirect_uri = oidc_client.get_redirect_uris()[0]\n    resp = client.get(\n        reverse(\"idp:oidc:authorization\")\n        + \"?\"\n        + urlencode(\n            {\n                \"client_id\": oidc_client.id,\n                \"response_type\": \"code\",\n                \"scope\": scope,\n                \"redirect_uri\": redirect_uri,\n                \"prompt\": \"none\",\n            }\n        )\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    if error:\n        assert resp[\"location\"] == f\"https://client/callback?error={error}\"\n    else:\n        assert resp[\"location\"].startswith(\"https://client/callback?code=\")\n"
  },
  {
    "path": "tests/apps/idp/oidc/test_device.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY\n\nfrom django.core.cache import cache\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nimport pytest\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.idp.oidc import app_settings\nfrom allauth.idp.oidc.internal.oauthlib import device_codes\nfrom allauth.idp.oidc.models import Client, Token\n\n\n@pytest.fixture\ndef poll_sleep():\n    def f(device_code, seconds):\n        data = cache.get(device_codes.cache_device_code_key(device_code))\n        if data:\n            data[\"last_poll_at\"] -= seconds\n            device_codes.update_device_state(device_code, data)\n\n    return f\n\n\ndef test_device_flow_invalid_client(\n    db,\n    client,\n):\n    payload = {\n        \"client_id\": \"unknown\",\n    }\n    resp = client.post(\n        reverse(\"idp:oidc:device_code\"),\n        data=urlencode(payload),\n        content_type=\"application/x-www-form-urlencoded\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\n        \"error\": \"invalid_request\",\n        \"error_description\": \"Invalid client_id parameter value.\",\n    }\n\n\ndef test_device_flow_invalid_scope(db, client, device_client):\n    payload = {\n        \"client_id\": device_client.id,\n        \"scope\": \"openid wrong\",\n    }\n    resp = client.post(\n        reverse(\"idp:oidc:device_code\"),\n        data=urlencode(payload),\n        content_type=\"application/x-www-form-urlencoded\",\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\"error\": \"invalid_scope\"}\n\n\n@pytest.mark.parametrize(\"action\", [\"deny\", \"confirm\"])\n@pytest.mark.parametrize(\"with_scope\", [False, True])\ndef test_device_flow(\n    client,\n    auth_client,\n    device_client,\n    enable_cache,\n    action,\n    user,\n    with_scope,\n    poll_sleep,\n):\n    device_client.set_default_scopes([\"profile\"])\n    device_client.save()\n    payload = {\n        \"client_id\": device_client.id,\n    }\n    if with_scope:\n        payload[\"scope\"] = \"openid email\"\n    resp = client.post(\n        reverse(\"idp:oidc:device_code\"),\n        data=urlencode(payload),\n        content_type=\"application/x-www-form-urlencoded\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert data == {\n        \"verification_uri\": \"http://testserver/identity/o/device\",\n        \"verification_uri_complete\": ANY,\n        \"expires_in\": app_settings.DEVICE_CODE_EXPIRES_IN,\n        \"user_code\": ANY,\n        \"device_code\": ANY,\n        \"interval\": 5,\n    }\n    assert (\n        data[\"verification_uri_complete\"]\n        == f\"{data['verification_uri']}?code={data['user_code']}\"\n    )\n\n    resp = client.post(\n        reverse(\"idp:oidc:token\"),\n        {\n            \"device_code\": data[\"device_code\"],\n            \"grant_type\": Client.GrantType.DEVICE_CODE,\n            \"client_id\": device_client.id,\n        },\n    )\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\n        \"error\": \"authorization_pending\",\n    }\n\n    resp = auth_client.get(data[\"verification_uri\"])\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"idp/oidc/device_authorization_code_form.html\")\n    assert resp.context[\"form\"].errors == {}\n\n    resp = auth_client.get(f\"{data['verification_uri']}?code=wrong\")\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"idp/oidc/device_authorization_code_form.html\")\n    assert resp.context[\"form\"].errors == {\"code\": [\"Incorrect code.\"]}\n\n    resp = auth_client.get(data[\"verification_uri_complete\"])\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"idp/oidc/device_authorization_confirm_form.html\")\n\n    confirmed = action == \"confirm\"\n    resp = auth_client.post(data[\"verification_uri_complete\"], {\"action\": action})\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(\n        resp,\n        (\n            \"idp/oidc/device_authorization_confirmed.html\"\n            if confirmed\n            else \"idp/oidc/device_authorization_denied.html\"\n        ),\n    )\n\n    poll_sleep(data[\"device_code\"], 10)\n    resp = client.post(\n        reverse(\"idp:oidc:token\"),\n        {\n            \"device_code\": data[\"device_code\"],\n            \"grant_type\": Client.GrantType.DEVICE_CODE,\n            \"client_id\": device_client.id,\n        },\n    )\n    if confirmed:\n        assert resp.status_code == HTTPStatus.OK\n        assert resp.json() == {\n            \"access_token\": ANY,\n            \"expires_in\": 3600,\n            \"refresh_token\": ANY,\n            \"scope\": \"openid email\" if with_scope else \"profile\",\n            \"token_type\": \"Bearer\",\n        }\n        token = Token.objects.lookup(\n            Token.Type.ACCESS_TOKEN, resp.json()[\"access_token\"]\n        )\n        assert token.user_id == user.pk\n        # Single-use device codes.\n        poll_sleep(data[\"device_code\"], 10)\n        resp = client.post(\n            reverse(\"idp:oidc:token\"),\n            {\n                \"device_code\": data[\"device_code\"],\n                \"grant_type\": Client.GrantType.DEVICE_CODE,\n                \"client_id\": device_client.id,\n            },\n        )\n        assert resp.status_code == HTTPStatus.BAD_REQUEST\n        assert resp.json() == {\n            \"error\": \"invalid_grant\",\n        }\n\n    else:\n        assert resp.status_code == HTTPStatus.BAD_REQUEST\n        assert resp.json() == {\n            \"error\": \"access_denied\",\n        }\n\n\ndef test_slow_down_flow(client, device_client, enable_cache, poll_sleep):\n    payload = {\n        \"client_id\": device_client.id,\n    }\n    resp = client.post(\n        reverse(\"idp:oidc:device_code\"),\n        data=urlencode(payload),\n        content_type=\"application/x-www-form-urlencoded\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n\n    for sleep, error in [\n        (0, \"authorization_pending\"),\n        (3, \"slow_down\"),\n        (3, \"authorization_pending\"),\n    ]:\n        if sleep:\n            poll_sleep(data[\"device_code\"], sleep)\n        resp = client.post(\n            reverse(\"idp:oidc:token\"),\n            {\n                \"device_code\": data[\"device_code\"],\n                \"grant_type\": Client.GrantType.DEVICE_CODE,\n                \"client_id\": device_client.id,\n            },\n        )\n        assert resp.status_code == HTTPStatus.BAD_REQUEST\n        assert resp.json() == {\"error\": error}\n"
  },
  {
    "path": "tests/apps/idp/oidc/test_rp_initiated_logout.py",
    "content": "from http import HTTPStatus\n\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nimport pytest\n\nfrom allauth.idp.oidc.models import Token\n\n\n@pytest.mark.parametrize(\"method\", [\"GET\", \"POST\"])\n@pytest.mark.parametrize(\n    \"post_logout_redirect_uri,state,expected_location\",\n    [\n        (None, None, \"/\"),\n        (\"https://rp.client/logged-out\", None, \"https://rp.client/logged-out\"),\n        (\n            \"https://rp.client/logged-out\",\n            \"mystate\",\n            \"https://rp.client/logged-out?state=mystate\",\n        ),\n        (\"http://no-http.org/please\", None, \"/\"),\n    ],\n)\ndef test_logout_while_anonymous(\n    method, client, post_logout_redirect_uri, state, expected_location\n):\n    params = {}\n    if post_logout_redirect_uri:\n        params[\"post_logout_redirect_uri\"] = post_logout_redirect_uri\n    if state:\n        params[\"state\"] = state\n    if method == \"GET\":\n        query = None\n        if params:\n            query = urlencode(params)\n        resp = client.get(reverse(\"idp:oidc:logout\") + (f\"?{query}\" if query else \"\"))\n    else:\n        resp = client.post(reverse(\"idp:oidc:logout\"), data=params)\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == expected_location\n\n\n@pytest.mark.parametrize(\"method\", [\"GET\", \"POST\"])\ndef test_logout_must_ask(auth_client, settings, method):\n    settings.IDP_OIDC_RP_INITIATED_LOGOUT_ASKS_FOR_OP_LOGOUT = False\n    params = {}\n    if method == \"GET\":\n        query = None\n        if params:\n            query = urlencode(params)\n        resp = auth_client.get(\n            reverse(\"idp:oidc:logout\") + (f\"?{query}\" if query else \"\")\n        )\n    else:\n        resp = auth_client.post(reverse(\"idp:oidc:logout\"), data=params)\n    assert resp.status_code == HTTPStatus.OK\n\n\n@pytest.mark.parametrize(\n    \"csrfmiddlewaretoken, status_code\",\n    [(None, HTTPStatus.OK), (\"\", HTTPStatus.FORBIDDEN), (\"hack\", HTTPStatus.FORBIDDEN)],\n)\ndef test_rp_cannot_bypass(auth_client, csrfmiddlewaretoken, status_code):\n    auth_client.enforce_csrf_checks = True\n    auth_client.handler.enforce_csrf_checks = True\n    params = {\n        # Try a POST that answers the question right away...\n        \"action\": \"logout\",\n    }\n    if csrfmiddlewaretoken is not None:\n        params[\"csrfmiddlewaretoken\"] = \"hack\"\n    resp = auth_client.post(reverse(\"idp:oidc:logout\"), data=params)\n    assert resp.status_code == status_code\n\n\n@pytest.mark.parametrize(\"method\", [\"GET\", \"POST\"])\ndef test_logout_without_asking(\n    auth_client,\n    user,\n    settings,\n    method,\n    oidc_client,\n    id_token_generator,\n    access_token_generator,\n    refresh_token_factory,\n):\n    id_token_hint = id_token_generator(oidc_client, user)\n    access_token, access_token_instance = access_token_generator(oidc_client, user)\n    refresh_token, refresh_token_instance = refresh_token_factory(\n        user=user, client=oidc_client\n    )\n    settings.IDP_OIDC_RP_INITIATED_LOGOUT_ASKS_FOR_OP_LOGOUT = False\n    params = {\n        \"id_token_hint\": id_token_hint,\n        \"post_logout_redirect_uri\": \"https://rp.client/logged-out\",\n    }\n    if method == \"GET\":\n        query = None\n        if params:\n            query = urlencode(params)\n        resp = auth_client.get(\n            reverse(\"idp:oidc:logout\") + (f\"?{query}\" if query else \"\")\n        )\n    else:\n        resp = auth_client.post(reverse(\"idp:oidc:logout\"), data=params)\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == \"https://rp.client/logged-out\"\n\n    assert not Token.objects.filter(pk=access_token_instance.pk).exists()\n    assert not Token.objects.filter(pk=refresh_token_instance.pk).exists()\n    resp = auth_client.get(reverse(\"account_email\"))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"].startswith(reverse(\"account_login\"))\n"
  },
  {
    "path": "tests/apps/idp/oidc/test_tokens.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY\n\nfrom django.urls import reverse\n\nimport pytest\n\nfrom allauth.idp.oidc.models import Token\n\n\ndef test_userinfo_bad_token(client, oidc_client, user):\n    # Pass along ID token as hint\n    resp = client.get(reverse(\"idp:oidc:userinfo\"))\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n    assert resp.json() == {\n        \"error\": \"invalid_token\",\n        \"error_description\": \"The access token provided is expired, revoked, malformed, or invalid for other reasons.\",\n    }\n\n\ndef test_revoke_access_token(\n    client, oidc_client, oidc_client_secret, user, access_token_generator\n):\n    token, instance = access_token_generator(oidc_client, user)\n    _, instance_to_keep = access_token_generator(oidc_client, user)\n    resp = client.post(\n        reverse(\"idp:oidc:revoke\"),\n        data={\n            \"client_id\": oidc_client.id,\n            \"client_secret\": oidc_client_secret,\n            \"token\": token,\n        },\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert not Token.objects.filter(pk=instance.pk).exists()\n    assert Token.objects.filter(pk=instance_to_keep.pk).exists()\n\n\n@pytest.mark.parametrize(\"rotate_refresh_token\", [False, True])\n@pytest.mark.parametrize(\"scopes\", [(\"openid\",), (\"openid\", \"email\")])\ndef test_refresh_token(\n    db,\n    client,\n    oidc_client,\n    oidc_client_secret,\n    user,\n    refresh_token_factory,\n    settings,\n    rotate_refresh_token,\n    scopes,\n):\n    settings.IDP_OIDC_ROTATE_REFRESH_TOKEN = rotate_refresh_token\n    rt, rt_instance = refresh_token_factory(\n        user=user, client=oidc_client, scopes=scopes\n    )\n    rt_instance.set_scope_email(\"a@b.org\")\n    rt_instance.save()\n    resp = client.post(\n        reverse(\"idp:oidc:token\"),\n        {\n            \"refresh_token\": rt,\n            \"grant_type\": \"refresh_token\",\n            \"client_id\": oidc_client.id,\n            \"client_secret\": oidc_client_secret,\n        },\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    new_rt_instance = Token.objects.lookup(\n        Token.Type.REFRESH_TOKEN, data[\"refresh_token\"]\n    )\n    if rotate_refresh_token:\n        assert data[\"refresh_token\"] != rt\n        assert new_rt_instance.pk != rt_instance.pk\n    else:\n        assert data[\"refresh_token\"] == rt\n    assert Token.objects.filter(type=Token.Type.REFRESH_TOKEN).count() == 1\n    token = Token.objects.lookup(Token.Type.ACCESS_TOKEN, data[\"access_token\"])\n\n    assert token.get_scope_email() == (\"a@b.org\" if \"email\" in scopes else None)\n    return\n    assert data == {\n        \"access_token\": ANY,\n        \"expires_in\": 3600,\n        \"refresh_token\": ANY,\n        \"scope\": \"openid profile\",\n        \"token_type\": \"Bearer\",\n    }\n\n\ndef test_revoke_refresh_token(\n    db, client, oidc_client, oidc_client_secret, user, refresh_token_factory\n):\n    token_value, token_instance = refresh_token_factory(user=user, client=oidc_client)\n    resp = client.post(\n        reverse(\"idp:oidc:revoke\"),\n        {\n            \"token\": token_value,\n            \"client_id\": oidc_client.id,\n            \"client_secret\": oidc_client_secret,\n        },\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.content == b\"\"\n    assert not Token.objects.filter(pk=token_instance.pk).exists()\n"
  },
  {
    "path": "tests/apps/idp/oidc/test_views.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY\nfrom urllib.parse import parse_qs, urlparse\n\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nimport jwt\nimport pytest\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.idp.oidc.adapter import get_adapter\nfrom allauth.idp.oidc.models import Token\n\n\n@pytest.mark.parametrize(\n    \"scopes,has_secondary_email,choose_secondary_email\",\n    [\n        ((\"openid\",), False, False),\n        ((\"openid\", \"email\"), False, False),\n        ((\"openid\", \"email\"), True, True),\n    ],\n)\ndef test_userinfo(\n    client,\n    oidc_client,\n    user,\n    access_token_generator,\n    scopes,\n    has_secondary_email,\n    choose_secondary_email,\n    email_factory,\n):\n    # Pass along ID token as hint\n    token, token_instance = access_token_generator(oidc_client, user, scopes=scopes)\n    if has_secondary_email:\n        email = email_factory()\n        EmailAddress.objects.create(\n            user=user, email=email, verified=True, primary=False\n        )\n        token_instance.set_scope_email(email)\n        token_instance.save()\n        expected_email = email if choose_secondary_email else user.email\n    else:\n        expected_email = user.email\n    resp = client.get(\n        reverse(\"idp:oidc:userinfo\"),\n        HTTP_AUTHORIZATION=f\"Bearer {token}\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert data[\"sub\"] == get_adapter().get_user_sub(oidc_client, user)\n    if \"email\" in scopes:\n        assert data[\"email\"] == expected_email\n        assert data[\"email_verified\"] is True\n    else:\n        assert \"email\" not in data\n\n\n@pytest.mark.parametrize(\"access_token_format\", [\"jwt\", \"opaque\"])\ndef test_client_credentials(\n    client, oidc_client, oidc_client_secret, access_token_format, settings\n):\n    settings.IDP_OIDC_ACCESS_TOKEN_FORMAT = access_token_format\n    resp = client.post(\n        reverse(\"idp:oidc:token\"),\n        data={\n            \"client_id\": oidc_client.id,\n            \"client_secret\": oidc_client_secret,\n            \"scope\": \"profile email\",\n            \"grant_type\": \"client_credentials\",\n        },\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert data == {\n        \"access_token\": ANY,\n        \"expires_in\": 3600,\n        \"scope\": \"profile email\",\n        \"token_type\": \"Bearer\",\n    }\n    token = Token.objects.lookup(Token.Type.ACCESS_TOKEN, data[\"access_token\"])\n    assert token.client == oidc_client\n    assert token.get_scopes() == [\"profile\", \"email\"]\n\n    if access_token_format == \"jwt\":\n        decoded = jwt.decode(data[\"access_token\"], options={\"verify_signature\": False})\n        assert decoded == {\n            \"client_id\": oidc_client.id,\n            \"exp\": ANY,\n            \"iat\": ANY,\n            \"iss\": \"http://testserver\",\n            \"jti\": ANY,\n            \"scope\": \"profile email\",\n            \"token_use\": \"access\",\n        }\n\n\ndef test_password_grant_is_blocked(\n    client, oidc_client, oidc_client_secret, user, user_password\n):\n    resp = client.post(\n        reverse(\"idp:oidc:token\"),\n        data={\n            \"client_id\": oidc_client.id,\n            \"client_secret\": oidc_client_secret,\n            # These are valid credentials.\n            \"username\": user.username,\n            \"password\": user_password,\n            \"scope\": \"profile email\",\n            \"grant_type\": \"password\",\n        },\n    )\n    # We don't crash, but also don't grant.\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n    assert resp.json() == {\n        \"error\": \"invalid_grant\",\n        \"error_description\": \"Invalid credentials given.\",\n    }\n\n\ndef test_implicit_grant_flow(auth_client, user, oidc_client, enable_cache):\n    redirect_uri = oidc_client.get_redirect_uris()[0]\n    scopes = [\"openid\", \"profile\"]\n    resp = auth_client.get(\n        reverse(\"idp:oidc:authorization\")\n        + \"?\"\n        + urlencode(\n            {\n                \"client_id\": oidc_client.id,\n                \"response_type\": \"token\",\n                \"scope\": \" \".join(scopes),\n                \"nonce\": \"some-nonce\",\n                \"state\": \"some-state\",\n                \"redirect_uri\": redirect_uri,\n            }\n        )\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"idp/oidc/authorization_form.html\")\n    resp = auth_client.post(\n        reverse(\"idp:oidc:authorization\"),\n        {\n            \"scopes\": scopes,\n            \"action\": \"grant\",\n            \"request\": resp.context[\"form\"][\"request\"].value(),\n        },\n    )\n    # \"https://client/callback#access_token=baI5uc9m5JWc6afKqaZ9eymeOrq1hz&expires_in=3600&token_type=Bearer&scope=openid+profile&state=some-state\"\n    assert resp.status_code == HTTPStatus.FOUND\n    parts = urlparse(resp[\"location\"])\n    data = parse_qs(parts.fragment)\n    assert data == {\n        \"access_token\": ANY,\n        \"expires_in\": [\"3600\"],\n        \"scope\": [\"openid profile\"],\n        \"token_type\": [\"Bearer\"],\n        \"state\": [\"some-state\"],\n    }\n\n\ndef test_userinfo_access_token_as_query(\n    client, oidc_client, user, access_token_generator\n):\n    # Pass along ID token as hint\n    token, _ = access_token_generator(oidc_client, user, scopes=[\"openid\"])\n    resp = client.get(\n        f\"{reverse('idp:oidc:userinfo')}?{urlencode({'access_token': token})}\",\n    )\n    assert resp.status_code == HTTPStatus.UNAUTHORIZED\n\n\ndef test_jwks_view(client):\n    resp = client.get(reverse(\"idp:oidc:jwks\"))\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.json() == {\n        \"keys\": [{\"e\": ANY, \"key_ops\": [\"verify\"], \"kid\": ANY, \"kty\": \"RSA\", \"n\": ANY}]\n    }\n\n\n@pytest.mark.parametrize(\"custom_userinfo_endpoint\", [False, True])\ndef test_configuration_view(\n    client, oidc_client, custom_userinfo_endpoint, settings_impacting_urls\n):\n    with settings_impacting_urls(\n        IDP_OIDC_USERINFO_ENDPOINT=(\n            \"https://remote/userinfo\" if custom_userinfo_endpoint else None\n        )\n    ):\n        resp = client.get(reverse(\"idp:oidc:configuration\"))\n        assert resp.status_code == HTTPStatus.OK\n        assert resp.json() == {\n            \"authorization_endpoint\": \"http://testserver/identity/o/authorize\",\n            \"device_authorization_endpoint\": \"http://testserver/identity/o/api/device/code\",\n            \"end_session_endpoint\": \"http://testserver/identity/o/logout\",\n            \"id_token_signing_alg_values_supported\": [\"RS256\"],\n            \"issuer\": \"http://testserver\",\n            \"jwks_uri\": \"http://testserver/.well-known/jwks.json\",\n            \"response_types_supported\": [\"code\", \"token\"],\n            \"revocation_endpoint\": \"http://testserver/identity/o/api/revoke\",\n            \"subject_types_supported\": [\"public\"],\n            \"token_endpoint\": \"http://testserver/identity/o/api/token\",\n            \"userinfo_endpoint\": (\n                \"https://remote/userinfo\"\n                if custom_userinfo_endpoint\n                else \"http://testserver/identity/o/api/userinfo\"\n            ),\n        }\n\n\ndef test_post_userinfo(\n    client,\n    oidc_client,\n    user,\n    access_token_generator,\n):\n    # Pass along ID token as hint\n    token, token_instance = access_token_generator(oidc_client, user)\n    resp = client.post(\n        reverse(\"idp:oidc:userinfo\"),\n        HTTP_AUTHORIZATION=f\"Bearer {token}\",\n    )\n    assert resp.status_code == HTTPStatus.OK\n    data = resp.json()\n    assert data[\"sub\"] == get_adapter().get_user_sub(oidc_client, user)\n"
  },
  {
    "path": "tests/apps/idp/oidc/test_wildcards.py",
    "content": "from django.core.exceptions import ValidationError\n\nimport pytest\n\nfrom allauth.idp.oidc.internal.clientkit import (\n    _wildcard_to_regex,\n    is_origin_allowed,\n    is_redirect_uri_allowed,\n)\nfrom allauth.idp.oidc.models import Client\n\n\nURI_TEST_CASES = [\n    (False, \"https://example.com\", True),\n    (False, \"https://*.example.com\", False),\n    (True, \"https://example.com\", True),\n    (True, \"https://*.projectname.pages.dev/\", True),\n    (True, \"https://*--projectname-com.netlify.app\", True),\n    (True, \"http://*.localhost:3000\", True),\n    (True, \"https://example.com/callback\", True),\n    (True, \"https://*.*.example.com\", False),\n    (True, \"http*://example.com\", False),\n    (True, \"https://example.com/callback/*\", False),\n]\n\n\n@pytest.mark.parametrize(\n    (\"allow_wildcards\", \"uri\", \"should_pass\"),\n    URI_TEST_CASES,\n)\ndef test_redirect_uri_wildcard_validation(allow_wildcards, uri, should_pass):\n    client = Client(\n        id=\"test-client\",\n        name=\"Test Client\",\n        allow_uri_wildcards=allow_wildcards,\n        redirect_uris=uri,\n    )\n\n    if should_pass:\n        client.clean_redirect_uris()\n    else:\n        with pytest.raises(ValidationError):\n            client.clean_redirect_uris()\n\n\n@pytest.mark.parametrize(\n    (\"allow_wildcards\", \"origin\", \"should_pass\"),\n    URI_TEST_CASES,\n)\ndef test_cors_origin_wildcard_validation(allow_wildcards, origin, should_pass):\n    client = Client(\n        id=\"test-client\",\n        name=\"Test Client\",\n        allow_uri_wildcards=allow_wildcards,\n        cors_origins=origin,\n    )\n\n    if should_pass:\n        client.clean_cors_origins()\n    else:\n        with pytest.raises(ValidationError):\n            client.clean_cors_origins()\n\n\ndef test_wildcards_disabled_by_default():\n    client = Client(\n        id=\"test-client\",\n        name=\"Test Client\",\n        redirect_uris=\"https://example.com\",\n    )\n\n    assert client.allow_uri_wildcards is False\n\n    client.redirect_uris = \"https://*.example.com\"\n    with pytest.raises(ValidationError):\n        client.clean_redirect_uris()\n\n\ndef test_wildcard_matching_enforcement():\n    client = Client(\n        id=\"test-client\",\n        name=\"Test Client\",\n        allow_uri_wildcards=True,\n        redirect_uris=\"https://*.example.com/callback\",\n        cors_origins=\"https://*.example.com\",\n    )\n\n    assert is_redirect_uri_allowed(\n        \"https://subdomain.example.com/callback\",\n        client.get_redirect_uris(),\n        client.allow_uri_wildcards,\n    )\n    assert not is_redirect_uri_allowed(\n        \"https://evil-example.com/callback\",\n        client.get_redirect_uris(),\n        client.allow_uri_wildcards,\n    )\n\n    assert is_origin_allowed(\n        \"https://subdomain.example.com\",\n        client.get_cors_origins(),\n        client.allow_uri_wildcards,\n    )\n\n    assert not is_origin_allowed(\n        \"https://evil-example.com\",\n        client.get_cors_origins(),\n        client.allow_uri_wildcards,\n    )\n\n    assert not is_origin_allowed(\n        \"https://user:pass@foo.example.com\",\n        client.get_cors_origins(),\n        client.allow_uri_wildcards,\n    )\n\n\ndef test_wildcard_to_regex():\n    pattern = _wildcard_to_regex(\"*.example.com\")\n    assert pattern.pattern == r\"^[^.]+\\.example\\.com$\"\n\n    assert pattern.match(\"api.example.com\")\n    assert not pattern.match(\"foo.api.example.com\")  # * should not match dots\n    assert not pattern.match(\"evil-example.com\")\n\n    # verify dots aren't treated as wildcards\n    assert not pattern.match(\"api$example$com\")\n"
  },
  {
    "path": "tests/apps/mfa/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/mfa/base/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/mfa/base/test_adapter.py",
    "content": "from unittest.mock import patch\n\nfrom allauth.mfa.adapter import get_adapter\n\n\ndef test_build_totp_url_encodes_spaces_as_percent(user):\n    \"\"\"Spaces in the issuer name should be percent-encoded (%20), not encoded as\n    '+', so that authenticator apps display the issuer correctly.\n    \"\"\"\n    adapter = get_adapter()\n    with patch.object(adapter, \"get_totp_issuer\", return_value=\"My Company\"):\n        url = adapter.build_totp_url(user, \"JBSWY3DPEHPK3PXP\")\n    assert \"issuer=My%20Company\" in url\n    assert \"issuer=My+Company\" not in url\n"
  },
  {
    "path": "tests/apps/mfa/base/test_trust.py",
    "content": "import time\nfrom http import HTTPStatus\n\nfrom django.conf import settings\nfrom django.urls import reverse\n\nimport pytest\n\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.internal.flows import trust\n\n\ndef test_encode_decode(rf):\n    request = rf.get(\"/\")\n    value = trust.encode_trust_cookie(\n        [\n            trust.IssuedTrust(fingerprint=\"dated\", at=2024),\n            trust.IssuedTrust(fingerprint=\"good\", at=time.time()),\n        ]\n    )\n    request.COOKIES[app_settings.TRUST_COOKIE_NAME] = value\n    trusts = trust.decode_trust_cookie(request)\n    assert len(trusts) == 1\n    assert trusts[0].fingerprint == \"good\"\n\n\ndef test_decode_invalid_value(rf):\n    request = rf.get(\"/\")\n    request.COOKIES[app_settings.TRUST_COOKIE_NAME] = \"bad\"\n    trusts = trust.decode_trust_cookie(request)\n    assert len(trusts) == 0\n\n\n@pytest.mark.parametrize(\"action\", [\"\", \"trust\"])\ndef test_trust_flow(\n    client,\n    user_with_totp,\n    user_password,\n    totp_validation_bypass,\n    settings_impacting_urls,\n    action,\n):\n    with settings_impacting_urls(MFA_TRUST_ENABLED=True):\n        # Login\n        resp = client.post(\n            reverse(\"account_login\"),\n            {\"login\": user_with_totp.username, \"password\": user_password},\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n\n        # Complete TOTP\n        assert resp[\"location\"] == reverse(\"mfa_authenticate\")\n        with totp_validation_bypass():\n            resp = client.post(\n                reverse(\"mfa_authenticate\"),\n                {\"code\": \"123\"},\n            )\n        assert resp.status_code == HTTPStatus.FOUND\n\n        # Indicate trust\n        assert resp[\"location\"] == reverse(\"mfa_trust\")\n        resp = client.post(\n            reverse(\"mfa_trust\"),\n            {\"action\": action},\n        )\n        assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n\n        # Sign out\n        resp = client.post(\n            reverse(\"account_logout\"),\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n\n        # Sign in\n        resp = client.post(\n            reverse(\"account_login\"),\n            {\"login\": user_with_totp.username, \"password\": user_password},\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n        assert resp[\"location\"] == (\n            settings.LOGIN_REDIRECT_URL\n            if action == \"trust\"\n            else reverse(\"mfa_authenticate\")\n        )\n"
  },
  {
    "path": "tests/apps/mfa/base/test_trust_fingerprint.py",
    "content": "from allauth.mfa.internal.flows import trust\nfrom allauth.mfa.models import Authenticator\n\n\ndef test_cookie_encoding():\n    pass\n\n\ndef test_fingerprint_is_stable(user_with_totp, user_with_recovery_codes):\n    fp = trust.create_config_fingerprint(user_with_totp)\n    fp2 = trust.create_config_fingerprint(user_with_totp)\n    assert fp == fp2\n\n\ndef test_fingerprint_changes_on_password_change(user_with_totp, password_factory):\n    fp = trust.create_config_fingerprint(user_with_totp)\n    user_with_totp.set_password(password_factory())\n    fp2 = trust.create_config_fingerprint(user_with_totp)\n    assert fp != fp2\n\n\ndef test_fingerprint_changes_on_recovery_codes_change(\n    user_with_recovery_codes, password_factory\n):\n    fp = trust.create_config_fingerprint(user_with_recovery_codes)\n    auth = Authenticator.objects.get(\n        user=user_with_recovery_codes, type=Authenticator.Type.RECOVERY_CODES\n    )\n    auth.data[\"seed\"] = password_factory()\n    auth.save()\n    fp2 = trust.create_config_fingerprint(user_with_recovery_codes)\n    assert fp != fp2\n\n\ndef test_fingerprint_changes_on_new_authenticator(user_with_totp):\n    fp = trust.create_config_fingerprint(user_with_totp)\n    Authenticator.objects.create(\n        user=user_with_totp, type=Authenticator.Type.RECOVERY_CODES, data={}\n    )\n    fp2 = trust.create_config_fingerprint(user_with_totp)\n    assert fp != fp2\n\n\ndef test_fingerprint_changes_on_authenticator_deletion(\n    user_with_totp, user_with_recovery_codes\n):\n    fp = trust.create_config_fingerprint(user_with_totp)\n    Authenticator.objects.filter(\n        user=user_with_recovery_codes, type=Authenticator.Type.RECOVERY_CODES\n    ).delete()\n    fp2 = trust.create_config_fingerprint(user_with_totp)\n    assert fp != fp2\n"
  },
  {
    "path": "tests/apps/mfa/base/test_views.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY\n\nfrom django.urls import reverse\n\nimport pytest\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.account.authentication import AUTHENTICATION_METHODS_SESSION_KEY\nfrom allauth.mfa.models import Authenticator\n\n\ndef test_reauthentication(auth_client, user_with_recovery_codes):\n    resp = auth_client.get(reverse(\"mfa_view_recovery_codes\"))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n    resp = auth_client.get(reverse(\"mfa_reauthenticate\"))\n    assertTemplateUsed(resp, \"mfa/reauthenticate.html\")\n    authenticator = Authenticator.objects.get(\n        user=user_with_recovery_codes, type=Authenticator.Type.RECOVERY_CODES\n    )\n    unused_code = authenticator.wrap().get_unused_codes()[0]\n    resp = auth_client.post(reverse(\"mfa_reauthenticate\"), data={\"code\": unused_code})\n    assert resp.status_code == HTTPStatus.FOUND\n    resp = auth_client.get(reverse(\"mfa_view_recovery_codes\"))\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"mfa/recovery_codes/index.html\")\n    methods = auth_client.session[AUTHENTICATION_METHODS_SESSION_KEY]\n    assert methods[-1] == {\n        \"method\": \"mfa\",\n        \"type\": \"recovery_codes\",\n        \"id\": authenticator.pk,\n        \"at\": ANY,\n        \"reauthenticated\": True,\n    }\n\n\n@pytest.mark.parametrize(\n    \"url_name\",\n    (\n        \"mfa_activate_totp\",\n        \"mfa_index\",\n        \"mfa_deactivate_totp\",\n    ),\n)\ndef test_login_required_views(client, url_name):\n    resp = client.get(reverse(url_name))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"].startswith(reverse(\"account_login\"))\n\n\ndef test_index(auth_client, user_with_totp):\n    resp = auth_client.get(reverse(\"mfa_index\"))\n    assert \"authenticators\" in resp.context\n\n\n@pytest.mark.parametrize(\"allowed\", [False, True])\ndef test_add_email_not_allowed(\n    auth_client,\n    user_with_totp,\n    settings,\n    allowed,\n):\n    settings.MFA_ALLOW_UNVERIFIED_EMAIL = allowed\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_add\": \"\", \"email\": \"change-to@this.org\"},\n    )\n    if allowed:\n        assert resp.status_code == HTTPStatus.FOUND\n    else:\n        assert resp.status_code == HTTPStatus.OK\n        assert resp.context[\"form\"].errors == {\n            \"email\": [\n                \"You cannot add an email address to an account protected by two-factor authentication.\"\n            ]\n        }\n\n\ndef test_add_email_allowed_when_verification_by_code(\n    auth_client,\n    user_with_totp,\n    settings,\n):\n    settings.ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True\n    resp = auth_client.post(\n        reverse(\"account_email\"),\n        {\"action_add\": \"\", \"email\": \"change-to@this.org\"},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n"
  },
  {
    "path": "tests/apps/mfa/recovery_codes/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/mfa/recovery_codes/test_auth.py",
    "content": "from allauth.mfa import app_settings\nfrom allauth.mfa.models import Authenticator\nfrom allauth.mfa.recovery_codes.internal.auth import RecoveryCodes\n\n\ndef test_flow(user):\n    rc = RecoveryCodes.activate(user)\n    codes = rc.generate_codes()\n    assert len(set(codes)) == app_settings.RECOVERY_CODE_COUNT\n    for code in codes:\n        assert len(code) == app_settings.RECOVERY_CODE_DIGITS\n    for i in range(app_settings.RECOVERY_CODE_COUNT):\n        assert not rc._is_code_used(i)\n    idx = 3\n    assert rc.validate_code(codes[idx])\n    for i in range(app_settings.RECOVERY_CODE_COUNT):\n        assert rc._is_code_used(i) == (i == idx)\n    assert not rc.validate_code(codes[idx])\n\n    unused_codes = rc.get_unused_codes()\n    assert codes[idx] not in unused_codes\n    assert len(unused_codes) == app_settings.RECOVERY_CODE_COUNT - 1\n\n\ndef test_migrated_codes(db, user):\n    auth = Authenticator(user=user, data={\"migrated_codes\": [\"abc\", \"def\"]})\n    rc = RecoveryCodes(auth)\n    assert rc.generate_codes() == [\"abc\", \"def\"]\n    assert rc.get_unused_codes() == [\"abc\", \"def\"]\n    assert not rc.validate_code(\"bad\")\n    assert rc.validate_code(\"abc\")\n    auth.refresh_from_db()\n    rc = RecoveryCodes(auth)\n    assert rc.generate_codes() == [\"def\"]\n    assert rc.get_unused_codes() == [\"def\"]\n    rc.validate_code(\"def\")\n    assert rc.instance.data[\"migrated_codes\"] == []\n"
  },
  {
    "path": "tests/apps/mfa/recovery_codes/test_views.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY\n\nfrom django.conf import settings\nfrom django.urls import reverse\n\nfrom allauth.account.authentication import AUTHENTICATION_METHODS_SESSION_KEY\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.adapter import get_adapter\nfrom allauth.mfa.models import Authenticator\n\n\ndef test_generate_recovery_codes_require_other_authenticator(\n    auth_client, user, settings, reauthentication_bypass\n):\n    with reauthentication_bypass():\n        resp = auth_client.post(reverse(\"mfa_generate_recovery_codes\"))\n    assert resp.context[\"form\"].errors == {\n        \"__all__\": [\n            \"You cannot generate recovery codes without having two-factor authentication enabled.\"\n        ]\n    }\n    assert not Authenticator.objects.filter(user=user).exists()\n\n\ndef test_download_recovery_codes(auth_client, user_with_recovery_codes, user_password):\n    resp = auth_client.get(reverse(\"mfa_download_recovery_codes\"))\n    assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n    resp = auth_client.post(resp[\"location\"], {\"password\": user_password})\n    assert resp.status_code == HTTPStatus.FOUND\n    resp = auth_client.get(resp[\"location\"])\n    assert resp[\"content-disposition\"] == 'attachment; filename=\"recovery-codes.txt\"'\n\n\ndef test_view_recovery_codes(auth_client, user_with_recovery_codes, user_password):\n    resp = auth_client.get(reverse(\"mfa_view_recovery_codes\"))\n    assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n    resp = auth_client.post(resp[\"location\"], {\"password\": user_password})\n    assert resp.status_code == HTTPStatus.FOUND\n    resp = auth_client.get(resp[\"location\"])\n    assert len(resp.context[\"unused_codes\"]) == app_settings.RECOVERY_CODE_COUNT\n\n\ndef test_generate_recovery_codes(\n    auth_client, user_with_recovery_codes, user_password, settings, mailoutbox\n):\n    settings.ACCOUNT_EMAIL_NOTIFICATIONS = True\n    rc = Authenticator.objects.get(\n        user=user_with_recovery_codes, type=Authenticator.Type.RECOVERY_CODES\n    ).wrap()\n    prev_code = rc.get_unused_codes()[0]\n\n    resp = auth_client.get(reverse(\"mfa_generate_recovery_codes\"))\n    assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n    resp = auth_client.post(resp[\"location\"], {\"password\": user_password})\n    assert resp.status_code == HTTPStatus.FOUND\n    resp = auth_client.post(resp[\"location\"])\n    assert resp[\"location\"] == reverse(\"mfa_view_recovery_codes\")\n\n    rc = Authenticator.objects.get(\n        user=user_with_recovery_codes, type=Authenticator.Type.RECOVERY_CODES\n    ).wrap()\n    assert not rc.validate_code(prev_code)\n    assert len(mailoutbox) == 1\n    assert \"New Recovery Codes Generated\" in mailoutbox[0].subject\n    assert \"A new set of\" in mailoutbox[0].body\n\n\ndef test_recovery_codes_login(\n    client, user_with_totp, user_with_recovery_codes, user_password\n):\n    resp = client.post(\n        reverse(\"account_login\"),\n        {\"login\": user_with_totp.username, \"password\": user_password},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"mfa_authenticate\")\n    resp = client.get(reverse(\"mfa_authenticate\"))\n    assert resp.context[\"request\"].user.is_anonymous\n    resp = client.post(reverse(\"mfa_authenticate\"), {\"code\": \"123\"})\n    assert resp.context[\"form\"].errors == {\n        \"code\": [get_adapter().error_messages[\"incorrect_code\"]]\n    }\n    rc = Authenticator.objects.get(\n        user=user_with_recovery_codes, type=Authenticator.Type.RECOVERY_CODES\n    )\n    resp = client.post(\n        reverse(\"mfa_authenticate\"),\n        {\"code\": rc.wrap().get_unused_codes()[0]},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n    assert client.session[AUTHENTICATION_METHODS_SESSION_KEY] == [\n        {\"method\": \"password\", \"at\": ANY, \"username\": user_with_totp.username},\n        {\n            \"method\": \"mfa\",\n            \"at\": ANY,\n            \"id\": ANY,\n            \"type\": Authenticator.Type.RECOVERY_CODES,\n        },\n    ]\n"
  },
  {
    "path": "tests/apps/mfa/totp/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/mfa/totp/test_unit.py",
    "content": "from unittest import mock\n\nfrom allauth.mfa import app_settings\nfrom allauth.mfa.totp.internal.auth import (\n    format_hotp_value,\n    generate_totp_secret,\n    hotp_value,\n    validate_totp_code,\n    yield_hotp_counters_from_time,\n)\n\n\n@mock.patch(\"time.time\", mock.MagicMock(return_value=1731948631))\ndef test_totp_counters_from_time():\n    app_settings.TOTP_TOLERANCE = 0\n    counters = list(yield_hotp_counters_from_time())\n    assert len(counters) == 1\n\n\n@mock.patch(\"time.time\", mock.MagicMock(return_value=1731948631))\ndef test_totp_counters_from_time_with_tolerance():\n    app_settings.TOTP_TOLERANCE = 1\n    counters = list(yield_hotp_counters_from_time())\n    assert len(counters) == 3\n\n\n@mock.patch(\"time.time\", mock.MagicMock(return_value=1731948631))\ndef test_validate_with_tolerance():\n    app_settings.TOTP_TOLERANCE = 1\n    test_secret = generate_totp_secret()\n    expected_value = format_hotp_value(hotp_value(test_secret, 57731621))\n    assert validate_totp_code(test_secret, expected_value)\n\n    before_value = format_hotp_value(hotp_value(test_secret, 57731620))\n    assert validate_totp_code(test_secret, before_value)\n\n    after_value = format_hotp_value(hotp_value(test_secret, 57731622))\n    assert validate_totp_code(test_secret, after_value)\n\n    two_before_value = format_hotp_value(hotp_value(test_secret, 57731619))\n    assert not validate_totp_code(test_secret, two_before_value)\n\n    two_after_value = format_hotp_value(hotp_value(test_secret, 57731623))\n    assert not validate_totp_code(test_secret, two_after_value)\n"
  },
  {
    "path": "tests/apps/mfa/totp/test_views.py",
    "content": "import time\nfrom http import HTTPStatus\nfrom unittest.mock import ANY, patch\n\nfrom django.conf import settings\nfrom django.core.cache import cache\nfrom django.test import Client\nfrom django.urls import reverse\n\nimport pytest\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.account import app_settings\nfrom allauth.account.authentication import AUTHENTICATION_METHODS_SESSION_KEY\nfrom allauth.mfa.adapter import get_adapter\nfrom allauth.mfa.models import Authenticator\n\n\ndef test_activate_totp_with_incorrect_code(auth_client, reauthentication_bypass):\n    with reauthentication_bypass():\n        resp = auth_client.get(reverse(\"mfa_activate_totp\"))\n        resp = auth_client.post(\n            reverse(\"mfa_activate_totp\"),\n            {\n                \"code\": \"123\",\n            },\n        )\n    assert resp.context[\"form\"].errors == {\n        \"code\": [get_adapter().error_messages[\"incorrect_code\"]]\n    }\n\n\n@pytest.mark.parametrize(\"email_verified\", [False])\n@pytest.mark.parametrize(\"method\", [\"get\", \"post\"])\ndef test_activate_totp_with_unverified_email(\n    auth_client, user, totp_validation_bypass, reauthentication_bypass, method\n):\n    with reauthentication_bypass():\n        if method == \"get\":\n            resp = auth_client.get(reverse(\"mfa_activate_totp\"))\n        else:\n            resp = auth_client.post(reverse(\"mfa_activate_totp\"), {\"code\": \"123\"})\n    assert resp[\"location\"] == reverse(\"mfa_index\")\n\n\ndef test_activate_totp_success(\n    auth_client,\n    totp_validation_bypass,\n    user,\n    reauthentication_bypass,\n    settings,\n    mailoutbox,\n):\n    settings.ACCOUNT_EMAIL_NOTIFICATIONS = True\n    with reauthentication_bypass():\n        resp = auth_client.get(reverse(\"mfa_activate_totp\"))\n        with totp_validation_bypass():\n            resp = auth_client.post(\n                reverse(\"mfa_activate_totp\"),\n                {\n                    \"code\": \"123\",\n                },\n            )\n    assert resp[\"location\"] == reverse(\"mfa_view_recovery_codes\")\n    assert Authenticator.objects.filter(\n        user=user, type=Authenticator.Type.TOTP\n    ).exists()\n    assert Authenticator.objects.filter(\n        user=user, type=Authenticator.Type.RECOVERY_CODES\n    ).exists()\n    assert len(mailoutbox) == 1\n    assert \"Authenticator App Activated\" in mailoutbox[0].subject\n    assert \"Authenticator app activated.\" in mailoutbox[0].body\n\n\ndef test_deactivate_totp_success(\n    auth_client, user_with_totp, user_password, settings, mailoutbox\n):\n    settings.ACCOUNT_EMAIL_NOTIFICATIONS = True\n    resp = auth_client.get(reverse(\"mfa_deactivate_totp\"))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n    resp = auth_client.post(resp[\"location\"], {\"password\": user_password})\n    assert resp.status_code == HTTPStatus.FOUND\n    resp = auth_client.post(reverse(\"mfa_deactivate_totp\"))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"mfa_index\")\n    assert len(mailoutbox) == 1\n    assert \"Authenticator App Deactivated\" in mailoutbox[0].subject\n    assert \"Authenticator app deactivated.\" in mailoutbox[0].body\n\n\ndef test_user_without_totp_deactivate_totp(auth_client):\n    resp = auth_client.get(reverse(\"mfa_deactivate_totp\"))\n    assert resp.status_code == HTTPStatus.NOT_FOUND\n\n\ndef test_user_with_totp_activate_totp(\n    auth_client, user_with_totp, reauthentication_bypass\n):\n    with reauthentication_bypass():\n        resp = auth_client.get(reverse(\"mfa_activate_totp\"))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"mfa_deactivate_totp\")\n\n\ndef test_totp_login(client, user_with_totp, user_password, totp_validation_bypass):\n    resp = client.post(\n        reverse(\"account_login\"),\n        {\"login\": user_with_totp.username, \"password\": user_password},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"mfa_authenticate\")\n    resp = client.get(reverse(\"mfa_authenticate\"))\n    assert resp.context[\"request\"].user.is_anonymous\n    resp = client.post(reverse(\"mfa_authenticate\"), {\"code\": \"123\"})\n    assert resp.context[\"form\"].errors == {\n        \"code\": [get_adapter().error_messages[\"incorrect_code\"]]\n    }\n    with totp_validation_bypass():\n        resp = client.post(\n            reverse(\"mfa_authenticate\"),\n            {\"code\": \"123\"},\n        )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n    assert client.session[AUTHENTICATION_METHODS_SESSION_KEY] == [\n        {\"method\": \"password\", \"at\": ANY, \"username\": user_with_totp.username},\n        {\"method\": \"mfa\", \"at\": ANY, \"id\": ANY, \"type\": Authenticator.Type.TOTP},\n    ]\n\n\ndef test_totp_login_rate_limit(\n    settings, enable_cache, user_with_totp, user_password, client\n):\n    settings.ACCOUNT_LOGIN_ATTEMPTS_LIMIT = 3\n    resp = client.post(\n        reverse(\"account_login\"),\n        {\"login\": user_with_totp.username, \"password\": user_password},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"mfa_authenticate\")\n    for i in range(5):\n        is_locked = i >= 3\n        resp = client.post(\n            reverse(\"mfa_authenticate\"),\n            {\n                \"code\": \"wrong\",\n            },\n        )\n        assert resp.context[\"form\"].errors == {\n            \"code\": [\n                (\n                    \"Too many failed login attempts. Try again later.\"\n                    if is_locked\n                    else \"Incorrect code.\"\n                )\n            ]\n        }\n\n\ndef test_cannot_deactivate_totp(auth_client, user_with_totp, user_password):\n    with patch(\n        \"allauth.mfa.adapter.DefaultMFAAdapter.can_delete_authenticator\"\n    ) as cda_mock:\n        cda_mock.return_value = False\n        resp = auth_client.get(reverse(\"mfa_deactivate_totp\"))\n        assert resp.status_code == HTTPStatus.FOUND\n        assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n        resp = auth_client.post(resp[\"location\"], {\"password\": user_password})\n        assert resp.status_code == HTTPStatus.FOUND\n        resp = auth_client.get(reverse(\"mfa_deactivate_totp\"))\n        # When we GET, the form validation error is already on screen\n        assert resp.context[\"form\"].errors == {\n            \"__all__\": [get_adapter().error_messages[\"cannot_delete_authenticator\"]],\n        }\n        # And, when we POST anyway, it does not work\n        resp = auth_client.post(reverse(\"mfa_deactivate_totp\"))\n        assert resp.status_code == HTTPStatus.OK\n        assert resp.context[\"form\"].errors == {\n            \"__all__\": [get_adapter().error_messages[\"cannot_delete_authenticator\"]],\n        }\n\n\ndef test_totp_code_reuse(\n    user_with_totp, user_password, totp_validation_bypass, enable_cache\n):\n    for code, time_lapse, expect_success in [\n        # First use of code, SUCCESS\n        (\"123\", False, True),\n        # Second use, no time elapsed: FAIL\n        (\"123\", False, False),\n        # Different code, no time elapsed: SUCCESS\n        (\"456\", False, True),\n        # Again, previous code, no time elapsed: FAIL\n        (\"123\", False, False),\n        # Previous code, but time elapsed: SUCCESS\n        (\"123\", True, True),\n    ]:\n        if time_lapse:\n            cache.clear()\n        client = Client()\n        resp = client.post(\n            reverse(\"account_login\"),\n            {\"login\": user_with_totp.username, \"password\": user_password},\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n        assert resp[\"location\"] == reverse(\"mfa_authenticate\")\n        # Note that this bypass only bypasses the actual code check, not the\n        # re-use check we're testing here.\n        with totp_validation_bypass():\n            resp = client.post(\n                reverse(\"mfa_authenticate\"),\n                {\"code\": code},\n            )\n        if expect_success:\n            assert resp.status_code == HTTPStatus.FOUND\n            assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n        else:\n            assert resp.status_code == HTTPStatus.OK\n            assert resp.context[\"form\"].errors == {\n                \"code\": [get_adapter().error_messages[\"incorrect_code\"]]\n            }\n\n\ndef test_totp_stage_expires(client, user_with_totp, user_password):\n    resp = client.post(\n        reverse(\"account_login\"),\n        {\"login\": user_with_totp.username, \"password\": user_password},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"mfa_authenticate\")\n    resp = client.get(reverse(\"mfa_authenticate\"))\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"mfa/authenticate.html\")\n    with patch(\n        \"allauth.account.internal.stagekit.time.time\",\n        return_value=time.time() + 1.1 * app_settings.LOGIN_TIMEOUT,\n    ):\n        resp = client.get(reverse(\"mfa_authenticate\"))\n        assert resp.status_code == HTTPStatus.FOUND\n        assert resp[\"location\"] == reverse(\"account_login\")\n"
  },
  {
    "path": "tests/apps/mfa/webauthn/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/mfa/webauthn/test_views.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY\n\nfrom django.conf import settings\nfrom django.contrib.auth import get_user_model\nfrom django.urls import reverse\n\nimport pytest\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.account.authentication import AUTHENTICATION_METHODS_SESSION_KEY\nfrom allauth.mfa.models import Authenticator\n\n\ndef test_passkey_login(client, passkey, webauthn_authentication_bypass):\n    with webauthn_authentication_bypass(passkey) as credential:\n        resp = client.get(\n            reverse(\"mfa_login_webauthn\"), HTTP_X_REQUESTED_WITH=\"XMLHttpRequest\"\n        )\n        assert \"request_options\" in resp.json()\n        resp = client.post(\n            reverse(\"mfa_login_webauthn\"), data={\"credential\": credential}\n        )\n    assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n    assert client.session[AUTHENTICATION_METHODS_SESSION_KEY] == [\n        {\n            \"at\": ANY,\n            \"id\": ANY,\n            \"method\": \"mfa\",\n            \"passwordless\": True,\n            \"type\": \"webauthn\",\n        }\n    ]\n\n\ndef test_reauthenticate(\n    auth_client, passkey, user_with_recovery_codes, webauthn_authentication_bypass\n):\n    resp = auth_client.get(reverse(\"mfa_view_recovery_codes\"))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n    resp = auth_client.get(reverse(\"mfa_reauthenticate\"))\n    assertTemplateUsed(resp, \"mfa/reauthenticate.html\")\n\n    with webauthn_authentication_bypass(passkey) as credential:\n        resp = auth_client.get(\n            reverse(\"mfa_reauthenticate_webauthn\"),\n        )\n        resp = auth_client.post(\n            reverse(\"mfa_reauthenticate_webauthn\"),\n            data={\"credential\": credential, \"next\": \"/redir\"},\n        )\n    assert resp[\"location\"] == \"/redir\"\n\n\ndef test_get_passkey_login_challenge_redirects_if_not_ajax(client):\n    resp = client.get(reverse(\"mfa_login_webauthn\"))\n    assert resp[\"location\"] == reverse(\"account_login\")\n\n\ndef test_get_passkey_login_challenge(client, db):\n    resp = client.get(\n        reverse(\"mfa_login_webauthn\"), HTTP_X_REQUESTED_WITH=\"XMLHttpRequest\"\n    )\n    assert resp.status_code == HTTPStatus.OK\n    assert resp[\"content-type\"] == \"application/json\"\n    data = resp.json()\n    assert data == {\n        \"request_options\": {\n            \"publicKey\": {\n                \"challenge\": ANY,\n                \"rpId\": \"testserver\",\n                \"allowCredentials\": [],\n                \"userVerification\": \"preferred\",\n            }\n        }\n    }\n\n\ndef test_invalid_passkey_login(client, passkey):\n    resp = client.post(reverse(\"mfa_login_webauthn\"), data={\"credential\": \"{}\"})\n    assert resp[\"location\"] == reverse(\"account_login\")\n\n\ndef test_rename_key(auth_client, passkey, reauthentication_bypass):\n    resp = auth_client.get(reverse(\"mfa_edit_webauthn\", kwargs={\"pk\": passkey.pk}))\n    assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n    with reauthentication_bypass():\n        resp = auth_client.get(reverse(\"mfa_edit_webauthn\", kwargs={\"pk\": passkey.pk}))\n        assertTemplateUsed(resp, \"mfa/webauthn/edit_form.html\")\n        resp = auth_client.post(\n            reverse(\"mfa_edit_webauthn\", kwargs={\"pk\": passkey.pk}),\n            data={\"name\": \"Renamed\"},\n        )\n        assert resp[\"location\"] == reverse(\"mfa_list_webauthn\")\n        passkey.refresh_from_db()\n        assert passkey.data[\"name\"] == \"Renamed\"\n        assert str(passkey) == \"Renamed\"\n\n\ndef test_remove_key(auth_client, passkey, reauthentication_bypass):\n    resp = auth_client.get(reverse(\"mfa_remove_webauthn\", kwargs={\"pk\": passkey.pk}))\n    assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n    with reauthentication_bypass():\n        resp = auth_client.get(\n            reverse(\"mfa_remove_webauthn\", kwargs={\"pk\": passkey.pk})\n        )\n        assertTemplateUsed(resp, \"mfa/webauthn/authenticator_confirm_delete.html\")\n        resp = auth_client.post(\n            reverse(\"mfa_remove_webauthn\", kwargs={\"pk\": passkey.pk})\n        )\n        assert resp[\"location\"] == reverse(\"mfa_list_webauthn\")\n\n\n@pytest.mark.parametrize(\"passwordless\", [False, True])\ndef test_add_key(\n    auth_client,\n    user,\n    webauthn_registration_bypass,\n    reauthentication_bypass,\n    passwordless,\n):\n    with webauthn_registration_bypass(user, passwordless) as credential:\n        resp = auth_client.post(\n            reverse(\"mfa_add_webauthn\"), data={\"credential\": credential}\n        )\n        assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n    with reauthentication_bypass():\n        resp = auth_client.get(reverse(\"mfa_add_webauthn\"))\n        assertTemplateUsed(resp, \"mfa/webauthn/add_form.html\")\n        with webauthn_registration_bypass(user, passwordless) as credential:\n            resp = auth_client.post(\n                reverse(\"mfa_add_webauthn\"),\n                data={\n                    \"credential\": credential,\n                    \"passwordless\": \"on\" if passwordless else \"\",\n                },\n            )\n            assert resp[\"location\"].startswith(reverse(\"mfa_view_recovery_codes\"))\n        authenticator = Authenticator.objects.get(\n            user=user, type=Authenticator.Type.WEBAUTHN\n        )\n        assert authenticator.wrap().is_passwordless == passwordless\n        Authenticator.objects.filter(\n            user=user, type=Authenticator.Type.RECOVERY_CODES\n        ).exists()\n\n\ndef test_list_keys(auth_client):\n    resp = auth_client.get(reverse(\"mfa_list_webauthn\"))\n    assertTemplateUsed(resp, \"mfa/webauthn/authenticator_list.html\")\n\n\n@pytest.mark.parametrize(\"email_verified\", [False])\n@pytest.mark.parametrize(\"method\", [\"get\", \"post\"])\n@pytest.mark.parametrize(\"allowed\", [True, False])\ndef test_add_with_unverified_email(\n    auth_client,\n    user,\n    webauthn_registration_bypass,\n    reauthentication_bypass,\n    method,\n    allowed,\n    settings,\n):\n    settings.MFA_ALLOW_UNVERIFIED_EMAIL = allowed\n    with webauthn_registration_bypass(user, False) as credential:\n        if method == \"get\":\n            resp = auth_client.get(reverse(\"mfa_add_webauthn\"))\n        else:\n            resp = auth_client.post(\n                reverse(\"mfa_add_webauthn\"), data={\"credential\": credential}\n            )\n        if allowed:\n            assert resp[\"location\"].startswith(reverse(\"account_reauthenticate\"))\n        else:\n            assert resp[\"location\"] == reverse(\"mfa_index\")\n\n\ndef test_passkey_signup(client, db, webauthn_registration_bypass):\n    resp = client.post(\n        reverse(\"account_signup_by_passkey\"),\n        data={\"email\": \"pass@key.org\", \"username\": \"passkey\"},\n    )\n    assert resp[\"location\"] == reverse(\"mfa_signup_webauthn\")\n    resp = client.post(resp[\"location\"])\n    assert resp.status_code == HTTPStatus.OK\n    user = get_user_model().objects.get(email=\"pass@key.org\")\n    with webauthn_registration_bypass(user, True) as credential:\n        resp = client.post(\n            reverse(\"mfa_signup_webauthn\"), data={\"credential\": credential}\n        )\n    assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n\n\ndef test_webauthn_login(\n    client, user_with_passkey, passkey, user_password, webauthn_authentication_bypass\n):\n    resp = client.post(\n        reverse(\"account_login\"),\n        {\"login\": user_with_passkey.username, \"password\": user_password},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"mfa_authenticate\")\n    with webauthn_authentication_bypass(passkey) as credential:\n        resp = client.get(reverse(\"mfa_authenticate\"))\n        assert resp.status_code == HTTPStatus.OK\n        resp = client.post(reverse(\"mfa_authenticate\"), {\"credential\": credential})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n    assert client.session[AUTHENTICATION_METHODS_SESSION_KEY] == [\n        {\"method\": \"password\", \"at\": ANY, \"username\": user_with_passkey.username},\n        {\"method\": \"mfa\", \"at\": ANY, \"id\": ANY, \"type\": Authenticator.Type.WEBAUTHN},\n    ]\n"
  },
  {
    "path": "tests/apps/socialaccount/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/base.py",
    "content": "import base64\nimport hashlib\nimport json\nimport random\nimport requests\nimport uuid\nimport warnings\nfrom http import HTTPStatus\nfrom urllib.parse import parse_qs, urlparse\n\nfrom django.conf import settings\nfrom django.contrib.auth import get_user_model\nfrom django.test import RequestFactory, TestCase\nfrom django.test.utils import override_settings\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nimport jwt\n\nimport allauth.app_settings\nfrom allauth.account.models import EmailAddress\nfrom allauth.account.utils import user_email, user_username\nfrom allauth.socialaccount import app_settings\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.models import SocialAccount, SocialApp\nfrom tests.mocking import MockedResponse, mocked_response\n\n\ndef setup_app(provider_id):\n    request = RequestFactory().get(\"/\")\n    apps = get_adapter().list_apps(request, provider_id)\n    if apps:\n        return apps[0]\n\n    app = SocialApp.objects.create(\n        provider=provider_id,\n        name=provider_id,\n        client_id=\"app123id\",\n        key=provider_id,\n        secret=\"dummy\",\n    )\n    if allauth.app_settings.SITES_ENABLED:\n        from django.contrib.sites.models import Site\n\n        app.sites.add(Site.objects.get_current())\n    return app\n\n\nclass OAuthTestsMixin:\n    provider_id: str\n\n    def get_mocked_response(self):\n        pass\n\n    def get_expected_to_str(self):\n        raise NotImplementedError\n\n    def setUp(self):\n        super().setUp()\n        self.app = setup_app(self.provider_id)\n        request = RequestFactory().get(\"/\")\n        self.provider = self.app.get_provider(request)\n\n    @override_settings(SOCIALACCOUNT_AUTO_SIGNUP=False)\n    def test_login(self):\n        resp_mocks = self.get_mocked_response()\n        if resp_mocks is None:\n            warnings.warn(f\"Cannot test provider {self.provider.id}, no oauth mock\")\n            return\n        resp = self.login(resp_mocks)\n        self.assertRedirects(resp, reverse(\"socialaccount_signup\"))\n        resp = self.client.get(reverse(\"socialaccount_signup\"))\n        sociallogin = resp.context[\"form\"].sociallogin\n        data = dict(\n            email=user_email(sociallogin.user),\n            username=str(random.randrange(1000, 10000000)),\n        )\n        resp = self.client.post(reverse(\"socialaccount_signup\"), data=data)\n        self.assertRedirects(resp, \"/accounts/profile/\", fetch_redirect_response=False)\n        user = resp.context[\"user\"]\n        self.assertFalse(user.has_usable_password())\n        account = SocialAccount.objects.get(user=user, provider=self.provider.id)\n        provider_account = account.get_provider_account()\n        self.assertEqual(provider_account.to_str(), self.get_expected_to_str())\n        # The following lines don't actually test that much, but at least\n        # we make sure that the code is hit.\n        provider_account.get_avatar_url()\n        provider_account.get_profile_url()\n        provider_account.get_brand()\n\n    @override_settings(\n        SOCIALACCOUNT_AUTO_SIGNUP=True,\n        SOCIALACCOUNT_EMAIL_REQUIRED=False,\n        ACCOUNT_EMAIL_REQUIRED=False,\n    )\n    def test_auto_signup(self):\n        resp_mocks = self.get_mocked_response()\n        if not resp_mocks:\n            warnings.warn(f\"Cannot test provider {self.provider.id}, no oauth mock\")\n            return\n        resp = self.login(resp_mocks)\n        self.assertRedirects(resp, \"/accounts/profile/\", fetch_redirect_response=False)\n        self.assertFalse(resp.context[\"user\"].has_usable_password())\n\n    def login(self, resp_mocks, process=\"login\"):\n        with mocked_response(\n            MockedResponse(\n                HTTPStatus.OK,\n                \"oauth_token=token&oauth_token_secret=psst\",\n                {\"content-type\": \"text/html\"},\n            )\n        ):\n            resp = self.client.post(\n                reverse(f\"{self.provider.id}_login\")\n                + \"?\"\n                + urlencode(dict(process=process))\n            )\n        p = urlparse(resp[\"location\"])\n        q = parse_qs(p.query)\n        complete_url = reverse(f\"{self.provider.id}_callback\")\n        self.assertGreater(q[\"oauth_callback\"][0].find(complete_url), 0)\n        with mocked_response(self.get_access_token_response(), *resp_mocks):\n            resp = self.client.get(complete_url)\n        return resp\n\n    def get_access_token_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"oauth_token=token&oauth_token_secret=psst\",\n            {\"content-type\": \"text/html\"},\n        )\n\n    def test_authentication_error(self):\n        resp = self.client.get(reverse(f\"{self.provider.id}_callback\"))\n        assert resp.status_code == HTTPStatus.UNAUTHORIZED\n        template_ext = getattr(settings, \"ACCOUNT_TEMPLATE_EXTENSION\", \"html\")\n        self.assertTemplateUsed(\n            resp, f\"socialaccount/authentication_error.{template_ext}\"\n        )\n\n\n# For backward-compatibility with third-party provider tests that call\n# create_oauth_tests() rather than using the mixin directly.\ndef create_oauth_tests(provider):\n    class Class(OAuthTestsMixin, TestCase):\n        provider_id = provider.id\n\n    Class.__name__ = f\"OAuthTests_{provider.id}\"\n    return Class\n\n\nclass OAuth2TestsMixin:\n    provider_id: str\n\n    def get_mocked_response(self):\n        pass\n\n    def get_expected_to_str(self):\n        raise NotImplementedError\n\n    def get_access_token(self) -> str:\n        return \"testac\"\n\n    def get_refresh_token(self) -> str:\n        return \"testrf\"\n\n    def get_login_response_json(self, with_refresh_token=True):\n        response = {\n            \"uid\": uuid.uuid4().hex,\n            \"access_token\": self.get_access_token(),\n        }\n        if with_refresh_token:\n            response[\"refresh_token\"] = self.get_refresh_token()\n        return json.dumps(response)\n\n    def mocked_response(self, *responses):\n        return mocked_response(*responses)\n\n    def setUp(self):\n        super().setUp()\n        self.setup_provider()\n\n    def setup_provider(self):\n        self.app = setup_app(self.provider_id)\n        self.request = RequestFactory().get(\"/\")\n        self.provider = self.app.get_provider(self.request)\n\n    def test_provider_has_no_pkce_params(self):\n        provider_settings = app_settings.PROVIDERS.get(self.app.provider, {})\n        provider_settings_with_pkce_set = provider_settings.copy()\n        provider_settings_with_pkce_set[\"OAUTH_PKCE_ENABLED\"] = False\n\n        with self.settings(\n            SOCIALACCOUNT_PROVIDERS={self.app.provider: provider_settings_with_pkce_set}\n        ):\n            self.assertEqual(self.provider.get_pkce_params(), {})\n\n    def test_provider_has_pkce_params(self):\n        provider_settings = app_settings.PROVIDERS.get(self.app.provider, {})\n        provider_settings_with_pkce_set = provider_settings.copy()\n        provider_settings_with_pkce_set[\"OAUTH_PKCE_ENABLED\"] = True\n\n        with self.settings(\n            SOCIALACCOUNT_PROVIDERS={self.app.provider: provider_settings_with_pkce_set}\n        ):\n            pkce_params = self.provider.get_pkce_params()\n            self.assertEqual(\n                set(pkce_params.keys()),\n                {\"code_challenge\", \"code_challenge_method\", \"code_verifier\"},\n            )\n            hashed_verifier = hashlib.sha256(\n                pkce_params[\"code_verifier\"].encode(\"ascii\")\n            )\n            code_challenge = base64.urlsafe_b64encode(hashed_verifier.digest())\n            code_challenge_without_padding = code_challenge.rstrip(b\"=\")\n            assert pkce_params[\"code_challenge\"] == code_challenge_without_padding\n\n    @override_settings(SOCIALACCOUNT_AUTO_SIGNUP=False)\n    def test_login(self):\n        resp_mock = self.get_mocked_response()\n        if not resp_mock:\n            warnings.warn(f\"Cannot test provider {self.provider.id}, no oauth mock\")\n            return\n        resp = self.login(\n            resp_mock,\n        )\n        self.assertRedirects(resp, reverse(\"socialaccount_signup\"))\n\n    @override_settings(SOCIALACCOUNT_AUTO_SIGNUP=False)\n    def test_login_with_pkce_disabled(self):\n        provider_settings = app_settings.PROVIDERS.get(self.app.provider, {})\n        provider_settings_with_pkce_disabled = provider_settings.copy()\n        provider_settings_with_pkce_disabled[\"OAUTH_PKCE_ENABLED\"] = False\n\n        with self.settings(\n            SOCIALACCOUNT_PROVIDERS={\n                self.app.provider: provider_settings_with_pkce_disabled\n            }\n        ):\n            resp_mock = self.get_mocked_response()\n            if not resp_mock:\n                warnings.warn(f\"Cannot test provider {self.provider.id}, no oauth mock\")\n                return\n            resp = self.login(\n                resp_mock,\n            )\n            self.assertRedirects(resp, reverse(\"socialaccount_signup\"))\n\n    @override_settings(SOCIALACCOUNT_AUTO_SIGNUP=False)\n    def test_login_with_pkce_enabled(self):\n        provider_settings = app_settings.PROVIDERS.get(self.app.provider, {})\n        provider_settings_with_pkce_enabled = provider_settings.copy()\n        provider_settings_with_pkce_enabled[\"OAUTH_PKCE_ENABLED\"] = True\n        with self.settings(\n            SOCIALACCOUNT_PROVIDERS={\n                self.app.provider: provider_settings_with_pkce_enabled\n            }\n        ):\n            resp_mock = self.get_mocked_response()\n            if not resp_mock:\n                warnings.warn(f\"Cannot test provider {self.provider.id}, no oauth mock\")\n                return\n\n            resp = self.login(\n                resp_mock,\n            )\n            self.assertRedirects(resp, reverse(\"socialaccount_signup\"))\n\n    @override_settings(SOCIALACCOUNT_STORE_TOKENS=True)\n    def test_account_tokens(self, multiple_login=False):\n        email = \"user@example.com\"\n        user = get_user_model()(is_active=True)\n        user_email(user, email)\n        user_username(user, \"user\")\n        user.set_password(\"test\")\n        user.save()\n        EmailAddress.objects.create(user=user, email=email, primary=True, verified=True)\n        self.client.login(username=user.username, password=\"test\")\n        self.login(self.get_mocked_response(), process=\"connect\")\n        if multiple_login:\n            self.login(\n                self.get_mocked_response(),\n                with_refresh_token=False,\n                process=\"connect\",\n            )\n        # get account\n        sa = SocialAccount.objects.filter(\n            user=user, provider=self.provider.app.provider_id or self.provider.id\n        ).get()\n        provider_account = sa.get_provider_account()\n        self.assertEqual(provider_account.to_str(), self.get_expected_to_str())\n        # The following lines don't actually test that much, but at least\n        # we make sure that the code is hit.\n        provider_account.get_avatar_url()\n        provider_account.get_profile_url()\n        provider_account.get_brand()\n        # get token\n        if self.app:\n            t = sa.socialtoken_set.get()\n            # verify access_token and refresh_token\n            self.assertEqual(self.get_access_token(), t.token)\n            resp = json.loads(self.get_login_response_json(with_refresh_token=True))\n            if \"refresh_token\" in resp:\n                refresh_token = resp.get(\"refresh_token\")\n            elif \"refreshToken\" in resp:\n                refresh_token = resp.get(\"refreshToken\")\n            else:\n                refresh_token = \"\"\n            self.assertEqual(t.token_secret, refresh_token)\n\n    @override_settings(SOCIALACCOUNT_STORE_TOKENS=True)\n    def test_account_refresh_token_saved_next_login(self):\n        \"\"\"\n        fails if a login missing a refresh token, deletes the previously\n        saved refresh token. Systems such as google's oauth only send\n        a refresh token on first login.\n        \"\"\"\n        self.test_account_tokens(multiple_login=True)\n\n    def login(self, resp_mock=None, process=\"login\", with_refresh_token=True):\n        with self.mocked_response():\n            resp = self.client.post(\n                self.provider.get_login_url(self.request, process=process)\n            )\n        p = urlparse(resp[\"location\"])\n        q = parse_qs(p.query)\n\n        pkce_enabled = app_settings.PROVIDERS.get(self.app.provider, {}).get(\n            \"OAUTH_PKCE_ENABLED\", self.provider.pkce_enabled_default\n        )\n\n        self.assertEqual(\"code_challenge\" in q, pkce_enabled)\n        self.assertEqual(\"code_challenge_method\" in q, pkce_enabled)\n        if pkce_enabled:\n            code_challenge = q[\"code_challenge\"][0]\n            self.assertEqual(q[\"code_challenge_method\"][0], \"S256\")\n\n        complete_url = self.provider.get_callback_url()\n        self.assertGreater(q[\"redirect_uri\"][0].find(complete_url), 0)\n        response_json = self.get_login_response_json(\n            with_refresh_token=with_refresh_token\n        )\n\n        if isinstance(resp_mock, list):\n            resp_mocks = resp_mock\n        elif resp_mock is None:\n            resp_mocks = []\n        else:\n            resp_mocks = [resp_mock]\n\n        with self.mocked_response(\n            MockedResponse(\n                HTTPStatus.OK, response_json, {\"content-type\": \"application/json\"}\n            ),\n            *resp_mocks,\n        ):\n            resp = self.client.get(complete_url, self.get_complete_parameters(q))\n\n            # Find the access token POST request, and assert that it contains\n            # the correct code_verifier if and only if PKCE is enabled\n            request_calls = requests.Session.request.call_args_list\n            for args, kwargs in request_calls:\n                data = kwargs.get(\"data\", {})\n                if (\n                    args[0] == \"POST\"\n                    and isinstance(data, dict)\n                    and data.get(\"redirect_uri\", \"\").endswith(complete_url)\n                ):\n                    self.assertEqual(\"code_verifier\" in data, pkce_enabled)\n\n                    if pkce_enabled:\n                        hashed_code_verifier = hashlib.sha256(\n                            data[\"code_verifier\"].encode(\"ascii\")\n                        )\n                        expected_code_challenge = (\n                            base64.urlsafe_b64encode(hashed_code_verifier.digest())\n                            .rstrip(b\"=\")\n                            .decode()\n                        )\n                        self.assertEqual(code_challenge, expected_code_challenge)\n\n        return resp\n\n    def get_complete_parameters(self, q):\n        return {\"code\": \"test\", \"state\": q[\"state\"][0]}\n\n    def test_authentication_error(self):\n        resp = self.client.get(self.provider.get_callback_url())\n        template_ext = getattr(settings, \"ACCOUNT_TEMPLATE_EXTENSION\", \"html\")\n        self.assertTemplateUsed(\n            resp, f\"socialaccount/authentication_error.{template_ext}\"\n        )\n\n\nclass OpenIDConnectTests(OAuth2TestsMixin):\n    oidc_info_content = {\n        \"authorization_endpoint\": \"/login\",\n        \"userinfo_endpoint\": \"/userinfo\",\n        \"token_endpoint\": \"/token\",\n        \"jwks_uri\": \"/jwks\",\n        \"issuer\": \"https://issuer.example.com\",\n    }\n    userinfo_content = {\n        \"picture\": \"https://secure.gravatar.com/avatar/123\",\n        \"email\": \"ness@some.oidc.server.onett.example\",\n        \"sub\": 2187,\n        \"identities\": [],\n        \"name\": \"Ness\",\n    }\n    id_token = {\n        \"email\": \"ness@some.oidc.server.onett.example\",\n        \"sub\": 2187,\n        \"preferred_username\": \"wizard\",\n        \"iss\": \"https://issuer.example.com\",\n        \"aud\": \"app123id\",\n    }\n\n    def get_id_token(self) -> dict:\n        return self.id_token\n\n    def get_login_response_json(self, with_refresh_token=True) -> str:\n        data = json.loads(\n            super().get_login_response_json(with_refresh_token=with_refresh_token)\n        )\n        data[\"id_token\"] = jwt.encode(self.get_id_token(), \"secret\")\n        return json.dumps(data)\n\n    def mocked_response(self, *responses):\n        return mocked_response(*responses, callback=self._mocked_responses)\n\n    def get_expected_to_str(self):\n        return \"ness@some.oidc.server.onett.example\"\n\n    def setup_provider(self):\n        self.app = setup_app(self.provider_id)\n        self.app.provider_id = self.provider_id\n        self.app.provider = \"openid_connect\"\n        self.app.settings = {\n            \"server_url\": \"https://unittest.example.com\",\n        }\n        self.app.save()\n        self.request = RequestFactory().get(\"/\")\n        self.provider = self.app.get_provider(self.request)\n\n    def get_mocked_response(self):\n        # Enable test_login in OAuth2TestsMixin, but this response mock is unused\n        return True\n\n    def _mocked_responses(self, url, *args, **kwargs):\n        if url.endswith(\"/.well-known/openid-configuration\"):\n            return MockedResponse(HTTPStatus.OK, json.dumps(self.oidc_info_content))\n        elif url.endswith(\"/userinfo\"):\n            return MockedResponse(HTTPStatus.OK, json.dumps(self.userinfo_content))\n\n    @override_settings(SOCIALACCOUNT_AUTO_SIGNUP=True)\n    def test_login_auto_signup(self):\n        resp = self.login()\n        self.assertRedirects(resp, \"/accounts/profile/\", fetch_redirect_response=False)\n        sa = SocialAccount.objects.get(provider=self.app.provider_id)\n        expected_data = {\"id_token\": self.id_token}\n        if self.app.settings.get(\"fetch_userinfo\", True):\n            expected_data[\"userinfo\"] = self.userinfo_content\n        self.assertDictEqual(sa.extra_data, expected_data)\n\n    def test_404_on_unknown_provider_id(self):\n        \"\"\"\n        Make sure that OIDC endpoints hit with an invalid provider_id\n        not corresponding to any configured social \"apps\" returns a 404\n        instead of an unhandled SocialApp.DoesNotExist.\n        \"\"\"\n\n        # we can't use self.provider.get_login_url as we intentionally\n        # do not want to use the configured provider's ID, so let's inline\n        # OpenIDConnectProvider.get_login_url\n        login_url = reverse(\n            f\"{self.app.provider}_login\",\n            kwargs={\n                # intentionally invalidate the ID\n                \"provider_id\": f\"{self.app.provider_id}-invalid\"\n            },\n        )\n\n        resp = self.client.post(login_url)\n\n        self.assertEqual(resp.status_code, HTTPStatus.NOT_FOUND)\n\n        # same with the callback endpoint - inlining OpenIDConnectProvider.get_callback_url\n        callback_url = reverse(\n            f\"{self.app.provider}_callback\",\n            kwargs={\n                # intentionally invalidate the ID\n                \"provider_id\": f\"{self.app.provider_id}-invalid\"\n            },\n        )\n\n        # note: callback is a GET endpoint\n        resp = self.client.get(callback_url)\n\n        self.assertEqual(resp.status_code, HTTPStatus.NOT_FOUND)\n"
  },
  {
    "path": "tests/apps/socialaccount/conftest.py",
    "content": "import time\nfrom contextlib import contextmanager\nfrom http import HTTPStatus\nfrom unittest.mock import patch\n\nfrom django.urls import reverse\n\nimport pytest\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.internal import statekit\nfrom allauth.socialaccount.models import SocialAccount, SocialLogin, SocialToken\nfrom allauth.socialaccount.providers.base.constants import AuthProcess\nfrom tests.mocking import MockedResponse, mocked_response\n\n\n@pytest.fixture\ndef sociallogin_factory(user_factory):\n    def factory(\n        email=None,\n        username=None,\n        with_email=True,\n        provider=\"unittest-server\",\n        uid=\"123\",\n        email_verified=True,\n        with_token=False,\n    ):\n        user = user_factory(\n            username=username, email=email, commit=False, with_email=with_email\n        )\n        provider_instance = get_adapter().get_provider(request=None, provider=provider)\n        account = SocialAccount(provider=provider, uid=uid)\n        sociallogin = SocialLogin(\n            provider=provider_instance, user=user, account=account\n        )\n        if with_email:\n            sociallogin.email_addresses = [\n                EmailAddress(email=user.email, verified=email_verified, primary=True)\n            ]\n        if with_token:\n            sociallogin.token = SocialToken(token=\"123\", token_secret=\"456\")  # nosec\n        return sociallogin\n\n    return factory\n\n\n@pytest.fixture\ndef jwt_decode_bypass():\n    @contextmanager\n    def f(jwt_data):\n        with patch(\"allauth.socialaccount.internal.jwtkit.verify_and_decode\") as m:\n            data = {\n                \"iss\": \"https://accounts.google.com\",\n                \"aud\": \"client_id\",\n                \"sub\": \"123sub\",\n                \"hd\": \"example.com\",\n                \"email\": \"raymond@example.com\",\n                \"email_verified\": True,\n                \"at_hash\": \"HK6E_P6Dh8Y93mRNtsDB1Q\",\n                \"name\": \"Raymond Penners\",\n                \"picture\": \"https://lh5.googleusercontent.com/photo.jpg\",\n                \"given_name\": \"Raymond\",\n                \"family_name\": \"Penners\",\n                \"locale\": \"en\",\n                \"iat\": 123,\n                \"exp\": 456,\n            }\n            data.update(jwt_data)\n            m.return_value = data\n            yield\n\n    return f\n\n\n@pytest.fixture\ndef provider_callback_response():\n    def f(client, process=AuthProcess.LOGIN):\n        with mocked_response(\n            {\n                \"token_endpoint\": \"/\",\n                \"userinfo_endpoint\": \"/\",\n            },\n            MockedResponse(\n                HTTPStatus.OK, \"access_token=456\", {\"content-type\": \"dummy\"}\n            ),\n            {\n                \"sub\": \"sub123\",\n            },\n        ):\n            session = client.session\n            session[statekit.STATES_SESSION_KEY] = {\n                \"state456\": [{\"process\": process}, time.time()]\n            }\n            session.save()\n\n            resp = client.post(\n                reverse(\n                    \"openid_connect_callback\",\n                    kwargs={\"provider_id\": \"unittest-server\"},\n                )\n                + \"?code=123&state=state456\"\n            )\n            return resp\n\n    return f\n"
  },
  {
    "path": "tests/apps/socialaccount/internal/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/internal/test_jwtkit.py",
    "content": "from datetime import timedelta\n\nfrom django.utils import timezone\n\nfrom allauth.socialaccount.internal.jwtkit import verify_and_decode\nfrom allauth.socialaccount.providers.apple.client import jwt_encode\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\n\n\ndef test_verify_and_decode(enable_cache):\n    now = timezone.now()\n    payload = {\n        \"iss\": \"https://accounts.google.com\",\n        \"azp\": \"client_id\",\n        \"aud\": \"client_id\",\n        \"sub\": \"108204268033311374519\",\n        \"hd\": \"example.com\",\n        \"locale\": \"en\",\n        \"iat\": now,\n        \"jti\": \"a4e9b64d5e31da48a2037216e4ba9a5f5f4f50a0\",\n        \"exp\": now + timedelta(hours=1),\n    }\n    id_token = jwt_encode(payload, \"secret\")\n    for attempt in range(2):\n        try:\n            verify_and_decode(\n                credential=id_token,\n                keys_url=\"/\",\n                issuer=payload[\"iss\"],\n                audience=payload[\"aud\"],\n                lookup_kid=False,\n                verify_signature=False,\n            )\n            assert attempt == 0\n        except OAuth2Error:\n            assert attempt == 1\n"
  },
  {
    "path": "tests/apps/socialaccount/internal/test_statekit.py",
    "content": "import time\n\nfrom allauth.socialaccount.internal import statekit\n\n\ndef test_get_oldest_state():\n    states = {\n        \"new\": [{\"id\": \"new\"}, 300],\n        \"mid\": [{\"id\": \"mid\"}, 200],\n        \"old\": [{\"id\": \"old\"}, 100],\n    }\n    state_id, state = statekit.get_oldest_state(states)\n    assert state_id == \"old\"\n    assert state[\"id\"] == \"old\"\n\n\ndef test_get_oldest_state_empty():\n    state_id, state = statekit.get_oldest_state({})\n    assert state_id is None\n    assert state is None\n\n\ndef test_gc_states():\n    states = {}\n    for i in range(statekit.MAX_STATES + 1):\n        states[f\"state-{i}\"] = [{\"i\": i}, 1000 + i]\n    assert len(states) == statekit.MAX_STATES + 1\n    statekit.gc_states(states)\n    assert len(states) == statekit.MAX_STATES\n    assert \"state-0\" not in states\n\n\ndef test_stashing(rf):\n    request = rf.get(\"/\")\n    request.session = {}\n\n    # Stash states with a small delay\n    state_id = statekit.stash_state(request, {\"foo\": \"bar\"})\n    time.sleep(0.001)  # delay for microseconds\n    state2_id = statekit.stash_state(request, {\"foo2\": \"bar2\"})\n    time.sleep(0.001)  # delay for microseconds\n    state3_id = statekit.stash_state(request, {\"foo3\": \"bar3\"})\n\n    # Unstash last state and check order\n    state = statekit.unstash_last_state(request)\n    assert state == {\"foo3\": \"bar3\"}\n\n    state = statekit.unstash_state(request, state3_id)\n    assert state is None\n    state = statekit.unstash_state(request, state2_id)\n    assert state == {\"foo2\": \"bar2\"}\n    state = statekit.unstash_state(request, state2_id)\n    assert state is None\n    state = statekit.unstash_state(request, state_id)\n    assert state == {\"foo\": \"bar\"}\n    state = statekit.unstash_state(request, state_id)\n    assert state is None\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/agave/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/agave/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.agave.provider import AgaveProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass AgaveTests(OAuth2TestsMixin, TestCase):\n    provider_id = AgaveProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n        \"status\": \"success\",\n        \"message\": \"User details retrieved successfully.\",\n        \"version\": \"2.0.0-SNAPSHOT-rc3fad\",\n        \"result\": {\n          \"first_name\": \"John\",\n          \"last_name\": \"Doe\",\n          \"full_name\": \"John Doe\",\n          \"email\": \"jon@doe.edu\",\n          \"phone\": \"\",\n          \"mobile_phone\": \"\",\n          \"status\": \"Active\",\n          \"create_time\": \"20180322043812Z\",\n          \"username\": \"jdoe\"\n          }\n        }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"jdoe\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/amazon/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/amazon/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.amazon.provider import AmazonProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass AmazonTests(OAuth2TestsMixin, TestCase):\n    provider_id = AmazonProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n          \"Profile\":{\n                        \"CustomerId\":\"amzn1.account.K2LI23KL2LK2\",\n                        \"Name\":\"John Doe\",\n                        \"PrimaryEmail\":\"johndoe@example.com\"\n                    }\n        }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"johndoe@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/amazon_cognito/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/amazon_cognito/tests.py",
    "content": "import json\nfrom http import HTTPStatus\n\nfrom django.test import TestCase, override_settings\n\nimport pytest\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.amazon_cognito.provider import (\n    AmazonCognitoProvider,\n)\nfrom allauth.socialaccount.providers.amazon_cognito.utils import (\n    convert_to_python_bool_if_value_is_json_string_bool,\n)\nfrom allauth.socialaccount.providers.amazon_cognito.views import (\n    AmazonCognitoOAuth2Adapter,\n)\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\ndef _get_mocked_claims():\n    return {\n        \"sub\": \"4993b410-8a1b-4c36-b843-a9c1a697e6b7\",\n        \"given_name\": \"John\",\n        \"family_name\": \"Doe\",\n        \"email\": \"jdoe@example.com\",\n        \"username\": \"johndoe\",\n    }\n\n\n@override_settings(\n    SOCIALACCOUNT_PROVIDERS={\n        \"amazon_cognito\": {\"DOMAIN\": \"https://domain.auth.us-east-1.amazoncognito.com\"}\n    }\n)\nclass AmazonCognitoTestCase(OAuth2TestsMixin, TestCase):\n    provider_id = AmazonCognitoProvider.id\n\n    def get_mocked_response(self):\n        mocked_payload = json.dumps(_get_mocked_claims())\n        return MockedResponse(status_code=HTTPStatus.OK, content=mocked_payload)\n\n    def get_expected_to_str(self):\n        return \"johndoe\"\n\n    @override_settings(SOCIALACCOUNT_PROVIDERS={\"amazon_cognito\": {}})\n    def test_oauth2_adapter_raises_if_domain_settings_is_missing(\n        self,\n    ):\n        mocked_response = self.get_mocked_response()\n\n        with self.assertRaises(\n            ValueError,\n            msg=AmazonCognitoOAuth2Adapter.DOMAIN_KEY_MISSING_ERROR,\n        ):\n            self.login(mocked_response)\n\n    def test_saves_email_as_verified_if_email_is_verified_in_cognito(\n        self,\n    ):\n        mocked_claims = _get_mocked_claims()\n        mocked_claims[\"email_verified\"] = True\n        mocked_payload = json.dumps(mocked_claims)\n        mocked_response = MockedResponse(\n            status_code=HTTPStatus.OK, content=mocked_payload\n        )\n\n        self.login(mocked_response)\n\n        user_id = SocialAccount.objects.get(uid=mocked_claims[\"sub\"]).user_id\n        email_address = EmailAddress.objects.get(user_id=user_id)\n\n        self.assertEqual(email_address.email, mocked_claims[\"email\"])\n        self.assertTrue(email_address.verified)\n\n    def test_provider_slug_replaces_underscores_with_hyphens(self):\n        self.assertTrue(\"_\" not in self.provider.get_slug())\n\n\n@pytest.mark.parametrize(\n    \"input,output\",\n    [\n        (True, True),\n        (\"true\", True),\n        (\"false\", False),\n        (False, False),\n    ],\n)\ndef test_convert_bool(input, output):\n    assert convert_to_python_bool_if_value_is_json_string_bool(input) == output\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/angellist/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/angellist/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.angellist.provider import AngelListProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass AngelListTests(OAuth2TestsMixin, TestCase):\n    provider_id = AngelListProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\"name\":\"pennersr\",\"id\":424732,\"bio\":\"\",\"follower_count\":0,\n\"angellist_url\":\"https://angel.co/dsxtst\",\n\"image\":\"https://angel.co/images/shared/nopic.png\",\n\"email\":\"raymond.penners@example.com\",\"blog_url\":null,\n\"online_bio_url\":null,\"twitter_url\":\"https://x.com/dsxtst\",\n\"facebook_url\":null,\"linkedin_url\":null,\"aboutme_url\":null,\n\"github_url\":null,\"dribbble_url\":null,\"behance_url\":null,\n\"what_ive_built\":null,\"locations\":[],\"roles\":[],\"skills\":[],\n\"investor\":false,\"scopes\":[\"message\",\"talent\",\"dealflow\",\"comment\",\n\"email\"]}\n\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"raymond.penners@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/apple/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/apple/tests.py",
    "content": "import json\nimport time\nfrom http import HTTPStatus\nfrom importlib import import_module\nfrom urllib.parse import parse_qs, urlparse\n\nfrom django.conf import settings\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nimport jwt\n\nfrom allauth.socialaccount.providers.apple.apple_session import (\n    APPLE_SESSION_COOKIE_NAME,\n)\nfrom allauth.socialaccount.providers.apple.client import jwt_encode\nfrom allauth.socialaccount.providers.apple.provider import AppleProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse, mocked_response\n\n\n# Generated on https://mkjwk.org/, used to sign and verify the apple id_token\nTESTING_JWT_KEYSET = {\n    \"p\": (\n        \"4ADzS5jKx_kdQihyOocVS0Qwwo7m0f7Ow56EadySJ-cmnwoHHF3AxgRaq-h-KwybSphv\"\n        \"dc-X7NbS79-b9dumHKyt1MeVLAsDZD1a-uQCEneY1g9LsQkscNr7OggcpvMg5UUFwv6A\"\n        \"kavu8cB0iyhNdha5_AWX27K5lNebvpaXEJ8\"\n    ),\n    \"kty\": \"RSA\",\n    \"q\": (\n        \"yy5UvMjrvZyO1Os_nxXIugCa3NyWOkC8oMppPvr1Bl5AnF_xwXN2n9ozPd9Nb3Q3n-om\"\n        \"NgLayyUxhwIjWDlI67Vbx-ESuff8ZEBKuTK0Gdmr4C_QU_j0gvvNMNJweSPxDdRmIUgO\"\n        \"njTVNWmdqFTZs43jXAT4J519rgveNLAkGNE\"\n    ),\n    \"d\": (\n        \"riPuGIDde88WS03CVbo_mZ9toFWPyTxvuz8VInJ9S1ZxULo-hQWDBohWGYwvg8cgfXck\"\n        \"cqWt5OBqNvPYdLgwb84uVi2JeEHmhcQSc_x0zfRTau5HVE2KdR-gWxQjPWoaBHeDVqwo\"\n        \"PKaU2XYxa-gYDXcuSJWHz3BX13oInDEFCXr6VwiLiwLBFsb63EEHwyWXJbTpoar7AARW\"\n        \"kz76qtngDkk4t9gk_Q0L1y1qf1GeWiAL7xWb-bdptma4-1ui-R2219-1ONEZ41v_jsIS\"\n        \"_z8ooXmVCbUsHV4Z1UDpRvpORVE3u57WK3qXUdAtZsXjaIwkdItbDmL1jFUgefwfO91Y\"\n        \"YQ\"\n    ),\n    \"e\": \"AQAB\",\n    \"use\": \"sig\",\n    \"kid\": \"testkey\",\n    \"qi\": (\n        \"R0Hu4YmpHzw3SKWGYuAcAo6B97-JlN2fXiTjZ2g8eHGQX7LSoKEu0Hmu5hcBZYSgOuor\"\n        \"IPsPUu3mNtx3pjLMOaJRk34VwcYu7h23ogEKGcPUt1c4tTotFDdw8WFptDOw4ow31Tml\"\n        \"BPExLqzzGjJeQSNULB1bExuuhYMWx6wBXo8\"\n    ),\n    \"dp\": (\n        \"WBaHlnbjZ3hDVTzqjrGIYizSr-_aPUJitPKlR6wBncd8nJYo7bLAmB4mOewXkX5HozIG\"\n        \"wuF78RsZoFLi1fAmhqgxQ7eopcU-9DBcksUPO4vkgmlJbrkYzNiQauW9vrllekOGXIQQ\"\n        \"szhVoqP4MLEMpR-Sy9S3PyItcKbJDE3T4ik\"\n    ),\n    \"alg\": \"RS256\",\n    \"dq\": (\n        \"Ar5kbIw2CsBzeVKX8FkF9eUOMk9URAMdyPoSw8P1zRk2vCXbiOY7Qttad8ptLEUgfytV\"\n        \"SsNtGvMsoQsZWRak8nHnhGJ4s0QzB1OK7sdNgU_cL1HV-VxSSPaHhdJBrJEcrzggDPEB\"\n        \"KYfDHU6Iz34d1nvjBxoWE8rfqJsGbCW4xxE\"\n    ),\n    \"n\": (\n        \"sclLPioUv4VOcOZWAKoRhcvwIH2jOhoHhSI_Cj5c5zSp7qaK8jCU6T7-GObsgrhpty-k\"\n        \"26ZuqRdgu9d-62WO8OBGt1e0wxbTh128-nTTrOESHUlV_K1wpJmXOxNpJiybcgzZNbAm\"\n        \"ACmsHfxZvN9bt7gKPXxf3-_zFAf12PbYMrOionAJ1N_4HxL7fz3xkr5C87Av06QNilIC\"\n        \"-mA-4n9Eqw_R2DYNpE3RYMdWtwKqBwJC8qs3677RpG9vcc-yZ_97pEiytd2FBJ8uoTwH\"\n        \"d3DHJB8UVgBSh1kMUpSdoM7HxVzKx732nx6Kusln79LrsfOzrXF4enkfKJYI40-uwT95\"\n        \"zw\"\n    ),\n}\n\n\n# Mocked version of the test data from https://appleid.apple.com/auth/keys\nKEY_SERVER_RESP_JSON = json.dumps(\n    {\n        \"keys\": [\n            {\n                \"kty\": TESTING_JWT_KEYSET[\"kty\"],\n                \"kid\": TESTING_JWT_KEYSET[\"kid\"],\n                \"use\": TESTING_JWT_KEYSET[\"use\"],\n                \"alg\": TESTING_JWT_KEYSET[\"alg\"],\n                \"n\": TESTING_JWT_KEYSET[\"n\"],\n                \"e\": TESTING_JWT_KEYSET[\"e\"],\n            }\n        ]\n    }\n)\n\n\ndef sign_id_token(payload):\n    \"\"\"\n    Sign a payload as apple normally would for the id_token.\n    \"\"\"\n    signing_key = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(TESTING_JWT_KEYSET))\n    return jwt_encode(\n        payload,\n        signing_key,\n        algorithm=\"RS256\",\n        headers={\"kid\": TESTING_JWT_KEYSET[\"kid\"]},\n    )\n\n\n@override_settings(\n    SOCIALACCOUNT_STORE_TOKENS=False,\n    SOCIALACCOUNT_PROVIDERS={\n        \"apple\": {\n            \"APP\": {\n                \"client_id\": \"app123id\",\n                \"key\": \"apple\",\n                \"secret\": \"dummy\",\n                \"settings\": {\n                    \"certificate_key\": \"\"\"-----BEGIN PRIVATE KEY-----\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg2+Eybl8ojH4wB30C\n3/iDkpsrxuPfs3DZ+3nHNghBOpmhRANCAAQSpo1eQ+EpNgQQyQVs/F27dkq3gvAI\n28m95JEk26v64YAea5NTH56mru30RDqTKPgRVi5qRu3XGyqy3mdb8gMy\n-----END PRIVATE KEY-----\n\"\"\",\n                },\n            }\n        }\n    },\n)\nclass AppleTests(OAuth2TestsMixin, TestCase):\n    provider_id = AppleProvider.id\n\n    def get_apple_id_token_payload(self):\n        now = int(time.time())\n        return {\n            \"iss\": \"https://appleid.apple.com\",\n            \"aud\": \"app123id\",  # Matches `setup_app`\n            \"exp\": now + 60 * 60,\n            \"iat\": now,\n            \"sub\": \"000313.c9720f41e9434e18987a.1218\",\n            \"at_hash\": \"CkaUPjk4MJinaAq6Z0tGUA\",\n            \"email\": \"test@privaterelay.appleid.com\",\n            \"email_verified\": \"true\",\n            \"is_private_email\": \"true\",\n            \"auth_time\": 1234345345,  # not converted automatically by pyjwt\n        }\n\n    def test_verify_token(self):\n        id_token = sign_id_token(self.get_apple_id_token_payload())\n        with mocked_response(self.get_mocked_response()):\n            sociallogin = self.provider.verify_token(None, {\"id_token\": id_token})\n            assert sociallogin.user.email == \"test@privaterelay.appleid.com\"\n\n    def get_login_response_json(self, with_refresh_token=True):\n        \"\"\"\n        `with_refresh_token` is not optional for apple, so it's ignored.\n        \"\"\"\n        id_token = sign_id_token(self.get_apple_id_token_payload())\n\n        return json.dumps(\n            {\n                \"access_token\": \"testac\",  # Matches OAuth2TestsMixin value\n                \"expires_in\": 3600,\n                \"id_token\": id_token,\n                \"refresh_token\": \"testrt\",  # Matches OAuth2TestsMixin value\n                \"token_type\": \"Bearer\",\n            }\n        )\n\n    def get_mocked_response(self):\n        \"\"\"\n        Apple is unusual in that the `id_token` contains all the user info\n        so no profile info request is made. However, it does need the\n        public key verification, so this mocked response is the public\n        key request in order to verify the authenticity of the id_token.\n        \"\"\"\n        return MockedResponse(\n            HTTPStatus.OK, KEY_SERVER_RESP_JSON, {\"content-type\": \"application/json\"}\n        )\n\n    def get_expected_to_str(self):\n        return \"A B\"\n\n    def get_complete_parameters(self, auth_request_params):\n        \"\"\"\n        Add apple specific response parameters which they include in the\n        form_post response.\n\n        https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js/incorporating_sign_in_with_apple_into_other_platforms\n        \"\"\"\n        params = super().get_complete_parameters(auth_request_params)\n        params.update(\n            {\n                \"id_token\": sign_id_token(self.get_apple_id_token_payload()),\n                \"user\": json.dumps(\n                    {\n                        \"email\": \"private@appleid.apple.com\",\n                        \"name\": {\n                            \"firstName\": \"A\",\n                            \"lastName\": \"B\",\n                        },\n                    }\n                ),\n            }\n        )\n        return params\n\n    def login(self, resp_mock, process=\"login\", with_refresh_token=True):\n        resp = self.client.post(\n            f\"{reverse(f'{self.provider.id}_login')}?{urlencode(dict(process=process))}\"\n        )\n        p = urlparse(resp[\"location\"])\n        q = parse_qs(p.query)\n        complete_url = reverse(f\"{self.provider.id}_callback\")\n        self.assertGreater(q[\"redirect_uri\"][0].find(complete_url), 0)\n        response_json = self.get_login_response_json(\n            with_refresh_token=with_refresh_token\n        )\n        with mocked_response(\n            MockedResponse(\n                HTTPStatus.OK, response_json, {\"content-type\": \"application/json\"}\n            ),\n            resp_mock,\n        ):\n            resp = self.client.post(\n                complete_url,\n                data=self.get_complete_parameters(q),\n            )\n            assert reverse(\"apple_finish_callback\") in resp.url\n\n            # Follow the redirect\n            resp = self.client.get(resp.url)\n\n        return resp\n\n    def test_authentication_error(self):\n        \"\"\"Override base test because apple posts errors\"\"\"\n        resp = self.client.post(\n            reverse(f\"{self.provider.id}_callback\"),\n            data={\"error\": \"misc\", \"state\": \"testingstate123\"},\n        )\n        assert reverse(\"apple_finish_callback\") in resp.url\n        # Follow the redirect\n        resp = self.client.get(resp.url)\n\n        template_ext = getattr(settings, \"ACCOUNT_TEMPLATE_EXTENSION\", \"html\")\n        self.assertTemplateUsed(\n            resp, f\"socialaccount/authentication_error.{template_ext}\"\n        )\n\n    def test_apple_finish(self):\n        resp = self.login(self.get_mocked_response())\n\n        # Check request generating the response\n        finish_url = reverse(\"apple_finish_callback\")\n        self.assertEqual(resp.request[\"PATH_INFO\"], finish_url)\n        self.assertTrue(\"state\" in resp.request[\"QUERY_STRING\"])\n        self.assertTrue(\"code\" in resp.request[\"QUERY_STRING\"])\n\n        # Check have cookie containing apple session\n        self.assertTrue(APPLE_SESSION_COOKIE_NAME in self.client.cookies)\n\n        # Session should have been cleared\n        apple_session_cookie = self.client.cookies.get(APPLE_SESSION_COOKIE_NAME)\n        engine = import_module(settings.SESSION_ENGINE)\n        SessionStore = engine.SessionStore\n        apple_login_session = SessionStore(apple_session_cookie.value)\n        self.assertEqual(len(apple_login_session.keys()), 0)\n\n        # Check cookie path was correctly set\n        self.assertEqual(apple_session_cookie.get(\"path\"), finish_url)\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/asana/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/asana/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.asana.provider import AsanaProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass AsanaTests(OAuth2TestsMixin, TestCase):\n    provider_id = AsanaProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\"data\": {\"photo\": null, \"workspaces\": [{\"id\": 31337, \"name\": \"example.com\"},\n{\"id\": 3133777, \"name\": \"Personal Projects\"}], \"email\": \"test@example.com\",\n\"name\": \"Test Name\", \"gid\": 43748387}}\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"test@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/atlassian/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/atlassian/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.atlassian.provider import AtlassianProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass AtlassianTests(OAuth2TestsMixin, TestCase):\n    provider_id = AtlassianProvider.id\n\n    def get_mocked_response(self):\n        response_data = \"\"\"\n        {\n            \"account_type\": \"atlassian\",\n            \"account_id\": \"112233aa-bb11-cc22-33dd-445566abcabc\",\n            \"email\": \"mia@example.com\",\n            \"email_verified\": true,\n            \"name\": \"Mia Krystof\",\n            \"picture\": \"https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/112233aa-bb11-cc22-33dd-445566abcabc/1234abcd-9876-54aa-33aa-1234dfsade9487ds\",\n            \"account_status\": \"active\",\n            \"nickname\": \"mkrystof\",\n            \"zoneinfo\": \"Australia/Sydney\",\n            \"locale\": \"en-US\",\n            \"extended_profile\": {\n                \"job_title\": \"Designer\",\n                \"organization\": \"mia@example.com\",\n                \"department\": \"Design team\",\n                \"location\": \"Sydney\"\n            }\n        }\"\"\"\n        return MockedResponse(HTTPStatus.OK, response_data)\n\n    def get_expected_to_str(self):\n        return \"mia@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/auth0/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/auth0/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.auth0.provider import Auth0Provider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass Auth0Tests(OAuth2TestsMixin, TestCase):\n    provider_id = Auth0Provider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n            {\n                \"picture\": \"https://secure.gravatar.com/avatar/123\",\n                \"email\": \"mr.bob@your.Auth0.server.example.com\",\n                \"id\": 2,\n                \"sub\": 2,\n                \"identities\": [],\n                \"name\": \"Mr Bob\"\n            }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"mr.bob@your.Auth0.server.example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/authentiq/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/authentiq/tests.py",
    "content": "import json\nfrom http import HTTPStatus\n\nfrom django.test import TestCase\nfrom django.test.client import RequestFactory\nfrom django.test.utils import override_settings\n\nfrom allauth.socialaccount.providers.authentiq.provider import AuthentiqProvider\nfrom allauth.socialaccount.providers.authentiq.views import AuthentiqOAuth2Adapter\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass AuthentiqTests(OAuth2TestsMixin, TestCase):\n    provider_id = AuthentiqProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            json.dumps(\n                {\n                    \"sub\": \"ZLARGMFT1M\",\n                    \"email\": \"jane@email.invalid\",\n                    \"email_verified\": True,\n                    \"given_name\": \"Jane\",\n                    \"family_name\": \"Doe\",\n                }\n            ),\n        )\n\n    def get_expected_to_str(self):\n        return \"jane@email.invalid\"\n\n    @override_settings(\n        SOCIALACCOUNT_QUERY_EMAIL=False,\n    )\n    def test_default_scopes_no_email(self):\n        scopes = self.provider.get_default_scope()\n        self.assertIn(\"aq:name\", scopes)\n        self.assertNotIn(\"email\", scopes)\n\n    @override_settings(\n        SOCIALACCOUNT_QUERY_EMAIL=True,\n    )\n    def test_default_scopes_email(self):\n        scopes = self.provider.get_default_scope()\n        self.assertIn(\"aq:name\", scopes)\n        self.assertIn(\"email\", scopes)\n\n    def test_scopes(self):\n        request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url)\n        scopes = self.provider.get_scope_from_request(request)\n        self.assertIn(\"openid\", scopes)\n        self.assertIn(\"aq:name\", scopes)\n\n    def test_dynamic_scopes(self):\n        request = RequestFactory().get(\n            AuthentiqOAuth2Adapter.authorize_url, dict(scope=\"foo\")\n        )\n        scopes = self.provider.get_scope_from_request(request)\n        self.assertIn(\"openid\", scopes)\n        self.assertIn(\"aq:name\", scopes)\n        self.assertIn(\"foo\", scopes)\n\n    @override_settings(\n        SOCIALACCOUNT_QUERY_EMAIL=True,\n        SOCIALACCOUNT_EMAIL_REQUIRED=True,\n        SOCIALACCOUNT_EMAIL_VERIFICATION=True,\n    )\n    def test_scopes_required_verified_email(self):\n        request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url)\n        scopes = self.provider.get_scope_from_request(request)\n        self.assertIn(\"email~rs\", scopes)\n        self.assertNotIn(\"email\", scopes)\n\n    @override_settings(\n        SOCIALACCOUNT_QUERY_EMAIL=True,\n        SOCIALACCOUNT_EMAIL_REQUIRED=False,\n        SOCIALACCOUNT_EMAIL_VERIFICATION=True,\n    )\n    def test_scopes_optional_verified_email(self):\n        request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url)\n        scopes = self.provider.get_scope_from_request(request)\n        self.assertIn(\"email~s\", scopes)\n        self.assertNotIn(\"email\", scopes)\n\n    @override_settings(\n        SOCIALACCOUNT_QUERY_EMAIL=True,\n        SOCIALACCOUNT_EMAIL_REQUIRED=True,\n        SOCIALACCOUNT_EMAIL_VERIFICATION=False,\n    )\n    def test_scopes_required_email(self):\n        request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url)\n        scopes = self.provider.get_scope_from_request(request)\n        self.assertIn(\"email~r\", scopes)\n        self.assertNotIn(\"email\", scopes)\n\n    @override_settings(\n        SOCIALACCOUNT_QUERY_EMAIL=True,\n        SOCIALACCOUNT_EMAIL_REQUIRED=False,\n        SOCIALACCOUNT_EMAIL_VERIFICATION=False,\n    )\n    def test_scopes_optional_email(self):\n        request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url)\n        scopes = self.provider.get_scope_from_request(request)\n        self.assertIn(\"email\", scopes)\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/baidu/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/baidu/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.baidu.provider import BaiduProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass BaiduTests(OAuth2TestsMixin, TestCase):\n    provider_id = BaiduProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\"portrait\": \"78c0e9839de59bbde7859ccf43\",\n\"uname\": \"\\u90dd\\u56fd\\u715c\", \"uid\": \"3225892368\"}\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"\\u90dd\\u56fd\\u715c\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/base/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/base/test_provider.py",
    "content": "from unittest.mock import Mock\n\nimport pytest\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.providers.base.provider import Provider\n\n\n@pytest.mark.parametrize(\n    \"email,emails,expected_email,expected_emails\",\n    [\n        (\n            \"a@A.COM\",\n            [EmailAddress(email=\"A@a.com\")],\n            \"a@a.com\",\n            [EmailAddress(email=\"a@a.com\")],\n        ),\n        (\n            None,\n            [\n                EmailAddress(email=\"A@a.com\", primary=True),\n                EmailAddress(email=\"b-AT-b.com\"),\n                EmailAddress(email=\"c@c.com\", primary=False),\n            ],\n            \"a@a.com\",\n            [EmailAddress(email=\"a@a.com\"), EmailAddress(email=\"c@c.com\")],\n        ),\n        (\n            \"a@A.COM\",\n            [EmailAddress(email=\"invalid.com\")],\n            \"a@a.com\",\n            [EmailAddress(email=\"a@a.com\")],\n        ),\n        (\n            \"a@A.COM\",\n            [EmailAddress(email=\"is@valid.com\")],\n            \"a@a.com\",\n            [\n                EmailAddress(email=\"a@a.com\"),\n                EmailAddress(email=\"is@valid.com\"),\n            ],\n        ),\n        (\n            \"invalid@test.email\",\n            [\n                EmailAddress(email=\"invalid@test.email\"),\n            ],\n            None,\n            [],\n        ),\n        (\n            \"invalid@test.email\",\n            [\n                EmailAddress(email=\"invalid@test.email\"),\n                EmailAddress(email=\"valid@test.email\"),\n            ],\n            \"valid@test.email\",\n            [EmailAddress(email=\"valid@test.email\")],\n        ),\n    ],\n)\ndef test_cleanup_email_addresses(email, emails, expected_email, expected_emails):\n    app = Mock()\n    app.settings = {\"verified_email\": None}\n    provider = Provider(None, app=app)\n    provider.id = \"test\"\n    email = provider.cleanup_email_addresses(email, emails)\n    assert email == expected_email\n    assert len(emails) == len(expected_emails)\n    for i, addr in enumerate(emails):\n        assert addr.email == expected_emails[i].email\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/basecamp/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/basecamp/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.basecamp.provider import BasecampProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass BasecampTests(OAuth2TestsMixin, TestCase):\n    provider_id = BasecampProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n            \"expires_at\": \"2012-03-22T16:56:48-05:00\",\n            \"identity\": {\n                \"id\": 9999999,\n                \"first_name\": \"Jason Fried\",\n                \"last_name\": \"Jason Fried\",\n                \"email_address\": \"jason@example.com\"\n            },\n            \"accounts\": [\n                {\n                    \"product\": \"bcx\",\n                    \"id\": 88888888,\n                    \"name\": \"Wayne Enterprises, Ltd.\",\n                    \"href\": \"https://basecamp.com/88888888/api/v1\"\n                },\n                {\n                    \"product\": \"bcx\",\n                    \"id\": 77777777,\n                    \"name\": \"Veidt, Inc\",\n                    \"href\": \"https://basecamp.com/77777777/api/v1\"\n                },\n                {\n                    \"product\": \"campfire\",\n                    \"id\": 44444444,\n                    \"name\": \"Acme Shipping Co.\",\n                    \"href\": \"https://acme4444444.campfirenow.com\"\n                }\n            ]\n        }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"jason@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/battlenet/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/battlenet/tests.py",
    "content": "import json\nfrom http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.battlenet.provider import BattleNetProvider\nfrom allauth.socialaccount.providers.battlenet.views import _check_errors\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass BattleNetTests(OAuth2TestsMixin, TestCase):\n    provider_id = BattleNetProvider.id\n    _uid = 123456789\n    _battletag = \"LuckyDragon#1953\"\n\n    def get_mocked_response(self):\n        data = {\"battletag\": self._battletag, \"id\": self._uid}\n        return MockedResponse(HTTPStatus.OK, json.dumps(data))\n\n    def get_expected_to_str(self):\n        return self._battletag\n\n    def test_valid_response_no_battletag(self):\n        data = {\"id\": 12345}\n        response = MockedResponse(HTTPStatus.OK, json.dumps(data))\n        self.assertEqual(_check_errors(response), data)\n\n    def test_invalid_data(self):\n        response = MockedResponse(HTTPStatus.OK, json.dumps({}))\n        with self.assertRaises(OAuth2Error):\n            # No id, raises\n            _check_errors(response)\n\n    def test_profile_invalid_response(self):\n        data = {\n            \"code\": HTTPStatus.FORBIDDEN,\n            \"type\": \"Forbidden\",\n            \"detail\": \"Account Inactive\",\n        }\n        response = MockedResponse(HTTPStatus.UNAUTHORIZED, json.dumps(data))\n\n        with self.assertRaises(OAuth2Error):\n            # no id, 4xx code, raises\n            _check_errors(response)\n\n    def test_error_response(self):\n        body = json.dumps({\"error\": \"invalid_token\"})\n        response = MockedResponse(HTTPStatus.BAD_REQUEST, body)\n\n        with self.assertRaises(OAuth2Error):\n            # no id, 4xx code, raises\n            _check_errors(response)\n\n    def test_service_not_found(self):\n        response = MockedResponse(596, \"<h1>596 Service Not Found</h1>\")\n        with self.assertRaises(OAuth2Error):\n            # bad json, 5xx code, raises\n            _check_errors(response)\n\n    def test_invalid_response(self):\n        response = MockedResponse(HTTPStatus.OK, \"invalid json data\")\n        with self.assertRaises(OAuth2Error):\n            # bad json, raises\n            _check_errors(response)\n\n    def test_extra_data(self):\n        self.login(self.get_mocked_response())\n        account = SocialAccount.objects.get(uid=str(self._uid))\n        self.assertEqual(account.extra_data[\"battletag\"], self._battletag)\n        self.assertEqual(account.extra_data[\"id\"], self._uid)\n        self.assertEqual(account.extra_data[\"region\"], \"us\")\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/bitbucket_oauth2/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/bitbucket_oauth2/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\n\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.bitbucket_oauth2.provider import (\n    BitbucketOAuth2Provider,\n)\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\n@override_settings(SOCIALACCOUNT_QUERY_EMAIL=True, SOCIALACCOUNT_STORE_TOKENS=True)\nclass BitbucketOAuth2Tests(OAuth2TestsMixin, TestCase):\n    provider_id = BitbucketOAuth2Provider.id\n\n    response_data = \"\"\"\n        {\n            \"created_on\": \"2011-12-20T16:34:07.132459+00:00\",\n            \"display_name\": \"tutorials account\",\n            \"links\": {\n                \"avatar\": {\n                    \"href\":\n                    \"https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2013/Nov/25/tutorials-avatar-1563784409-6_avatar.png\"\n                },\n                \"followers\": {\n                    \"href\":\n                    \"https://api.bitbucket.org/2.0/users/tutorials/followers\"\n                },\n                \"following\": {\n                    \"href\":\n                    \"https://api.bitbucket.org/2.0/users/tutorials/following\"\n                },\n                \"html\": {\n                    \"href\": \"https://bitbucket.org/tutorials\"\n                },\n                \"repositories\": {\n                    \"href\":\n                    \"https://api.bitbucket.org/2.0/repositories/tutorials\"\n                },\n                \"self\": {\n                    \"href\": \"https://api.bitbucket.org/2.0/users/tutorials\"\n                }\n            },\n            \"location\": \"Santa Monica, CA\",\n            \"type\": \"user\",\n            \"username\": \"tutorials\",\n            \"uuid\": \"{c788b2da-b7a2-404c-9e26-d3f077557007}\",\n            \"website\": \"https://tutorials.bitbucket.org/\"\n        }\n    \"\"\"  # noqa\n\n    email_response_data = \"\"\"\n        {\n            \"page\": 1,\n            \"pagelen\": 10,\n            \"size\": 1,\n            \"values\": [\n                {\n                    \"email\": \"tutorials@bitbucket.org\",\n                    \"is_confirmed\": true,\n                    \"is_primary\": true,\n                    \"links\": {\n                        \"self\": {\n                            \"href\":\n                            \"https://api.bitbucket.org/2.0/user/emails/tutorials@bitbucket.org\"\n                        }\n                    },\n                    \"type\": \"email\"\n                },\n                {\n                    \"email\": \"tutorials+secondary@bitbucket.org\",\n                    \"is_confirmed\": true,\n                    \"is_primary\": true,\n                    \"links\": {\n                        \"self\": {\n                            \"href\":\n                            \"https://api.bitbucket.org/2.0/user/emails/tutorials+secondary@bitbucket.org\"\n                        }\n                    },\n                    \"type\": \"email\"\n                }\n            ]\n        }\n    \"\"\"  # noqa\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(HTTPStatus.OK, self.response_data),\n            MockedResponse(HTTPStatus.OK, self.email_response_data),\n            MockedResponse(HTTPStatus.OK, self.response_data),\n            MockedResponse(HTTPStatus.OK, self.email_response_data),\n        ]\n\n    def get_expected_to_str(self):\n        return \"tutorials\"\n\n    def test_provider_account(self):\n        self.login(self.get_mocked_response())\n        socialaccount = SocialAccount.objects.get(uid=\"tutorials\")\n        self.assertEqual(socialaccount.user.username, \"tutorials\")\n        self.assertEqual(socialaccount.user.email, \"tutorials@bitbucket.org\")\n        account = socialaccount.get_provider_account()\n        self.assertEqual(account.to_str(), \"tutorials\")\n        self.assertEqual(account.get_profile_url(), \"https://bitbucket.org/tutorials\")\n        self.assertEqual(\n            account.get_avatar_url(),\n            \"https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2013/Nov/25/tutorials-avatar-1563784409-6_avatar.png\",  # noqa\n        )\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/bitly/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/bitly/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.bitly.provider import BitlyProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass BitlyTests(OAuth2TestsMixin, TestCase):\n    provider_id = BitlyProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n            \"data\": {\n                \"apiKey\": \"R_f6397a37e765574f2e198dba5bb59522\",\n                \"custom_short_domain\": null,\n                \"display_name\": null,\n                \"full_name\": \"Bitly API Oauth Demo Account\",\n                \"is_enterprise\": false,\n                \"login\": \"bitlyapioauthdemo\",\n                \"member_since\": 1331567982,\n                \"profile_image\": \"http://bitly.com/u/bitlyapioauthdemo.png\",\n                \"profile_url\": \"http://bitly.com/u/bitlyapioauthdemo\",\n                \"share_accounts\": [],\n                \"tracking_domains\": []\n            },\n            \"status_code\": 200,\n            \"status_txt\": \"OK\"\n        }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"bitlyapioauthdemo\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/box/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/box/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.box.provider import BoxOAuth2Provider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass BoxOAuth2Tests(OAuth2TestsMixin, TestCase):\n    provider_id = BoxOAuth2Provider.id\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"{\n          \"type\": \"user\",\n          \"id\": \"1185237519\",\n          \"name\": \"Balls Johnson\",\n          \"login\": \"balls@example.com\",\n          \"created_at\": \"2017-02-18T21:16:39-08:00\",\n          \"modified_at\": \"2017-02-18T21:19:11-08:00\",\n          \"language\": \"en\",\n          \"timezone\": \"America/Los_Angeles\",\n          \"space_amount\": 10737418240,\n          \"space_used\": 0,\n          \"max_upload_size\": 2147483648,\n          \"status\": \"active\",\n          \"job_title\": \"\",\n          \"phone\": \"123-345-5555\",\n          \"address\": \"\",\n          \"avatar_url\": \"https://app.box.com/api/avatar/large/1185237519\"\n        }\"\"\",\n            )\n        ]\n\n    def get_expected_to_str(self):\n        return \"balls@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/cilogon/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/cilogon/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.cilogon.provider import CILogonProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass CILogonTests(OAuth2TestsMixin, TestCase):\n    provider_id = CILogonProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n            \"email\": \"johndoe@example.edu\",\n            \"eppn\": \"u1234567@example.edu\",\n            \"firstname\": \"John\",\n            \"lastname\": \"Doe\",\n            \"idp_name\": \"Example University\",\n            \"sub\": \"http://cilogon.org/serverA/users/1234567\"\n        }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"johndoe@example.edu\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/clever/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/clever/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.clever.provider import CleverProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass CleverOAuth2Tests(OAuth2TestsMixin, TestCase):\n    provider_id = CleverProvider.id\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"{\n            \"type\": \"user\",\n            \"data\": {\n                \"id\": \"62027798269867124d10259e\",\n                \"district\": \"6202763c8243d2100123dae5\",\n                \"type\": \"user\",\n                \"authorized_by\": \"district\"\n            },\n            \"links\": [\n                {\n                \"rel\": \"self\",\n                \"uri\": \"/me\"\n                },\n                {\n                \"rel\": \"canonical\",\n                \"uri\": \"/v3.0/users/62027798269867124d10259e\"\n                },\n                {\n                \"rel\": \"district\",\n                \"uri\": \"/v3.0/districts/6202763c8243d2100123dae5\"\n                }\n            ]\n        }\"\"\",\n            ),\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"{\n                \"data\": {\n                \"id\": \"62027798269867124d10259e\",\n                  \"roles\": {\n                \"district_admin\": {},\n                \"contact\": {}\n                }\n                }\n                }\"\"\",\n            ),\n        ]\n\n    def get_expected_to_str(self):\n        return \"Clever\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/coinbase/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/coinbase/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.coinbase.provider import CoinbaseProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass CoinbaseTests(OAuth2TestsMixin, TestCase):\n    provider_id = CoinbaseProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n          \"id\": \"9da7a204-544e-5fd1-9a12-61176c5d4cd8\",\n          \"name\": \"User One\",\n          \"username\": \"user1\",\n          \"email\": \"user1@example.com\",\n          \"profile_location\": null,\n          \"profile_bio\": null,\n          \"profile_url\": \"https://coinbase.com/user1\",\n          \"avatar_url\": \"https://images.coinbase.com/avatar?h=vR%2FY8igBoPwuwGren5JMwvDNGpURAY%2F0nRIOgH%2FY2Qh%2BQ6nomR3qusA%2Bh6o2%0Af9rH&s=128\",\n          \"resource\": \"user\",\n          \"resource_path\": \"/v2/user\"\n            }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"user1\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/dataporten/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/dataporten/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.dataporten.provider import DataportenProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass DataportenTest(OAuth2TestsMixin, TestCase):\n    provider_id = DataportenProvider.id\n\n    def setUp(self):\n        super().setUp()\n        self.mock_data = {\n            \"userid\": \"76a7a061-3c55-430d-8ee0-6f82ec42501f\",\n            \"userid_sec\": [\"feide:andreas@uninett.no\"],\n            \"name\": \"Andreas \\u00c5kre Solberg\",\n            \"email\": \"andreas.solberg@uninett.no\",\n            \"profilephoto\": \"p:a3019954-902f-45a3-b4ee-bca7b48ab507\",\n            \"groups\": [{}],\n        }\n\n    def get_login_response_json(self, with_refresh_token=True):\n        rt = \"\"\n        if with_refresh_token:\n            rt = ',\"refresh_token\": \"testrf\"'\n        return (\n            \"\"\"{\n            \"access_token\":\"testac\",\n            \"expires_in\":3600,\n            \"scope\": \"userid profile groups\"\n            %s\n        }\"\"\"\n            % rt\n        )\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            status_code=HTTPStatus.OK,\n            content=\"\"\"{\n                \"user\": {\n                    \"userid\": \"76a7a061-3c55-430d-8ee0-6f82ec42501f\",\n                    \"userid_sec\": [\"feide:andreas@uninett.no\"],\n                    \"name\": \"Andreas \\u00c5kre Solberg\",\n                    \"email\": \"andreas.solberg@uninett.no\",\n                    \"profilephoto\": \"p:a3019954-902f-45a3-b4ee-bca7b48ab507\"\n                },\n                \"audience\": \"app123id\"\n            }\"\"\",\n            headers={\"content-type\": \"application/json\"},\n        )\n\n    def get_expected_to_str(self):\n        return \"andreas.solberg@uninett.no\"\n\n    def test_extract_uid(self):\n        uid = self.provider.extract_uid(self.mock_data)\n        self.assertEqual(uid, self.mock_data[\"userid\"])\n\n    def test_extract_extra_data(self):\n        # All the processing is done in the complete_login view, and thus\n        # the data should be returned unaltered\n        extra_data = self.provider.extract_extra_data(self.mock_data)\n        self.assertEqual(extra_data, self.mock_data)\n\n    def test_extract_common_fields(self):\n        # The main task of this function is to parse the data in order to\n        # find the Feide username, and if not, use the email\n        common_fields = self.provider.extract_common_fields(self.mock_data)\n        self.assertEqual(common_fields[\"username\"], \"andreas\")\n\n        # Test correct behaviour when Feide username is unavailable\n        new_mock_data = dict(self.mock_data)\n        new_mock_data[\"userid_sec\"] = []\n        new_common_fields = self.provider.extract_common_fields(new_mock_data)\n        self.assertEqual(new_common_fields[\"username\"], \"andreas.solberg\")\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/daum/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/daum/tests.py",
    "content": "import json\nfrom http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.daum.provider import DaumProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass DaumTests(OAuth2TestsMixin, TestCase):\n    provider_id = DaumProvider.id\n\n    def get_mocked_response(self):\n        result = {}\n        result[\"userid\"] = \"38DTh\"\n        result[\"id\"] = 46287445\n        result[\"nickname\"] = \"xncbf\"\n        result[\"bigImagePath\"] = \"https://img1.daumcdn.net/thumb/\"\n        result[\"openProfile\"] = \"https://img1.daumcdn.net/thumb/\"\n        body = {}\n        body[\"code\"] = HTTPStatus.OK\n        body[\"message\"] = \"OK\"\n        body[\"result\"] = result\n        return MockedResponse(HTTPStatus.OK, json.dumps(body))\n\n    def get_expected_to_str(self):\n        return \"xncbf\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/digitalocean/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/digitalocean/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.digitalocean.provider import DigitalOceanProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass DigitalOceanTests(OAuth2TestsMixin, TestCase):\n    provider_id = DigitalOceanProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n          \"account\": {\n            \"droplet_limit\": 25,\n            \"floating_ip_limit\": 5,\n            \"email\": \"sammy@example.com\",\n            \"uuid\": \"b6fr89dbf6d9156cace5f3c78dc9851d957381ef\",\n            \"email_verified\": true,\n            \"status\": \"active\",\n            \"status_message\": \"\"\n          }\n        }\n        \"\"\",\n        )\n\n    def get_login_response_json(self, with_refresh_token=True):\n        return \"\"\"\n        {\n          \"access_token\": \"testac\",\n          \"token_type\": \"bearer\",\n          \"expires_in\": 2592000,\n          \"refresh_token\": \"00a3aae641658d\",\n          \"scope\": \"read write\",\n          \"info\": {\n            \"name\": \"Sammy the Shark\",\n            \"email\":\"sammy@example.com\",\n            \"uuid\":\"b6fr89dbf6d9156cace5f3c78dc9851d957381ef\"\n          }\n        }\"\"\"\n\n    def get_expected_to_str(self):\n        return \"sammy@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/dingtalk/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/dingtalk/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.dingtalk.provider import DingTalkProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass DingTalkTests(OAuth2TestsMixin, TestCase):\n    provider_id = DingTalkProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n            \"nick\": \"aiden\",\n            \"unionId\": \"hTaCSb1nM4RXii6jaQvHZqQiEiE\",\n            \"avatarUrl\": \"https://static-legacy.dingtalk.com/media/lADPDg7mViaksW3NBJPNBJI_1170_1171.jpg\",\n            \"openId\": \"ELdCPlk0V2LodZHx3n0p5AiEiE\"\n            }\"\"\",\n        )\n\n    def get_login_response_json(self, with_refresh_token=True):\n        return \"\"\"{\n    \"accessToken\": \"testac\",\n    \"expireIn\": \"3600\",\n    \"refreshToken\": \"testrf\"\n}\"\"\"\n\n    def get_expected_to_str(self):\n        return \"aiden\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/discogs/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/discogs/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.discogs.provider import DiscogsProvider\nfrom tests.apps.socialaccount.base import OAuthTestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass DiscogsTests(OAuthTestsMixin, TestCase):\n    provider_id = DiscogsProvider.id\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                r'{\"id\": 5788917, \"username\": \"veljkoj\", '\n                r'\"resource_url\": \"https://api.discogs.com/users/veljkoj\", '\n                r'\"consumer_name\": \"myapp\"}',\n            )\n        ]\n\n    def get_expected_to_str(self):\n        return \"veljkoj\"\n\n    def test_login(self):\n        super().test_login()\n        account = SocialAccount.objects.get(uid=\"5788917\")\n        discogs_account = account.get_provider_account()\n\n        self.assertEqual(discogs_account.get_username(), \"veljkoj\")\n        self.assertEqual(\n            discogs_account.get_profile_url(),\n            r\"https://api.discogs.com/users/veljkoj\",\n        )\n        self.assertEqual(discogs_account.to_str(), \"veljkoj\")\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/discord/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/discord/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.contrib.auth import get_user_model\nfrom django.test import TestCase\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.account.utils import user_email, user_username\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.discord.provider import DiscordProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass DiscordTests(OAuth2TestsMixin, TestCase):\n    provider_id = DiscordProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n            \"id\": \"80351110224678912\",\n            \"username\": \"nelly\",\n            \"discriminator\": \"0\",\n            \"global_name\": \"Nelly\",\n            \"avatar\": \"8342729096ea3675442027381ff50dfe\",\n            \"verified\": true,\n            \"email\": \"nelly@example.com\"\n        }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"Nelly\"\n\n    def test_display_name(self, multiple_login=False):\n        email = \"user@example.com\"\n        user = get_user_model()(is_active=True)\n        user_email(user, email)\n        user_username(user, \"user\")\n        user.set_password(\"test\")\n        user.save()\n        EmailAddress.objects.create(user=user, email=email, primary=True, verified=True)\n        self.client.login(username=user.username, password=\"test\")\n        self.login(self.get_mocked_response(), process=\"connect\")\n        if multiple_login:\n            self.login(\n                self.get_mocked_response(),\n                with_refresh_token=False,\n                process=\"connect\",\n            )\n\n        # get account\n        sa = SocialAccount.objects.filter(user=user, provider=self.provider.id).get()\n        # The following lines don't actually test that much, but at least\n        # we make sure that the code is hit.\n        provider_account = sa.get_provider_account()\n        self.assertEqual(provider_account.to_str(), \"Nelly\")\n\n\nclass OldDiscordTests(DiscordTests, TestCase):\n    provider_id = DiscordProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n            \"id\": \"80351110224678912\",\n            \"username\": \"Nelly\",\n            \"discriminator\": \"1337\",\n            \"avatar\": \"8342729096ea3675442027381ff50dfe\",\n            \"verified\": true,\n            \"email\": \"nelly@example.com\"\n        }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"Nelly#1337\"\n\n    def test_display_name(self, multiple_login=False):\n        email = \"user@example.com\"\n        user = get_user_model()(is_active=True)\n        user_email(user, email)\n        user_username(user, \"user\")\n        user.set_password(\"test\")\n        user.save()\n        EmailAddress.objects.create(user=user, email=email, primary=True, verified=True)\n        self.client.login(username=user.username, password=\"test\")\n        self.login(self.get_mocked_response(), process=\"connect\")\n        if multiple_login:\n            self.login(\n                self.get_mocked_response(),\n                with_refresh_token=False,\n                process=\"connect\",\n            )\n\n        # get account\n        sa = SocialAccount.objects.filter(user=user, provider=self.provider.id).get()\n        # The following lines don't actually test that much, but at least\n        # we make sure that the code is hit.\n        provider_account = sa.get_provider_account()\n        self.assertEqual(provider_account.to_str(), \"Nelly#1337\")\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/disqus/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/disqus/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.contrib.auth.models import User\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.disqus.provider import DisqusProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\n@override_settings(\n    SOCIALACCOUNT_AUTO_SIGNUP=True,\n    ACCOUNT_SIGNUP_FORM_CLASS=None,\n    ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.MANDATORY,\n)\nclass DisqusTests(OAuth2TestsMixin, TestCase):\n    provider_id = DisqusProvider.id\n\n    def get_mocked_response(\n        self, name=\"Raymond Penners\", email=\"raymond.penners@example.com\"\n    ):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n              {\"response\": {\"name\": \"%s\",\n               \"avatar\": {\n                \"permalink\": \"https://lh5.googleusercontent.com/photo.jpg\"\n               },\n               \"email\": \"%s\",\n               \"profileUrl\": \"https://plus.google.com/108204268033311374519\",\n               \"id\": \"108204268033311374519\" }}\n        \"\"\"\n            % (name, email),\n        )\n\n    def get_expected_to_str(self):\n        return \"raymond.penners@example.com\"\n\n    def test_account_connect(self):\n        email = \"user@example.com\"\n        user = User.objects.create(username=\"user\", is_active=True, email=email)\n        user.set_password(\"test\")\n        user.save()\n        EmailAddress.objects.create(user=user, email=email, primary=True, verified=True)\n        self.client.login(username=user.username, password=\"test\")\n        self.login(self.get_mocked_response(), process=\"connect\")\n        # Check if we connected...\n        self.assertTrue(\n            SocialAccount.objects.filter(user=user, provider=DisqusProvider.id).exists()\n        )\n        # For now, we do not pick up any new email addresses on connect\n        self.assertEqual(EmailAddress.objects.filter(user=user).count(), 1)\n        self.assertEqual(EmailAddress.objects.filter(user=user, email=email).count(), 1)\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/douban/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/douban/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.douban.provider import DoubanProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass DoubanTests(OAuth2TestsMixin, TestCase):\n    provider_id = DoubanProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n            {\"name\": \"guoqiao\",\n             \"created\": \"2009-02-18 01:07:52\",\n             \"is_suicide\": false,\n             \"alt\": \"http://www.douban.com/people/qguo/\",\n             \"avatar\": \"http://img3.douban.com/icon/u3659811-3.jpg\",\n             \"signature\": \"\",\n             \"uid\": \"qguo\",\n             \"is_banned\": false,\n             \"desc\": \"\\u4e0d\\u662f\\u5f88\\u7231\\u8bfb\\u4e66\",\n             \"type\": \"user\",\n             \"id\": \"3659811\",\n             \"large_avatar\": \"http://img3.douban.com/icon/up3659811-3.jpg\"}\n\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"guoqiao\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/doximity/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/doximity/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.doximity.provider import DoximityProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass DoximityTests(OAuth2TestsMixin, TestCase):\n    provider_id = DoximityProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n            \"id\": 41993552342,\n            \"npi\": 1952635229,\n            \"firstname\": \"John\",\n            \"middlename\": \"Henry\",\n            \"maiden_name\": null,\n            \"lastname\": \"Smith\",\n            \"full_name\": \"Ahmed S Belal, MD\",\n            \"gender\": \"M\",\n            \"city\": \"San Francisco\",\n            \"state\": \"CA\",\n            \"zip\": \"94107\",\n            \"phone\": \"(650) 200-3901\",\n            \"fax\": \"888-416-8572\",\n            \"email\": \"abelalmd@example.com\",\n            \"address_1\": \"500 3rd St.\",\n            \"address_2\": \"Suite 510\",\n            \"lat\": 42.3663926,\n            \"lon\": -71.051395,\n            \"additional_locations\": [{\n                \"address_1\": \"12 Main st\",\n                \"address_2\": null,\n                \"city\": \"Cambridge\",\n                \"state\": \"MA\",\n                \"phone\": \"555-555-5555\",\n                \"fax\": null,\n                \"zip\": \"02138\"\n            }],\n            \"credentials\": \"MD\",\n            \"verified\": true,\n            \"description\": \"Chief of Cardiology\",\n            \"medical_school\": \"UCSF School of Medicine\",\n            \"residencies\": [\"Stanford Medical Center\", \"Mt Sinai Hospital\"],\n            \"specialty\": \"Cardiology\",\n            \"specialty_details\": {\n                \"abbr\": \"Cards\",\n                \"code\": \"CA00\",\n                \"credential_id\": 4,\n                \"name\": \"Cardiology\",\n                \"id\": \"CA00\"\n            },\n            \"hospitals\": [{\n                \"name\": \"Mills-Peninsula Health Services\",\n                \"aha_id\": \"6930315\"\n            }],\n            \"subspecialties\": [\"General Cardiology\", \"Cardiac Disease\"],\n            \"profile_photo\": \"https://s3.amazonaws.com/doximity_prod_uploads\\\n/profile_photos/7969/normal/profile.png\",\n            \"colleague_count\": 142\n        }\n\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"abelalmd@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/draugiem/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/draugiem/tests.py",
    "content": "import time\nfrom hashlib import md5\nfrom unittest.mock import Mock, patch\n\nfrom django.contrib.auth.models import User\nfrom django.test import RequestFactory, TestCase\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nfrom allauth import app_settings\nfrom allauth.socialaccount.internal import statekit\nfrom allauth.socialaccount.models import SocialAccount, SocialApp, SocialToken\nfrom allauth.socialaccount.providers.draugiem import views\nfrom allauth.socialaccount.providers.draugiem.provider import DraugiemProvider\n\n\nclass DraugiemTests(TestCase):\n    def setUp(self):\n        # workaround to create a session. see:\n        # https://code.djangoproject.com/ticket/11475\n        User.objects.create_user(\n            \"anakin\", \"skywalker@deathstar.example.com\", \"s1thrul3s\"\n        )\n        self.client.login(username=\"anakin\", password=\"s1thrul3s\")\n\n        app = SocialApp.objects.create(\n            provider=DraugiemProvider.id,\n            name=DraugiemProvider.id,\n            client_id=\"app123id\",\n            key=DraugiemProvider.id,\n            secret=\"dummy\",\n        )\n        request = RequestFactory().get(\"/\")\n        self.provider = app.get_provider(request)\n        if app_settings.SITES_ENABLED:\n            from django.contrib.sites.models import Site\n\n            app.sites.add(Site.objects.get_current())\n        self.app = app\n\n    def get_draugiem_login_response(self):\n        \"\"\"\n        Sample Draugiem.lv response\n        \"\"\"\n        return {\n            \"apikey\": \"12345\",\n            \"uid\": \"42\",\n            \"users\": {\n                \"42\": {\n                    \"age\": \"266\",\n                    \"imgl\": \"http://cdn.memegenerator.net/instances/500x/23395689.jpg\",\n                    \"surname\": \"Skywalker\",\n                    \"url\": \"/user/42/\",\n                    \"imgi\": \"http://cdn.memegenerator.net/instances/500x/23395689.jpg\",\n                    \"nick\": \"Sky Guy\",\n                    \"created\": \"09.11.1812 11:26:15\",\n                    \"deleted\": \"false\",\n                    \"imgm\": \"http://cdn.memegenerator.net/instances/500x/23395689.jpg\",\n                    \"sex\": \"M\",\n                    \"type\": \"User_Default\",\n                    \"uid\": \"42\",\n                    \"place\": \"London\",\n                    \"emailHash\": \"3f198f21434gfd2f2b4rs05939shk93f3815bc6aa\",\n                    \"name\": \"Anakin\",\n                    \"adult\": \"1\",\n                    \"birthday\": \"1750-09-13\",\n                    \"img\": \"http://cdn.memegenerator.net/instances/500x/23395689.jpg\",\n                }\n            },\n        }\n\n    def get_socialaccount(self, response, token):\n        \"\"\"\n        Returns SocialLogin based on the data from the request\n        \"\"\"\n        request = Mock()\n        login = self.provider.sociallogin_from_response(request, response)\n        login.token = token\n        return login\n\n    def mock_socialaccount_state(self):\n        \"\"\"\n        SocialLogin depends on Session state - a tuple of request\n        params and a random string\n        \"\"\"\n        session = self.client.session\n        session[statekit.STATES_SESSION_KEY] = {\n            \"12345\": ({\"process\": \"login\", \"scope\": \"\", \"auth_params\": \"\"}, time.time())\n        }\n        session.save()\n\n    def test_login_redirect(self):\n        response = self.client.get(reverse(views.login))\n        redirect_url = reverse(views.callback)\n        full_redirect_url = f\"http://testserver{redirect_url}\"\n        secret = self.app.secret + full_redirect_url\n        redirect_url_hash = md5(secret.encode(\"utf-8\")).hexdigest()\n        params = {\n            \"app\": self.app.client_id,\n            \"hash\": redirect_url_hash,\n            \"redirect\": full_redirect_url,\n        }\n        self.assertRedirects(\n            response,\n            f\"{views.AUTHORIZE_URL}?{urlencode(params)}\",\n            fetch_redirect_response=False,\n        )\n\n    def test_callback_no_auth_status(self):\n        response = self.client.get(reverse(views.callback))\n        self.assertTemplateUsed(response, \"socialaccount/authentication_error.html\")\n\n    def test_callback_invalid_auth_status(self):\n        response = self.client.get(reverse(views.callback), {\"dr_auth_status\": \"fail\"})\n        self.assertTemplateUsed(response, \"socialaccount/authentication_error.html\")\n\n    def test_callback(self):\n        with patch(\n            \"allauth.socialaccount.providers.draugiem.views.draugiem_complete_login\"\n        ) as draugiem_complete_login:\n            self.mock_socialaccount_state()\n\n            response_json = self.get_draugiem_login_response()\n\n            token = SocialToken(app=self.app, token=response_json[\"apikey\"])\n            login = self.get_socialaccount(response_json, token)\n\n            draugiem_complete_login.return_value = login\n\n            response = self.client.get(\n                reverse(views.callback),\n                {\"dr_auth_status\": \"ok\", \"dr_auth_code\": \"42\"},\n            )\n            self.assertRedirects(\n                response, \"/accounts/profile/\", fetch_redirect_response=False\n            )\n            socialaccount = SocialAccount.objects.filter(\n                provider=DraugiemProvider.id\n            ).last()\n            pacc = socialaccount.get_provider_account()\n            assert (\n                pacc.get_avatar_url()\n                == \"http://cdn.memegenerator.net/instances/500x/23395689.jpg\"\n            )\n            assert pacc.to_str() == \"Anakin\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/drip/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/drip/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.drip.provider import DripProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass DripTests(OAuth2TestsMixin, TestCase):\n    provider_id = DripProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n            \"users\":[{\n                \"email\": \"john@acme.com\",\n                \"name\": \"John Doe\",\n                \"time_zone\": \"America/Los_Angeles\"\n            }]\n        }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"john@acme.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/dropbox/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/dropbox/tests.py",
    "content": "import json\nfrom http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.dropbox.provider import DropboxOAuth2Provider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass DropboxOAuth2Tests(OAuth2TestsMixin, TestCase):\n    provider_id = DropboxOAuth2Provider.id\n\n    def get_mocked_response(self):\n        payload = {\n            \"account_id\": \"dbid:ASDFasd3ASdfasdFAsd1AS2ASDF1aS-DfAs\",\n            \"account_type\": {\".tag\": \"basic\"},\n            \"country\": \"US\",\n            \"disabled\": False,\n            \"email\": \"allauth@example.com\",\n            \"email_verified\": True,\n            \"is_paired\": True,\n            \"locale\": \"en\",\n            \"name\": {\n                \"abbreviated_name\": \"AA\",\n                \"display_name\": \"All Auth\",\n                \"familiar_name\": \"All\",\n                \"given_name\": \"All\",\n                \"surname\": \"Auth\",\n            },\n            \"profile_photo_url\": (\n                \"https://dl-web.dropbox.com/account_photo\"\n                \"/get/dbid%ASDFasd3ASdfasdFAsd1AS2ASDF1aS\"\n                \"-DfAs?size=128x128\"\n            ),\n            \"referral_link\": \"https://db.tt/ASDfAsDf\",\n        }\n        return MockedResponse(HTTPStatus.OK, json.dumps(payload))\n\n    def get_expected_to_str(self):\n        return \"allauth@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/dummy/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/dummy/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.conf import settings\nfrom django.contrib.auth import get_user_model\nfrom django.urls import reverse\n\nfrom allauth.socialaccount.models import SocialAccount\n\n\ndef test_login(client, db):\n    resp = client.post(reverse(\"dummy_login\"))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"].startswith(f\"{reverse('dummy_authenticate')}?state=\")\n    resp = client.post(\n        resp[\"location\"],\n        {\"id\": \"123\", \"email\": \"a@b.com\", \"email_verified\": True},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n    get_user_model().objects.filter(email=\"a@b.com\").exists()\n    socialaccount = SocialAccount.objects.get(uid=\"123\")\n    account = socialaccount.get_provider_account()\n    assert account.to_str() == \"a@b.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/dwolla/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/dwolla/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.dwolla.provider import DwollaProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass DwollaTests(OAuth2TestsMixin, TestCase):\n    provider_id = DwollaProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n            \"id\": \"123\",\n            \"_links\":{\"account\":{\"href\":\"http://localhost\"}},\n            \"name\":\"John Doe\"\n        }\"\"\",\n        )\n\n    def get_login_response_json(self, with_refresh_token=True):\n        rt = \"\"\n        if with_refresh_token:\n            rt = ',\"refresh_token\": \"testrf\"'\n        return (\n            \"\"\"{\n            \"uid\":\"weibo\",\n            \"access_token\":\"testac\",\n            \"_links\":{\"account\":{\"href\":\"http://localhost\"}}\n            %s }\"\"\"\n            % rt\n        )\n\n    def get_expected_to_str(self):\n        return \"John Doe\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/edmodo/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/edmodo/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.edmodo.provider import EdmodoProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass EdmodoTests(OAuth2TestsMixin, TestCase):\n    provider_id = EdmodoProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\n  \"url\": \"https://api.edmodo.com/users/74721257\",\n  \"id\": 74721257,\n  \"type\": \"teacher\",\n  \"username\": \"getacclaim-teacher1\",\n  \"user_title\": null,\n  \"first_name\": \"Edmodo Test\",\n  \"last_name\": \"Teacher\",\n  \"time_zone\": \"America/New_York\",\n  \"utc_offset\": -18000,\n  \"locale\": \"en\",\n  \"gender\": null,\n  \"start_level\": null,\n  \"end_level\": null,\n  \"about\": null,\n  \"premium\": false,\n  \"school\": {\"url\": \"https://api.edmodo.com/schools/559253\", \"id\": 559253},\n  \"verified_institution_member\": true,\n  \"coppa_verified\": false,\n  \"subjects\": null,\n  \"avatars\": {\n    \"small\":\n    \"https://api.edmodo.com/users/74721257/avatar?type=small&u=670329ncqnf8fxv7tya24byn5\",\n    \"large\":\n    \"https://api.edmodo.com/users/74721257/avatar?type=large&u=670329ncqnf8fxv7tya24byn5\"\n  },\n  \"email\":\"test@example.com\",\n  \"sync_enabled\": false\n}\n\"\"\",\n        )  # noqa\n\n    def get_expected_to_str(self):\n        return \"getacclaim-teacher1\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/edx/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/edx/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.edx.provider import EdxProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass EdxTests(OAuth2TestsMixin, TestCase):\n    provider_id = EdxProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n\"username\":\"krzysztof\",\n\"bio\":null,\n\"requires_parental_consent\":true,\n\"language_proficiencies\":[\n\n],\n\"name\":\"Krzysztof Hoffmann\",\n\"country\":null,\n\"social_links\":[\n\n],\n\"is_active\":true,\n\"profile_image\":{\n  \"image_url_small\":\"http://draft.navoica.pl/static/images/profiles/default_30.png\",\n  \"image_url_full\":\"http://draft.navoica.pl/static/images/profiles/default_500.png\",\n  \"image_url_large\":\"http://draft.navoica.pl/static/images/profiles/default_120.png\",\n  \"image_url_medium\":\"http://draft.navoica.pl/static/images/profiles/default_50.png\",\n  \"has_image\":false\n},\n\"extended_profile\":[\n\n],\n\"year_of_birth\":null,\n\"level_of_education\":null,\n\"goals\":\"\",\n\"accomplishments_shared\":false,\n\"gender\":null,\n\"date_joined\":\"2019-09-21T07:48:31Z\",\n\"mailing_address\":\"\",\n\"email\":\"krzysztof.hoffmann@opi.org.pl\",\n\"account_privacy\":\"private\"\n}\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"krzysztof\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/eventbrite/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/eventbrite/tests.py",
    "content": "\"\"\"Test Eventbrite OAuth2 v3 Flow.\"\"\"\n\nfrom http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.eventbrite.provider import EventbriteProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass EventbriteTests(OAuth2TestsMixin, TestCase):\n    \"\"\"Test Class for Eventbrite OAuth2 v3.\"\"\"\n\n    provider_id = EventbriteProvider.id\n\n    def get_mocked_response(self):\n        \"\"\"Test authentication with an non-null image_id\"\"\"\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n            \"emails\": [{\n                \"email\": \"test@example.com\",\n                \"verified\": true\n            }],\n            \"id\": \"999999999\",\n            \"name\": \"Andrew Godwin\",\n            \"first_name\": \"Andrew\",\n            \"last_name\": \"Godwin\",\n            \"image_id\": \"99999999\"\n        }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"test@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/eveonline/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/eveonline/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.eveonline.provider import EveOnlineProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass EveOnlineTests(OAuth2TestsMixin, TestCase):\n    provider_id = EveOnlineProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n            \"CharacterID\": 273042051,\n            \"CharacterName\": \"CCP illurkall\",\n            \"ExpiresOn\": \"2014-05-23T15:01:15.182864Z\",\n            \"Scopes\": \" \",\n            \"TokenType\": \"Character\",\n            \"CharacterOwnerHash\": \"XM4D...FoY=\"\n        }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"CCP illurkall\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/evernote/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/evernote/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.evernote.provider import EvernoteProvider\nfrom tests.apps.socialaccount.base import OAuthTestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass EvernoteTests(OAuthTestsMixin, TestCase):\n    provider_id = EvernoteProvider.id\n\n    def get_mocked_response(self):\n        return []\n\n    def get_expected_to_str(self):\n        return \"Evernote\"\n\n    def get_access_token_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"oauth_token=S%3Ds1%3AU%3D9876%3AE%3D999999b0c50%3AC%3D14c1f89dd18%3AP%3D81%3AA%3Dpennersr%3AV%3D2%3AH%3Ddeadf00dd2d6aba7b519923987b4bf77&oauth_token_secret=&edam_shard=s1&edam_userId=591969&edam_expires=1457994271824&edam_noteStoreUrl=https%3A%2F%2Fsandbox.evernote.com%2Fshard%2Fs1%2Fnotestore&edam_webApiUrlPrefix=https%3A%2F%2Fsandbox.evernote.com%2Fshard%2Fs1%2F\",  # noqa\n            {\"content-type\": \"text/plain\"},\n        )\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/exist/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/exist/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.exist.provider import ExistProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass ExistTests(OAuth2TestsMixin, TestCase):\n    provider_id = ExistProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n            {\n                \"id\": 1,\n                \"username\": \"josh\",\n                \"first_name\": \"Josh\",\n                \"last_name\": \"Sharp\",\n                \"bio\": \"I made this thing you're using.\",\n                \"url\": \"http://hellocode.co/\",\n                \"avatar\": \"https://exist.io/static/media/avatars/josh_2.png\",\n                \"timezone\": \"Australia/Melbourne\",\n                \"local_time\": \"2020-07-31T22:33:49.359+10:00\",\n                \"private\": false,\n                \"imperial_units\": false,\n                \"imperial_distance\": false,\n                \"imperial_weight\": false,\n                \"imperial_energy\": false,\n                \"imperial_liquid\": false,\n                \"imperial_temperature\": false,\n                \"attributes\": []\n            }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"josh\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/facebook/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/facebook/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.contrib.auth import get_user_model\nfrom django.test import TestCase\nfrom django.test.client import RequestFactory\nfrom django.test.utils import override_settings\nfrom django.urls import reverse\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.facebook.provider import FacebookProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse, mocked_response\n\n\n@override_settings(\n    SOCIALACCOUNT_AUTO_SIGNUP=True,\n    ACCOUNT_SIGNUP_FORM_CLASS=None,\n    LOGIN_REDIRECT_URL=\"/accounts/profile/\",\n    ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.NONE,\n    SOCIALACCOUNT_PROVIDERS={\"facebook\": {\"AUTH_PARAMS\": {}, \"VERIFIED_EMAIL\": False}},\n)\nclass FacebookTests(OAuth2TestsMixin, TestCase):\n    provider_id = FacebookProvider.id\n\n    facebook_data = \"\"\"\n        {\n           \"id\": \"630595557\",\n           \"name\": \"Raymond Penners\",\n           \"first_name\": \"Raymond\",\n           \"last_name\": \"Penners\",\n           \"email\": \"raymond.penners@example.com\",\n           \"link\": \"https://www.facebook.com/raymond.penners\",\n           \"username\": \"raymond.penners\",\n           \"birthday\": \"07/17/1973\",\n           \"work\": [\n              {\n                 \"employer\": {\n                    \"id\": \"204953799537777\",\n                    \"name\": \"IntenCT\"\n                 }\n              }\n           ],\n           \"timezone\": 1,\n           \"locale\": \"nl_NL\",\n           \"verified\": true,\n           \"updated_time\": \"2012-11-30T20:40:33+0000\"\n        }\"\"\"\n\n    def get_mocked_response(self, data=None):\n        if data is None:\n            data = self.facebook_data\n        return MockedResponse(HTTPStatus.OK, data)\n\n    def get_expected_to_str(self):\n        return \"raymond.penners\"\n\n    def test_username_conflict(self):\n        User = get_user_model()\n        User.objects.create(username=\"raymond.penners\")\n        self.login(self.get_mocked_response())\n        socialaccount = SocialAccount.objects.get(uid=\"630595557\")\n        self.assertEqual(socialaccount.user.username, \"raymond\")\n\n    def test_username_based_on_provider(self):\n        self.login(self.get_mocked_response())\n        socialaccount = SocialAccount.objects.get(uid=\"630595557\")\n        self.assertEqual(socialaccount.user.username, \"raymond.penners\")\n\n    def test_username_based_on_provider_with_simple_name(self):\n        data = '{\"id\": \"1234567\", \"name\": \"Harvey McGillicuddy\"}'\n        self.login(self.get_mocked_response(data=data))\n        socialaccount = SocialAccount.objects.get(uid=\"1234567\")\n        self.assertEqual(socialaccount.user.username, \"harvey\")\n\n    @override_settings(\n        SOCIALACCOUNT_PROVIDERS={\n            \"facebook\": {\n                \"METHOD\": \"js_sdk\",\n            }\n        },\n    )\n    def test_media_js(self):\n        request = RequestFactory().get(reverse(\"account_login\"))\n        request.session = {}\n        script = self.provider.media_js(request)\n        self.assertTrue('\"appId\": \"app123id\"' in script)\n\n    def test_token_auth(self):\n        with mocked_response(\n            {\"access_token\": \"app_token\"},\n            {\n                \"data\": {\n                    \"app_id\": \"app123id\",\n                    \"is_valid\": True,\n                }\n            },\n            self.get_mocked_response(),\n        ):\n            login = self.provider.verify_token(None, {\"access_token\": \"dummy\"})\n            assert login.user.email == \"raymond.penners@example.com\"\n            assert login.token.token == \"dummy\"\n\n    def test_login_by_token(self):\n        resp = self.client.get(reverse(\"account_login\"))\n        with mocked_response(\n            {\"access_token\": \"app_token\"},\n            {\n                \"data\": {\n                    \"app_id\": \"app123id\",\n                    \"is_valid\": True,\n                }\n            },\n            self.get_mocked_response(),\n        ):\n            resp = self.client.post(\n                reverse(\"facebook_login_by_token\"),\n                data={\"access_token\": \"dummy\"},\n            )\n            self.assertRedirects(\n                resp, \"/accounts/profile/\", fetch_redirect_response=False\n            )\n\n    @override_settings(\n        SOCIALACCOUNT_PROVIDERS={\n            \"facebook\": {\n                \"METHOD\": \"js_sdk\",\n                \"AUTH_PARAMS\": {\"auth_type\": \"reauthenticate\"},\n                \"VERIFIED_EMAIL\": False,\n            }\n        }\n    )\n    def test_login_by_token_reauthenticate(self):\n        resp = self.client.get(reverse(\"account_login\"))\n        nonce = resp.context[\"fb_data\"][\"loginOptions\"][\"auth_nonce\"]\n        with mocked_response(\n            {\"access_token\": \"app_token\"},\n            {\n                \"data\": {\n                    \"app_id\": \"app123id\",\n                    \"is_valid\": True,\n                }\n            },\n            {\"auth_nonce\": nonce},\n            self.get_mocked_response(),\n        ):\n            resp = self.client.post(\n                reverse(\"facebook_login_by_token\"),\n                data={\"access_token\": \"dummy\"},\n            )\n            self.assertRedirects(\n                resp, \"/accounts/profile/\", fetch_redirect_response=False\n            )\n\n    @override_settings(SOCIALACCOUNT_PROVIDERS={\"facebook\": {\"VERIFIED_EMAIL\": True}})\n    def test_login_verified(self):\n        emailaddress = self._login_verified()\n        self.assertTrue(emailaddress.verified)\n\n    def test_login_unverified(self):\n        emailaddress = self._login_verified()\n        self.assertFalse(emailaddress.verified)\n\n    def _login_verified(self):\n        self.login(self.get_mocked_response())\n        return EmailAddress.objects.get(email=\"raymond.penners@example.com\")\n\n\ndef test_limited_token(rf, db, settings, jwt_decode_bypass):\n    settings.SOCIALACCOUNT_PROVIDERS = {\n        \"facebook\": {\n            \"AUTH_PARAMS\": {},\n            \"VERIFIED_EMAIL\": False,\n            \"APPS\": [{\"client_id\": \"123\"}],\n        }\n    }\n    request = rf.get(\"/\")\n    adapter = get_adapter(request)\n    provider = adapter.get_provider(request, FacebookProvider.id)\n    token = {\"id_token\": \"X\"}\n    with jwt_decode_bypass(\n        {\n            \"sub\": \"f123\",\n            \"email\": \"e@mail.org\",\n            \"given_name\": \"John\",\n            \"family_name\": \"Doe\",\n        }\n    ):\n        login = provider.verify_token(request, token)\n        assert login.account.uid == \"f123\"\n        assert login.email_addresses[0].email == \"e@mail.org\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/feedly/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/feedly/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.feedly.provider import FeedlyProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass FeedlyTests(OAuth2TestsMixin, TestCase):\n    provider_id = FeedlyProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\n  \"id\": \"c805fcbf-3acf-4302-a97e-d82f9d7c897f\",\n  \"email\": \"jim.smith@example.com\",\n  \"givenName\": \"Jim\",\n  \"familyName\": \"Smith\",\n  \"picture\": \"https://www.google.com/profile_images/1771656873/bigger.jpg\",\n  \"gender\": \"male\",\n  \"locale\": \"en\",\n  \"reader\": \"9080770707070700\",\n  \"google\": \"115562565652656565656\",\n  \"twitter\": \"jimsmith\",\n  \"facebook\": \"\",\n  \"wave\": \"2013.7\"\n}\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"jim.smith@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/feishu/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/feishu/tests.py",
    "content": "from django.test import TestCase\n\nfrom allauth.socialaccount.providers.feishu.provider import FeishuProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass FeishuTests(OAuth2TestsMixin, TestCase):\n    provider_id = FeishuProvider.id\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(\n                0,\n                \"\"\"\n                {\"data\": {\"access_token\": \"testac\"}}\n                \"\"\",\n            ),\n            MockedResponse(\n                0,\n                \"\"\"\n                {\n                    \"code\": 0,\n                    \"data\": {\n                        \"access_token\": \"u-6U1SbDiM6XIH2DcTCPyeub\",\n                        \"avatar_url\": \"www.feishu.cn/avatar/icon\",\n                        \"avatar_thumb\": \"www.feishu.cn/avatar/icon_thumb\",\n                        \"avatar_middle\": \"www.feishu.cn/avatar/icon_middle\",\n                        \"avatar_big\": \"www.feishu.cn/avatar/icon_big\",\n                        \"expires_in\": 7140,\n                        \"name\": \"zhangsan\",\n                        \"en_name\": \"Three Zhang\",\n                        \"open_id\": \"ou-caecc734c2e3328a62489fe0648c4b98779515d3\",\n                        \"tenant_key\": \"736588c92lxf175d\",\n                        \"refresh_expires_in\": 2591940,\n                        \"refresh_token\": \"ur-t9HHgRCjMqGqIU9v05Zhos\",\n                        \"token_type\": \"Bearer\"\n                    }\n                }\n                \"\"\",\n            ),\n        ]\n\n    def get_expected_to_str(self):\n        return \"zhangsan\"\n\n    def get_login_response_json(self, with_refresh_token=True):\n        return \"\"\"{\"app_access_token\":\"testac\"}\"\"\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/figma/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/figma/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.figma.provider import FigmaProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass FigmaTests(OAuth2TestsMixin, TestCase):\n    provider_id = FigmaProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n                {\n                  \"id\": \"2600\",\n                  \"email\": \"johndoe@example.com\",\n                  \"handle\": \"John Doe\",\n                  \"img_url\": \"https://www.example.com/image.png\"\n                }\n            \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"John Doe\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/fivehundredpx/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/fivehundredpx/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.fivehundredpx.provider import FiveHundredPxProvider\nfrom tests.apps.socialaccount.base import OAuthTestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass FiveHundredPxTests(OAuthTestsMixin, TestCase):\n    provider_id = FiveHundredPxProvider.id\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"{\n          \"user\":  {\n            \"id\": 5751454,\n            \"username\": \"testuser\",\n            \"firstname\": \"Test\",\n            \"lastname\": \"User\",\n            \"birthday\": null,\n            \"sex\": 0,\n            \"city\": \"San Francisco\",\n            \"state\": \"California\",\n            \"country\": \"United States\",\n            \"registration_date\": \"2015-12-12T03:20:31-05:00\",\n            \"about\": \"About me.\",\n            \"usertype\": 0,\n            \"fotomoto_on\": true,\n            \"locale\": \"en\",\n            \"show_nude\": false,\n            \"allow_sale_requests\": 1,\n            \"fullname\": \"Test User\",\n            \"userpic_url\": \"https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1\",\n            \"userpic_https_url\": \"https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1\",\n            \"cover_url\": \"https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/cover_2048.jpg?7\",\n            \"upgrade_status\": 2,\n            \"store_on\": true,\n            \"photos_count\": 68,\n            \"galleries_count\": 2,\n            \"affection\": 1888,\n            \"in_favorites_count\": 340,\n             \"friends_count\": 181,\n            \"followers_count\": 150,\n            \"analytics_code\": null,\n             \"invite_pending\": false,\n            \"invite_accepted\": false,\n            \"email\": \"test@example.com\",\n            \"shadow_email\": \"test@example.com\",\n            \"upload_limit\": null,\n            \"upload_limit_expiry\": \"2016-12-01T13:33:55-05:00\",\n            \"upgrade_type\": 2,\n            \"upgrade_status_expiry\": \"2017-05-27\",\n            \"auth\":  {\n              \"facebook\": 0,\n              \"twitter\": 0,\n              \"google_oauth2\": 0\n            },\n            \"presubmit_for_licensing\": null,\n            \"avatars\":  {\n              \"default\":  {\n                \"http\": \"https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1\",\n                \"https\": \"https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1\"\n              },\n              \"large\":  {\n                \"http\": \"https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/2.jpg?1\",\n                \"https\": \"https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/2.jpg?1\"\n              },\n              \"small\":  {\n                \"http\": \"https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1\",\n                \"https\": \"https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/1.jpg?1\"\n              },\n              \"tiny\":  {\n                \"http\": \"https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/4.jpg?1\",\n                \"https\": \"https://pacdn.500px.org/10599609/8e20991262c468a866918dcbe2f7e9a30e2c2c9c/4.jpg?1\"\n              }\n            }\n          }\n        }\"\"\",\n            )\n        ]  # noqa\n\n    def get_expected_to_str(self):\n        return \"testuser\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/flickr/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/flickr/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.flickr.provider import FlickrProvider\nfrom tests.apps.socialaccount.base import OAuthTestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass FlickrTests(OAuthTestsMixin, TestCase):\n    provider_id = FlickrProvider.id\n\n    def get_mocked_response(self):\n        #\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                r\"\"\"\n {\"stat\": \"ok\",\n  \"user\": {\n    \"username\": {\n    \"_content\": \"pennersr\"},\n    \"id\": \"12345678@N00\"}}\n\"\"\",\n            ),  # noqa\n            MockedResponse(\n                HTTPStatus.OK,\n                r\"\"\"\n{\"person\": {\"username\": {\"_content\": \"pennersr\"}, \"photosurl\": {\"_content\":\n \"http://www.flickr.com/photos/12345678@N00/\"},\n \"nsid\": \"12345678@N00\",\n \"path_alias\": null, \"photos\": {\"count\": {\"_content\": 0},\n \"firstdatetaken\": {\"_content\": null}, \"views\": {\"_content\": \"28\"},\n \"firstdate\": {\"_content\": null}}, \"iconserver\": \"0\",\n \"description\": {\"_content\": \"\"}, \"mobileurl\": {\"_content\":\n \"http://m.flickr.com/photostream.gne?id=6294613\"},\n \"profileurl\": {\n \"_content\": \"http://www.flickr.com/people/12345678@N00/\"},\n \"mbox_sha1sum\": {\"_content\":\n \"5e5b359c123e54f95236209c8808d607a5cdd21e\"},\n \"ispro\": 0, \"location\": {\"_content\": \"\"},\n \"id\": \"12345678@N00\",\n \"realname\": {\"_content\": \"raymond penners\"},\n \"iconfarm\": 0}, \"stat\": \"ok\"}\n\"\"\",\n            ),\n        ]  # noqa\n\n    def get_expected_to_str(self):\n        return \"pennersr\"\n\n    def test_login(self):\n        super().test_login()\n        account = SocialAccount.objects.get(uid=\"12345678@N00\")\n        f_account = account.get_provider_account()\n        self.assertEqual(account.user.first_name, \"raymond\")\n        self.assertEqual(account.user.last_name, \"penners\")\n        self.assertEqual(\n            f_account.get_profile_url(),\n            \"http://www.flickr.com/people/12345678@N00/\",\n        )\n        self.assertEqual(f_account.to_str(), \"pennersr\")\n\n\nclass FlickrWithoutRealNameTests(OAuthTestsMixin, TestCase):\n    \"\"\"Separate test for Flickr accounts without real names\"\"\"\n\n    provider_id = FlickrProvider.id\n\n    def get_mocked_response(self):\n        #\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                r\"\"\"\n {\"stat\": \"ok\",\n  \"user\": {\n    \"username\": {\n    \"_content\": \"pennersr\"},\n    \"id\": \"12345678@N00\"}}\n\"\"\",\n            ),  # noqa\n            MockedResponse(\n                HTTPStatus.OK,\n                r\"\"\"\n{\"person\": {\"username\": {\"_content\": \"pennersr\"}, \"photosurl\": {\"_content\":\n \"http://www.flickr.com/photos/12345678@N00/\"},\n \"nsid\": \"12345678@N00\",\n \"path_alias\": null, \"photos\": {\"count\": {\"_content\": 0},\n \"firstdatetaken\": {\"_content\": null}, \"views\": {\"_content\": \"28\"},\n \"firstdate\": {\"_content\": null}}, \"iconserver\": \"0\",\n \"description\": {\"_content\": \"\"}, \"mobileurl\": {\"_content\":\n \"http://m.flickr.com/photostream.gne?id=6294613\"},\n \"profileurl\": {\n \"_content\": \"http://www.flickr.com/people/12345678@N00/\"},\n \"mbox_sha1sum\": {\"_content\":\n \"5e5b359c123e54f95236209c8808d607a5cdd21e\"},\n \"ispro\": 0, \"location\": {\"_content\": \"\"},\n \"id\": \"12345678@N00\",\n \"realname\": {\"_content\": \"\"},\n \"iconfarm\": 0}, \"stat\": \"ok\"}\n\"\"\",\n            ),\n        ]  # noqa\n\n    def get_expected_to_str(self):\n        return \"pennersr\"\n\n    def test_login(self):\n        super().test_login()\n        account = SocialAccount.objects.get(uid=\"12345678@N00\")\n        f_account = account.get_provider_account()\n        self.assertEqual(account.user.first_name, \"\")\n        self.assertEqual(account.user.last_name, \"\")\n        self.assertEqual(\n            f_account.get_profile_url(),\n            \"http://www.flickr.com/people/12345678@N00/\",\n        )\n        self.assertEqual(f_account.to_str(), \"pennersr\")\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/foursquare/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/foursquare/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.foursquare.provider import FoursquareProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass FoursquareTests(OAuth2TestsMixin, TestCase):\n    provider_id = FoursquareProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\"notifications\": [{\"item\": {\"unreadCount\": 0}, \"type\": \"notificationTray\"}],\n                                \"meta\": {\"code\": 200},\n \"response\": {\n \"user\": {\n   \"photo\": {\n     \"prefix\": \"https://irs0.4sqi.net/img/user/\", \"suffix\": \"/blank_boy.png\"},\n   \"pings\": false,\n   \"homeCity\": \"Athens, ESYE31\",\n   \"id\": \"76077726\",\n   \"badges\": {\"count\": 0, \"items\": []},\n   \"referralId\": \"u-76077726\",\n   \"friends\":\n   {\n       \"count\": 0,\n       \"groups\": [{\"count\": 0, \"items\": [], \"type\": \"friends\",\n\"name\": \"Mutual friends\"}, {\"count\": 0, \"items\": [], \"type\": \"others\",\n\"name\": \"Other friends\"}]\n   },\n   \"createdAt\": 1389624445,\n   \"tips\": {\"count\": 0},\n   \"type\": \"user\",\n   \"bio\": \"\",\n   \"relationship\": \"self\",\n   \"lists\":\n   {\n       \"count\": 1,\n       \"groups\": [{\"count\": 1, \"items\": [{\"description\": \"\",\n\"collaborative\": false, \"url\": \"/user/76077726/list/todos\", \"editable\": false,\n\"listItems\": {\"count\": 0}, \"id\": \"76077726/todos\", \"followers\": {\"count\": 0},\n\"user\": {\"gender\": \"male\",\n\"firstName\": \"\\u03a1\\u03c9\\u03bc\\u03b1\\u03bd\\u03cc\\u03c2\",\n\"relationship\": \"self\", \"photo\": {\"prefix\": \"https://irs0.4sqi.net/img/user/\",\n\"suffix\": \"/blank_boy.png\"},\n\"lastName\": \"\\u03a4\\u03c3\\u03bf\\u03c5\\u03c1\\u03bf\\u03c0\\u03bb\\u03ae\\u03c2\",\n\"id\": \"76077726\"}, \"public\": false,\n\"canonicalUrl\": \"https://foursquare.com/user/76077726/list/todos\",\n\"name\": \"My to-do list\"}], \"type\": \"created\"}, {\"count\": 0, \"items\": [],\n\"type\": \"followed\"}]\n   },\n   \"photos\": {\"count\": 0, \"items\": []},\n   \"checkinPings\": \"off\",\n   \"scores\": {\"max\": 0, \"checkinsCount\": 0, \"goal\": 50, \"recent\": 0},\n   \"checkins\": {\"count\": 0, \"items\": []},\n   \"firstName\": \"\\u03a1\\u03c9\\u03bc\\u03b1\\u03bd\\u03cc\\u03c2\",\n   \"gender\": \"male\",\n   \"contact\": {\"email\": \"romdimtsouroplis@example.com\"},\n   \"lastName\": \"\\u03a4\\u03c3\\u03bf\\u03c5\\u03c1\\u03bf\\u03c0\\u03bb\\u03ae\\u03c2\",\n   \"following\": {\"count\": 0, \"groups\": [{\"count\": 0, \"items\": [],\n\"type\": \"following\", \"name\": \"Mutual following\"}, {\"count\": 0, \"items\": [],\n\"type\": \"others\", \"name\": \"Other following\"}]},\n   \"requests\": {\"count\": 0}, \"mayorships\": {\"count\": 0, \"items\": []}}\n                                    }\n                                 }\n\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"romdimtsouroplis@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/frontier/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/frontier/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.frontier.provider import FrontierProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass FrontierTests(OAuth2TestsMixin, TestCase):\n    provider_id = FrontierProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n            \"email\": \"johndoe@example.com\",\n            \"customer_id\": \"1234567\",\n            \"firstname\": \"John\",\n            \"developer\": false,\n            \"lastname\": \"Doe\",\n            \"allowedDownloads\": [\"FORC-FDEV-D-1010\", \"FORC-FDEV-D-1012\", \"COMBAT_TUTORIAL_DEMO\", \"FORC-FDEV-D-1013\", \"PUBLIC_TEST_SERVER\", \"FORC_FDEV_V_ADDER_LRPO\", \"FORC_FDEV_V_CHALLENGER_LRPO\", \"FORC_FDEV_V_CHIEFTAIN_LRPO\", \"FORC_FDEV_V_CRUSADER_LRPO\", \"FORC_FDEV_V_ANACONDA_LRPO\", \"FORC_FDEV_V_ASP_LRPO\", \"FORC_FDEV_V_ASP_SCOUT_LRPO\", \"FORC_FDEV_V_BELUGA_LRPO\", \"FORC_FDEV_V_COBRA_MKIII_LRPO\", \"FORC_FDEV_V_DIAMOND_EXPLORER_LRPO\", \"FORC_FDEV_V_COBRA_MKIV_LRPO\", \"FORC_FDEV_V_DIAMOND_SCOUT_LRPO\", \"FORC_FDEV_V_DOLPHIN_LRPO\", \"FORC_FDEV_V_EAGLE_LRPO\", \"FORC_FDEV_V_FEDERAL_ASSAULT_LRPO\", \"FORC_FDEV_V_FEDERAL_CORVETTE_LRPO\", \"FORC_FDEV_V_FEDDROP_LRPO\", \"FORC_FDEV_V_FEDERAL_FIGHTER_LRPO\", \"FORC_FDEV_V_FEDERAL_GUNSHIP_LRPO\", \"FORC_FDEV_V_FERDELANCE_LRPO\", \"FORC_FDEV_V_HAULER_LRPO\", \"FORC_FDEV_V_CLIPPER_LRPO\", \"FORC_FDEV_V_IMPERIAL_COURIER_LRPO\", \"FORC_FDEV_V_IMPERIAL_CUTTER_LRPO\", \"FORC_FDEV_V_IMPERIAL_EAGLE_LRPO\", \"FORC_FDEV_V_IMPERIAL_FIGHTER_LRPO\", \"FORC_FDEV_V_KEELBACK_LRPO\", \"FORC_FDEV_V_KRAIT_LRPO\", \"FORC_FDEV_V_KRAIT_LITE_LRPO\", \"FORC_FDEV_V_MAMBA_LRPO\", \"FORC_FDEV_V_ORCA_LRPO\", \"FORC_FDEV_V_PYTHON_LRPO\", \"FORC_FDEV_V_SIDEWINDER_LRPO\", \"FORC_FDEV_V_TAIPAN_LRPO\", \"FORC_FDEV_V_MAMMOTH_LRPO\", \"FORC_FDEV_V_TYPE6_LRPO\", \"FORC_FDEV_V_TYPE7_LRPO\", \"FORC_FDEV_V_TYPE9_LRPO\", \"FORC_FDEV_V_VIPER_MKIII_LRPO\", \"FORC_FDEV_V_VIPER_MKIV_LRPO\", \"FORC_FDEV_V_VULTURE_LRPO\", \"FORC-FDEV-D-1022\", \"FORC_FDEV_V_DECAL_1091\", \"FORC_FDEV_V_DECAL_1100\", \"FORC_FDEV_V_DECAL_1149\", \"FORC_FDEV_V_DECAL_1150\", \"FORC_FDEV_V_DECAL_1151\", \"FORC_FDEV_V_DECAL_1176\", \"FORC_FDEV_V_DECAL_1177\", \"FORC-FDEV-DO-1000\", \"FORC-FDEV-DO-1003\", \"FORC-FDEV-DO-1006\", \"PUBLIC_TEST_SERVER_OD\"],\n            \"platform\": \"frontier\"\n        }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"johndoe@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/fxa/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/fxa/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.fxa.provider import FirefoxAccountsProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass FirefoxAccountsTests(OAuth2TestsMixin, TestCase):\n    provider_id = FirefoxAccountsProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n            \"uid\":\"6d940dd41e636cc156074109b8092f96\",\n            \"email\":\"user@example.com\"\n        }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"user@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/gitea/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/gitea/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.gitea.provider import GiteaProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass GiteaTests(OAuth2TestsMixin, TestCase):\n    provider_id = GiteaProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n            {\n                \"id\": 4940,\n                \"login\": \"giteauser\",\n                \"full_name\": \"\",\n                \"email\": \"giteauser@example.com\",\n                \"avatar_url\": \"https://gitea.com/user/avatar/giteauser/-1\",\n                \"language\": \"en-US\",\n                \"is_admin\": true,\n                \"last_login\": \"2021-08-20T20:07:39Z\",\n                \"created\": \"2018-05-03T16:04:34Z\",\n                \"restricted\": false,\n                \"active\": true,\n                \"prohibit_login\": false,\n                \"location\": \"\",\n                \"website\": \"\",\n                \"description\": \"\",\n                \"visibility\": \"public\",\n                \"followers_count\": 0,\n                \"following_count\": 0,\n                \"starred_repos_count\": 0,\n                \"username\": \"giteauser\"\n            }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"giteauser\"\n\n    def test_account_name_null(self):\n        \"\"\"String conversion when Gitea responds with empty username\"\"\"\n        data = \"\"\"{\n            \"id\": 4940,\n            \"login\": \"giteauser\",\n            \"username\": null\n        }\"\"\"\n        self.login(MockedResponse(HTTPStatus.OK, data))\n        socialaccount = SocialAccount.objects.get(uid=\"4940\")\n        self.assertIsNone(socialaccount.extra_data.get(\"name\"))\n        account = socialaccount.get_provider_account()\n        self.assertIsNotNone(account.to_str())\n        self.assertEqual(account.to_str(), \"giteauser\")\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/github/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/github/tests.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import patch\n\nfrom django.test import TestCase\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.github.provider import GitHubProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass GitHubTests(OAuth2TestsMixin, TestCase):\n    provider_id = GitHubProvider.id\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"\n        {\n            \"type\":\"User\",\n            \"organizations_url\":\"https://api.github.com/users/pennersr/orgs\",\n            \"gists_url\":\"https://api.github.com/users/pennersr/gists{/gist_id}\",\n            \"received_events_url\":\"https://api.github.com/users/pennersr/received_events\",\n            \"gravatar_id\":\"8639768262b8484f6a3380f8db2efa5b\",\n            \"followers\":16,\n            \"blog\":\"http://www.intenct.info\",\n            \"avatar_url\":\"https://secure.gravatar.com/avatar/8639768262b8484f6a3380f8db2efa5b?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png\",\n            \"login\":\"pennersr\",\n            \"created_at\":\"2010-02-10T12:50:51Z\",\n            \"company\":\"IntenCT\",\n            \"subscriptions_url\":\"https://api.github.com/users/pennersr/subscriptions\",\n            \"public_repos\":14,\n            \"hireable\":false,\n            \"url\":\"https://api.github.com/users/pennersr\",\n            \"public_gists\":0,\n            \"starred_url\":\"https://api.github.com/users/pennersr/starred{/owner}{/repo}\",\n            \"html_url\":\"https://github.com/pennersr\",\n            \"location\":\"The Netherlands\",\n            \"bio\":null,\n            \"name\":\"Raymond Penners\",\n            \"repos_url\":\"https://api.github.com/users/pennersr/repos\",\n            \"followers_url\":\"https://api.github.com/users/pennersr/followers\",\n            \"id\":201022,\n            \"following\":0,\n            \"email\":\"raymond.penners@intenct.nl\",\n            \"events_url\":\"https://api.github.com/users/pennersr/events{/privacy}\",\n            \"following_url\":\"https://api.github.com/users/pennersr/following\"\n        }\"\"\",\n            ),\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"\n            [{\n              \"email\": \"octocat@github.com\",\n              \"verified\": true,\n              \"primary\": true,\n              \"visibility\": \"public\"\n            }]\n            \"\"\",\n            ),\n        ]\n\n    def get_expected_to_str(self):\n        return \"pennersr\"\n\n    def test_account_name_null(self):\n        \"\"\"String conversion when GitHub responds with empty name\"\"\"\n        mocks = [\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"\n        {\n            \"type\": \"User\",\n            \"id\": 201022,\n            \"login\": \"pennersr\",\n            \"name\": null\n        }\n        \"\"\",\n            ),\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"\n        [\n          {\n            \"email\": \"octocat@github.com\",\n            \"verified\": true,\n            \"primary\": true,\n            \"visibility\": \"public\"\n          },\n          {\n            \"email\": \"secONDary@GitHub.COM\",\n            \"verified\": true,\n            \"primary\": false,\n            \"visibility\": \"public\"\n          }\n        ]\n        \"\"\",\n            ),\n        ]\n        with patch(\n            \"allauth.socialaccount.adapter.DefaultSocialAccountAdapter.populate_user\"\n        ) as populate_mock:\n            self.login(mocks)\n        populate_data = populate_mock.call_args[0][2]\n        assert populate_data[\"email\"] == \"octocat@github.com\"\n        socialaccount = SocialAccount.objects.get(uid=\"201022\")\n        self.assertIsNone(socialaccount.extra_data.get(\"name\"))\n        account = socialaccount.get_provider_account()\n        self.assertIsNotNone(account.to_str())\n        self.assertEqual(account.to_str(), \"pennersr\")\n        self.assertEqual(socialaccount.user.email, \"octocat@github.com\")\n        self.assertTrue(\n            EmailAddress.objects.filter(\n                primary=False,\n                verified=True,\n                email=\"secondary@github.com\",\n                user=socialaccount.user,\n            ).exists()\n        )\n        self.assertTrue(\"emails\" not in socialaccount.extra_data)\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/gitlab/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/gitlab/tests.py",
    "content": "import json\nfrom http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.gitlab.provider import GitLabProvider\nfrom allauth.socialaccount.providers.gitlab.views import _check_errors\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass GitLabTests(OAuth2TestsMixin, TestCase):\n    provider_id = GitLabProvider.id\n    _uid = 2\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n            {\n                \"avatar_url\": \"https://secure.gravatar.com/avatar/123\",\n                \"bio\": null,\n                \"can_create_group\": true,\n                \"can_create_project\": true,\n                \"color_scheme_id\": 5,\n                \"confirmed_at\": \"2015-03-02T16:53:58.370Z\",\n                \"created_at\": \"2015-03-02T16:53:58.885Z\",\n                \"current_sign_in_at\": \"2018-06-12T18:44:49.985Z\",\n                \"email\": \"mr.bob@gitlab.example.com\",\n                \"external\": false,\n                \"id\": 2,\n                \"identities\": [],\n                \"last_activity_on\": \"2018-06-11\",\n                \"last_sign_in_at\": \"2018-05-31T14:59:44.527Z\",\n                \"linkedin\": \"\",\n                \"location\": null,\n                \"name\": \"Mr Bob\",\n                \"organization\": null,\n                \"projects_limit\": 10,\n                \"shared_runners_minutes_limit\": 2000,\n                \"skype\": \"\",\n                \"state\": \"active\",\n                \"theme_id\": 6,\n                \"twitter\": \"mrbob\",\n                \"two_factor_enabled\": true,\n                \"username\": \"mr.bob\",\n                \"web_url\": \"https://gitlab.example.com/u/mr.bob\",\n                \"website_url\": \"\"\n            }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"mr.bob\"\n\n    def test_valid_response(self):\n        data = {\"id\": 12345}\n        response = MockedResponse(HTTPStatus.OK, json.dumps(data))\n        self.assertEqual(_check_errors(response), data)\n\n    def test_invalid_data(self):\n        response = MockedResponse(HTTPStatus.OK, json.dumps({}))\n        with self.assertRaises(OAuth2Error):\n            # No id, raises\n            _check_errors(response)\n\n    def test_account_invalid_response(self):\n        body = (\n            \"403 Forbidden  - You (@domain.com) must accept the Terms of \"\n            \"Service in order to perform this action. Please access GitLab \"\n            \"from a web browser to accept these terms.\"\n        )\n        response = MockedResponse(HTTPStatus.FORBIDDEN, body)\n\n        # GitLab allow users to login with their API and provides\n        # an error requiring the user to accept the Terms of Service.\n        # see: https://gitlab.com/gitlab-org/gitlab-foss/-/issues/45849\n        with self.assertRaises(OAuth2Error):\n            # no id, 4xx code, raises\n            _check_errors(response)\n\n    def test_error_response(self):\n        body = \"403 Forbidden\"\n        response = MockedResponse(HTTPStatus.FORBIDDEN, body)\n\n        with self.assertRaises(OAuth2Error):\n            # no id, 4xx code, raises\n            _check_errors(response)\n\n    def test_invalid_response(self):\n        response = MockedResponse(HTTPStatus.OK, json.dumps({}))\n        with self.assertRaises(OAuth2Error):\n            # No id, raises\n            _check_errors(response)\n\n    def test_bad_response(self):\n        response = MockedResponse(HTTPStatus.BAD_REQUEST, json.dumps({}))\n        with self.assertRaises(OAuth2Error):\n            # bad json, raises\n            _check_errors(response)\n\n    def test_extra_data(self):\n        self.login(self.get_mocked_response())\n        account = SocialAccount.objects.get(uid=str(self._uid))\n        self.assertEqual(account.extra_data[\"id\"], self._uid)\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/globus/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/globus/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\n\nfrom allauth.socialaccount.providers.globus.provider import GlobusProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass GlobusTests(OAuth2TestsMixin, TestCase):\n    provider_id = GlobusProvider.id\n\n    @override_settings(SOCIALACCOUNT_QUERY_EMAIL=True)\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n            \"identity_provider_display_name\": \"University of Gozorpazorp\",\n            \"sub\": \"a6fc81e-4a6c1-97ac-b4c6-84ff6a8ce662\",\n            \"preferred_username\": \"morty@ugz.edu\",\n            \"identity_provider\": \"9a4c8312f-9432-9a7c-1654-6a987c6531fa\",\n            \"organization\": \"University of Gozorpazorp\",\n            \"email\": \"morty@ugz.edu\",\n            \"name\": \"Morty Smith\"\n        }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"morty@ugz.edu\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/google/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/google/tests.py",
    "content": "import json\nimport time\nfrom http import HTTPStatus\nfrom importlib import import_module\nfrom unittest.mock import Mock, patch\n\nfrom django.conf import settings\nfrom django.contrib.auth.models import User\nfrom django.core import mail\nfrom django.test import TestCase\nfrom django.test.client import RequestFactory\nfrom django.test.utils import override_settings\nfrom django.urls import reverse\n\nimport pytest\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.account.models import EmailAddress, EmailConfirmation\nfrom allauth.account.signals import user_signed_up\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.models import SocialAccount, SocialToken\nfrom allauth.socialaccount.providers.apple.client import jwt_encode\nfrom allauth.socialaccount.providers.google.provider import GoogleProvider\nfrom allauth.socialaccount.providers.google.views import GoogleOAuth2Adapter\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import mocked_response\n\n\n@pytest.fixture\ndef settings_with_google_provider(settings):\n    settings.SOCIALACCOUNT_PROVIDERS = {\n        \"google\": {\n            \"APP\": {\n                \"client_id\": \"app123id\",\n                \"key\": \"google\",\n                \"secret\": \"dummy\",\n            }\n        }\n    }\n    return settings\n\n\n@override_settings(\n    SOCIALACCOUNT_AUTO_SIGNUP=True,\n    ACCOUNT_SIGNUP_FORM_CLASS=None,\n    ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.MANDATORY,\n)\nclass GoogleTests(OAuth2TestsMixin, TestCase):\n    provider_id = GoogleProvider.id\n\n    def setUp(self):\n        super().setUp()\n        self.email = \"raymond.penners@example.com\"\n        self.identity_overwrites = {}\n\n    def get_expected_to_str(self):\n        return \"raymond.penners@example.com\"\n\n    def get_google_id_token_payload(self):\n        now = int(time.time())\n        client_id = \"app123id\"  # Matches `setup_app`\n        payload = {\n            \"iss\": \"https://accounts.google.com\",\n            \"azp\": client_id,\n            \"aud\": client_id,\n            \"sub\": \"108204268033311374519\",\n            \"hd\": \"example.com\",\n            \"email\": self.email,\n            \"email_verified\": True,\n            \"at_hash\": \"HK6E_P6Dh8Y93mRNtsDB1Q\",\n            \"name\": \"Raymond Penners\",\n            \"picture\": \"https://lh5.googleusercontent.com/photo.jpg\",\n            \"given_name\": \"Raymond\",\n            \"family_name\": \"Penners\",\n            \"locale\": \"en\",\n            \"iat\": now,\n            \"exp\": now + 60 * 60,\n        }\n        payload.update(self.identity_overwrites)\n        return payload\n\n    def get_login_response_json(self, with_refresh_token=True):\n        data = {\n            \"access_token\": \"testac\",\n            \"expires_in\": 3600,\n            \"scope\": \"https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile openid\",\n            \"token_type\": \"Bearer\",\n            \"id_token\": jwt_encode(self.get_google_id_token_payload(), \"secret\"),\n        }\n        return json.dumps(data)\n\n    @override_settings(SOCIALACCOUNT_AUTO_SIGNUP=False)\n    def test_login(self):\n        resp = self.login(resp_mock=None)\n        self.assertRedirects(resp, reverse(\"socialaccount_signup\"))\n\n    def test_wrong_id_token_claim_values(self):\n        wrong_claim_values = {\n            \"iss\": \"not-google\",\n            \"exp\": time.time() - 1,\n            \"aud\": \"foo\",\n        }\n        template_ext = getattr(settings, \"ACCOUNT_TEMPLATE_EXTENSION\", \"html\")\n        for key, value in wrong_claim_values.items():\n            with self.subTest(key):\n                self.identity_overwrites = {key: value}\n                resp = self.login(resp_mock=None)\n                self.assertTemplateUsed(\n                    resp, f\"socialaccount/authentication_error.{template_ext}\"\n                )\n\n    def test_username_based_on_email(self):\n        self.identity_overwrites = {\"given_name\": \"明\", \"family_name\": \"小\"}\n        self.login(resp_mock=None)\n        user = User.objects.get(email=self.email)\n        self.assertEqual(user.username, \"raymond.penners\")\n\n    def test_email_verified(self):\n        self.identity_overwrites = {\"email_verified\": True}\n        self.login(resp_mock=None)\n        email_address = EmailAddress.objects.get(email=self.email, verified=True)\n        self.assertFalse(\n            EmailConfirmation.objects.filter(email_address__email=self.email).exists()\n        )\n        account = email_address.user.socialaccount_set.all()[0]\n        self.assertEqual(account.extra_data[\"given_name\"], \"Raymond\")\n\n    def test_user_signed_up_signal(self):\n        sent_signals = []\n\n        def on_signed_up(sender, request, user, **kwargs):\n            sociallogin = kwargs[\"sociallogin\"]\n            self.assertEqual(sociallogin.account.provider, GoogleProvider.id)\n            self.assertEqual(sociallogin.account.user, user)\n            sent_signals.append(sender)\n\n        user_signed_up.connect(on_signed_up)\n        self.login(resp_mock=None)\n        self.assertTrue(len(sent_signals) > 0)\n        user_signed_up.disconnect(on_signed_up)\n\n    @override_settings(ACCOUNT_EMAIL_CONFIRMATION_HMAC=False)\n    def test_email_unverified(self):\n        self.identity_overwrites = {\"email_verified\": False}\n        resp = self.login(resp_mock=None)\n        email_address = EmailAddress.objects.get(email=self.email)\n        self.assertFalse(email_address.verified)\n        self.assertTrue(\n            EmailConfirmation.objects.filter(email_address__email=self.email).exists()\n        )\n        self.assertTemplateUsed(\n            resp, \"account/email/email_confirmation_signup_subject.txt\"\n        )\n\n    def test_email_verified_stashed(self):\n        # http://slacy.com/blog/2012/01/how-to-set-session-variables-in-django-unit-tests/\n        engine = import_module(settings.SESSION_ENGINE)\n        store = engine.SessionStore()\n        store.save()\n        self.client.cookies[settings.SESSION_COOKIE_NAME] = store.session_key\n        request = RequestFactory().get(\"/\")\n        request.session = self.client.session\n        adapter = get_account_adapter()\n        adapter.stash_verified_email(request, self.email)\n        request.session.save()\n\n        self.identity_overwrites = {\"email_verified\": False}\n        self.login(resp_mock=None)\n        email_address = EmailAddress.objects.get(email=self.email)\n        self.assertTrue(email_address.verified)\n        self.assertFalse(\n            EmailConfirmation.objects.filter(email_address__email=self.email).exists()\n        )\n\n    def test_account_connect(self):\n        email = \"user@example.com\"\n        user = User.objects.create(username=\"user\", is_active=True, email=email)\n        user.set_password(\"test\")\n        user.save()\n        EmailAddress.objects.create(user=user, email=email, primary=True, verified=True)\n        self.client.login(username=user.username, password=\"test\")\n        self.identity_overwrites = {\"email\": email, \"email_verified\": True}\n        self.login(resp_mock=None, process=\"connect\")\n        # Check if we connected...\n        self.assertTrue(\n            SocialAccount.objects.filter(user=user, provider=GoogleProvider.id).exists()\n        )\n        # For now, we do not pick up any new email addresses on connect\n        self.assertEqual(EmailAddress.objects.filter(user=user).count(), 1)\n        self.assertEqual(EmailAddress.objects.filter(user=user, email=email).count(), 1)\n\n    @override_settings(\n        ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.MANDATORY,\n        SOCIALACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.NONE,\n    )\n    def test_social_email_verification_skipped(self):\n        self.identity_overwrites = {\"email_verified\": False}\n        self.login(resp_mock=None)\n        email_address = EmailAddress.objects.get(email=self.email)\n        self.assertFalse(email_address.verified)\n        self.assertFalse(\n            EmailConfirmation.objects.filter(email_address__email=self.email).exists()\n        )\n\n    @override_settings(\n        ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.OPTIONAL,\n        SOCIALACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.OPTIONAL,\n    )\n    def test_social_email_verification_optional(self):\n        self.identity_overwrites = {\"email_verified\": False}\n        self.login(resp_mock=None)\n        self.assertEqual(len(mail.outbox), 1)\n        self.login(resp_mock=None)\n        self.assertEqual(len(mail.outbox), 1)\n\n\n@override_settings(\n    SOCIALACCOUNT_PROVIDERS={\n        \"google\": {\n            \"APP\": {\n                \"client_id\": \"app123id\",\n                \"key\": \"google\",\n                \"secret\": \"dummy\",\n            }\n        }\n    }\n)\nclass AppInSettingsTests(GoogleTests):\n    \"\"\"\n    Run the same set of tests but without having a SocialApp entry.\n    \"\"\"\n\n    pass\n\n\ndef test_login_by_token(db, client, settings_with_google_provider):\n    client.cookies.load({\"g_csrf_token\": \"csrf\"})\n    with patch(\n        \"allauth.socialaccount.internal.jwtkit.jwt.get_unverified_header\"\n    ) as g_u_h:\n        with mocked_response({\"dummykid\": \"-----BEGIN CERTIFICATE-----\"}):\n            with patch(\n                \"allauth.socialaccount.internal.jwtkit.load_pem_x509_certificate\"\n            ) as load_pem:\n                with patch(\n                    \"allauth.socialaccount.internal.jwtkit.jwt.decode\"\n                ) as decode:\n                    decode.return_value = {\n                        \"iss\": \"https://accounts.google.com\",\n                        \"aud\": \"client_id\",\n                        \"sub\": \"123sub\",\n                        \"hd\": \"example.com\",\n                        \"email\": \"raymond@example.com\",\n                        \"email_verified\": True,\n                        \"at_hash\": \"HK6E_P6Dh8Y93mRNtsDB1Q\",\n                        \"name\": \"Raymond Penners\",\n                        \"picture\": \"https://lh5.googleusercontent.com/photo.jpg\",\n                        \"given_name\": \"Raymond\",\n                        \"family_name\": \"Penners\",\n                        \"locale\": \"en\",\n                        \"iat\": 123,\n                        \"exp\": 456,\n                    }\n                    g_u_h.return_value = {\n                        \"alg\": \"RS256\",\n                        \"kid\": \"dummykid\",\n                        \"typ\": \"JWT\",\n                    }\n                    pem = Mock()\n                    load_pem.return_value = pem\n                    pem.public_key.return_value = \"key\"\n                    resp = client.post(\n                        reverse(\"google_login_by_token\"),\n                        {\"credential\": \"dummy\", \"g_csrf_token\": \"csrf\"},\n                    )\n                    assert resp.status_code == HTTPStatus.FOUND\n                    socialaccount = SocialAccount.objects.get(uid=\"123sub\")\n                    assert socialaccount.user.email == \"raymond@example.com\"\n\n\n@pytest.mark.parametrize(\n    \"id_key,verified_key\",\n    [\n        (\"id\", \"email_verified\"),\n        (\"sub\", \"verified_email\"),\n    ],\n)\n@pytest.mark.parametrize(\"verified\", [False, True])\ndef test_extract_data(\n    id_key, verified_key, verified, settings_with_google_provider, db\n):\n    data = {\n        \"email\": \"a@b.com\",\n    }\n    data[id_key] = \"123\"\n    data[verified_key] = verified\n    provider = get_adapter().get_provider(None, GoogleProvider.id)\n    assert provider.extract_uid(data) == \"123\"\n    emails = provider.extract_email_addresses(data)\n    assert len(emails) == 1\n    assert emails[0].verified == verified\n    assert emails[0].email == \"a@b.com\"\n\n\n@pytest.mark.parametrize(\n    \"fetch_userinfo,id_token_has_picture,response,expected_uid, expected_picture\",\n    [\n        (True, True, {\"id_token\": \"123\"}, \"uid-from-id-token\", \"pic-from-id-token\"),\n        (True, False, {\"id_token\": \"123\"}, \"uid-from-id-token\", \"pic-from-userinfo\"),\n        (True, True, {\"access_token\": \"123\"}, \"uid-from-userinfo\", \"pic-from-userinfo\"),\n    ],\n)\n@pytest.mark.parametrize(\"did_fetch_access_token\", [False, True])\ndef test_complete_login_variants(\n    response,\n    settings_with_google_provider,\n    db,\n    fetch_userinfo,\n    expected_uid,\n    expected_picture,\n    id_token_has_picture,\n    did_fetch_access_token,\n):\n    with patch.object(\n        GoogleOAuth2Adapter,\n        \"_fetch_user_info\",\n        return_value={\n            \"id\": \"uid-from-userinfo\",\n            \"picture\": \"pic-from-userinfo\",\n        },\n    ):\n        id_token = {\"sub\": \"uid-from-id-token\"}\n        if id_token_has_picture:\n            id_token[\"picture\"] = \"pic-from-id-token\"\n        with patch(\n            \"allauth.socialaccount.providers.google.views._verify_and_decode\",\n            return_value=id_token,\n        ) as decode_mock:\n            request = None\n            app = None\n            adapter = GoogleOAuth2Adapter(request)\n            adapter.did_fetch_access_token = did_fetch_access_token\n            adapter.fetch_userinfo = fetch_userinfo\n            token = SocialToken()\n            login = adapter.complete_login(request, app, token, response)\n            assert login.account.uid == expected_uid\n            assert login.account.extra_data[\"picture\"] == expected_picture\n            if not response.get(\"id_token\"):\n                assert not decode_mock.called\n            else:\n                assert decode_mock.call_args[1][\"verify_signature\"] == (\n                    not did_fetch_access_token\n                )\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/gumroad/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/gumroad/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.gumroad.provider import GumroadProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass GumroadTests(OAuth2TestsMixin, TestCase):\n    provider_id = GumroadProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n                \"success\": true,\n                \"user\": {\n                    \"bio\": \"a sailor, a tailor\",\n                    \"name\": \"John Smith\",\n                    \"twitter_handle\": null,\n                    \"user_id\": \"G_-mnBf9b1j9A7a4ub4nFQ==\",\n                    \"email\": \"johnsmith@gumroad.com\",\n                    \"url\": \"https://gumroad.com/sailorjohn\"\n                }\n            }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"johnsmith@gumroad.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/hubic/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/hubic/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.hubic.provider import HubicProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass HubicTests(OAuth2TestsMixin, TestCase):\n    provider_id = HubicProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\n    \"email\": \"user@example.com\",\n    \"firstname\": \"Test\",\n    \"activated\": true,\n    \"creationDate\": \"2014-04-17T17:04:01+02:00\",\n    \"language\": \"en\",\n    \"status\": \"ok\",\n    \"offer\": \"25g\",\n    \"lastname\": \"User\"\n}\n\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"user@example.com\"\n\n    def get_login_response_json(self, with_refresh_token=True):\n        return '{\\\n    \"access_token\": \"testac\",\\\n    \"expires_in\": \"3600\",\\\n    \"refresh_token\": \"testrf\",\\\n    \"token_type\": \"Bearer\"\\\n}'\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/hubspot/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/hubspot/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.hubspot.provider import HubspotProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass HubspotTests(OAuth2TestsMixin, TestCase):\n    provider_id = HubspotProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n                    \"token\": \"CNye4dqFMBICAAEYhOKlDZZ_z6IVKI_xMjIUgmFsNQzgBjNE9YBmhAhNOtfN0ak6BAAAAEFCFIIwn2EVRLpvJI9hP4tbIeKHw7ZXSgNldTFSAFoA\",\n                    \"user\": \"m@acme.com\",\n                    \"hub_domain\": \"acme.com\",\n                    \"scopes\": [\"oauth\"],\n                    \"scope_to_scope_group_pks\": [25, 31],\n                    \"trial_scopes\": [],\n                    \"trial_scope_to_scope_group_pks\": [],\n                    \"hub_id\": 211580,\n                    \"app_id\": 833572,\n                    \"expires_in\": 1799,\n                    \"user_id\": 42607123,\n                    \"token_type\": \"access\"\n                }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"m@acme.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/instagram/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/instagram/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.instagram.provider import InstagramProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass InstagramTests(OAuth2TestsMixin, TestCase):\n    provider_id = InstagramProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n            \"username\": \"georgewhewell\",\n            \"bio\": \"\",\n            \"website\": \"\",\n            \"profile_picture\":\n            \"http://images.ak.instagram.com/profiles/profile_11428116_75sq_1339547159.jpg\",\n            \"full_name\": \"georgewhewell\",\n            \"counts\": {\n              \"media\": 74,\n              \"followed_by\": 91,\n              \"follows\": 104\n            },\n            \"id\": \"11428116\"\n        }\"\"\",\n        )  # noqa\n\n    def get_expected_to_str(self):\n        return \"georgewhewell\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/jupyterhub/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/jupyterhub/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.jupyterhub.provider import JupyterHubProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass JupyterHubTests(OAuth2TestsMixin, TestCase):\n    provider_id = JupyterHubProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n        \"kind\": \"user\",\n        \"name\": \"abc\",\n        \"admin\": false,\n        \"groups\": [],\n        \"server\": null,\n        \"pending\": null,\n        \"created\": \"2016-12-06T18:30:50.297567Z\",\n        \"last_activity\": \"2017-02-07T17:29:36.470236Z\",\n        \"servers\": null}\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"abc\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/kakao/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/kakao/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.kakao.provider import KakaoProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass KakaoTests(OAuth2TestsMixin, TestCase):\n    provider_id = KakaoProvider.id\n\n    kakao_data = \"\"\"\n        {\n            \"id\": 123456789,\n            \"connected_at\": \"2022-04-11T01:45:28Z\",\n            \"kakao_account\": {\n                \"profile_nickname_needs_agreement\": false,\n                \"profile_image_needs_agreement\": false,\n                \"profile\": {\n                    \"nickname\": \"홍길동\",\n                    \"thumbnail_image_url\": \"http://yyy.kakao.com/.../img_110x110.jpg\",\n                    \"profile_image_url\": \"http://yyy.kakao.com/dn/.../img_640x640.jpg\",\n                    \"is_default_image\":false,\n                    \"is_default_nickname\": false\n                },\n                \"name_needs_agreement\":false,\n                \"name\":\"홍길동\",\n                \"email_needs_agreement\":false,\n                \"is_email_valid\": true,\n                \"is_email_verified\": true,\n                \"email\": \"sample@sample.com\",\n                \"age_range_needs_agreement\":false,\n                \"age_range\":\"20~29\",\n                \"birthyear_needs_agreement\": false,\n                \"birthyear\": \"2002\",\n                \"birthday_needs_agreement\":false,\n                \"birthday\":\"1130\",\n                \"birthday_type\":\"SOLAR\",\n                \"gender_needs_agreement\":false,\n                \"gender\":\"female\",\n                \"phone_number_needs_agreement\": false,\n                \"phone_number\": \"+82 010-1234-5678\",\n                \"ci_needs_agreement\": false,\n                \"ci\": \"CI\",\n                \"ci_authenticated_at\": \"2019-03-11T11:25:22Z\"\n            },\n            \"properties\":{\n                \"CUSTOM_PROPERTY_KEY\": \"CUSTOM_PROPERTY_VALUE\"\n            },\n            \"for_partner\": {\n                \"uuid\": \"UUID\"\n            }\n        }\n    \"\"\"\n\n    def get_expected_to_str(self):\n        return \"sample@sample.com\"\n\n    def get_mocked_response(self, data=None):\n        if data is None:\n            data = self.kakao_data\n        return MockedResponse(HTTPStatus.OK, data)\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/lemonldap/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/lemonldap/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.lemonldap.provider import LemonLDAPProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass LemonLDAPTests(OAuth2TestsMixin, TestCase):\n    provider_id = LemonLDAPProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n            {\n                \"email\": \"dwho@example.com\",\n                \"sub\": \"dwho\",\n                \"preferred_username\": \"dwho\",\n                \"name\": \"Doctor Who\"\n            }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"dwho@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/lichess/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/lichess/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.lichess.provider import LichessProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass LichessTests(OAuth2TestsMixin, TestCase):\n    provider_id = LichessProvider.id\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"\n{\n  \"id\": \"george\",\n  \"url\": \"https://lichess.org/@/george\",\n  \"count\": {\n    \"ai\": 0,\n    \"me\": 0,\n    \"all\": 0,\n    \"win\": 0,\n    \"draw\": 0,\n    \"loss\": 0,\n    \"winH\": 0,\n    \"drawH\": 0,\n    \"lossH\": 0,\n    \"rated\": 0,\n    \"import\": 0,\n    \"playing\": 0,\n    \"bookmark\": 0\n  },\n  \"perfs\": {\n    \"blitz\": {\n      \"rd\": 500,\n      \"prog\": 0,\n      \"prov\": true,\n      \"games\": 0,\n      \"rating\": 1500\n    },\n    \"rapid\": {\n      \"rd\": 500,\n      \"prog\": 0,\n      \"prov\": true,\n      \"games\": 0,\n      \"rating\": 1500\n    },\n    \"bullet\": {\n      \"rd\": 500,\n      \"prog\": 0,\n      \"prov\": true,\n      \"games\": 0,\n      \"rating\": 1500\n    },\n    \"classical\": {\n      \"rd\": 500,\n      \"prog\": 0,\n      \"prov\": true,\n      \"games\": 0,\n      \"rating\": 1500\n    },\n    \"correspondence\": {\n      \"rd\": 500,\n      \"prog\": 0,\n      \"prov\": true,\n      \"games\": 0,\n      \"rating\": 1500\n    }\n  },\n  \"seenAt\": 1713837454330,\n  \"blocking\": false,\n  \"playTime\": {\n    \"tv\": 0,\n    \"total\": 0\n  },\n  \"username\": \"george\",\n  \"createdAt\": 1713837409417,\n  \"following\": false,\n  \"followable\": true,\n  \"followsYou\": false\n}\n\"\"\",\n            ),\n            MockedResponse(HTTPStatus.OK, \"\"\"{\"email\":\"george@example.com\"}\"\"\"),\n        ]\n\n    def get_expected_to_str(self):\n        return \"george\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/line/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/line/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.line.provider import LineProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass LineTests(OAuth2TestsMixin, TestCase):\n    provider_id = LineProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\n\"userId\": \"u7d47d26a6bab09b95695ff02d1a36e38\",\n\"displayName\": \"\\uc774\\uc0c1\\ud601\",\n\"pictureUrl\":\n\"http://dl.profile.line-cdn.net/0m055ab14d725138288331268c45ac5286a35482fb794a\"\n}\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"\\uc774\\uc0c1\\ud601\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/linkedin_oauth2/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/linkedin_oauth2/tests.py",
    "content": "from http import HTTPStatus\nfrom json import loads\n\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\n\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.base import ProviderException\nfrom allauth.socialaccount.providers.linkedin_oauth2.provider import (\n    LinkedInOAuth2Provider,\n)\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass LinkedInOAuth2Tests(OAuth2TestsMixin, TestCase):\n    provider_id = LinkedInOAuth2Provider.id\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"\n            {}\n            \"\"\",\n            ),\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"\n{\n  \"profilePicture\": {\n    \"displayImage\": \"urn:li:digitalmediaAsset:12345abcdefgh-12abcd\"\n  },\n  \"id\": \"1234567\",\n  \"lastName\": {\n    \"preferredLocale\": {\n      \"language\": \"en\",\n      \"country\": \"US\"\n    },\n    \"localized\": {\n      \"en_US\": \"Penners\"\n    }\n  },\n  \"firstName\": {\n    \"preferredLocale\": {\n      \"language\": \"en\",\n      \"country\": \"US\"\n    },\n    \"localized\": {\n      \"en_US\": \"Raymond\"\n    }\n  }\n}\n\"\"\",\n            ),\n        ]\n\n    def get_expected_to_str(self):\n        return \"Raymond Penners\"\n\n    def test_data_to_str(self):\n        data = {\n            \"emailAddress\": \"john@doe.org\",\n            \"firstName\": \"John\",\n            \"id\": \"a1b2c3d4e\",\n            \"lastName\": \"Doe\",\n            \"pictureUrl\": \"https://media.licdn.com/mpr/foo\",\n            \"pictureUrls\": {\n                \"_total\": 1,\n                \"values\": [\"https://media.licdn.com/foo\"],\n            },\n            \"publicProfileUrl\": \"https://www.linkedin.com/in/johndoe\",\n        }\n        acc = SocialAccount(extra_data=data, provider=\"linkedin_oauth2\")\n        self.assertEqual(acc.get_provider_account().to_str(), \"john@doe.org\")\n\n    def test_get_avatar_url_no_picture_setting(self):\n        extra_data = \"\"\"\n{\n  \"profilePicture\": {\n    \"displayImage\": \"urn:li:digitalmediaAsset:12345abcdefgh-12abcd\"\n  },\n  \"id\": \"1234567\",\n  \"lastName\": {\n    \"preferredLocale\": {\n      \"language\": \"en\",\n      \"country\": \"US\"\n    },\n    \"localized\": {\n      \"en_US\": \"Penners\"\n    }\n  },\n  \"firstName\": {\n    \"preferredLocale\": {\n      \"language\": \"en\",\n      \"country\": \"US\"\n    },\n    \"localized\": {\n      \"en_US\": \"Raymond\"\n    }\n  }\n}\n\"\"\"\n        acc = SocialAccount(\n            extra_data=loads(extra_data),\n            provider=\"linkedin_oauth2\",\n        )\n        self.assertIsNone(acc.get_avatar_url())\n\n    @override_settings(\n        SOCIALACCOUNT_PROVIDERS={\n            \"linkedin_oauth2\": {\n                \"PROFILE_FIELDS\": [\n                    \"id\",\n                    \"firstName\",\n                    \"lastName\",\n                    \"profilePicture(displayImage~:playableStreams)\",\n                ],\n                \"PROFILEPICTURE\": {\n                    \"display_size_w_h\": (400, 400.0),\n                },\n            },\n        }\n    )\n    def test_get_avatar_url_with_setting(self):\n        extra_data = \"\"\"\n{\n  \"profilePicture\": {\n    \"displayImage\": \"urn:li:digitalmediaAsset:12345abcdefgh-12abcd\"\n  },\n  \"id\": \"1234567\",\n  \"lastName\": {\n    \"preferredLocale\": {\n      \"language\": \"en\",\n      \"country\": \"US\"\n    },\n    \"localized\": {\n      \"en_US\": \"Penners\"\n    }\n  },\n  \"firstName\": {\n    \"preferredLocale\": {\n      \"language\": \"en\",\n      \"country\": \"US\"\n    },\n    \"localized\": {\n      \"en_US\": \"Raymond\"\n    }\n  }\n}\n\"\"\"\n        acc = SocialAccount(\n            extra_data=loads(extra_data),\n            provider=\"linkedin_oauth2\",\n        )\n        self.assertIsNone(acc.get_avatar_url())\n\n    @override_settings(\n        SOCIALACCOUNT_PROVIDERS={\n            \"linkedin_oauth2\": {\n                \"PROFILE_FIELDS\": [\n                    \"id\",\n                    \"firstName\",\n                    \"lastName\",\n                    \"profilePicture(displayImage~:playableStreams)\",\n                ],\n                \"PROFILEPICTURE\": {\n                    \"display_size_w_h\": (100, 100.0),\n                },\n            },\n        }\n    )\n    def test_get_avatar_url_with_picture(self):\n        extra_data = \"\"\"\n{\n  \"profilePicture\": {\n    \"displayImage\": \"urn:li:digitalmediaAsset:12345abcdefgh-12abcd\"\n  },\n  \"id\": \"1234567\",\n  \"lastName\": {\n    \"preferredLocale\": {\n      \"language\": \"en\",\n      \"country\": \"US\"\n    },\n    \"localized\": {\n      \"en_US\": \"Penners\"\n    }\n  },\n  \"firstName\": {\n    \"preferredLocale\": {\n      \"language\": \"en\",\n      \"country\": \"US\"\n    },\n    \"localized\": {\n      \"en_US\": \"Raymond\"\n    }\n  },\n  \"profilePicture\": {\n    \"displayImage~\": {\n      \"elements\": [\n        {\n          \"authorizationMethod\": \"PUBLIC\",\n          \"data\": {\n            \"com.linkedin.digitalmedia.mediaartifact.StillImage\": {\n              \"storageSize\": {\n                \"height\": 100,\n                \"width\": 100\n              },\n              \"storageAspectRatio\": {\n                \"heightAspect\": 1.0,\n                \"formatted\": \"1.00:1.00\",\n                \"widthAspect\": 1.0\n              },\n              \"displaySize\": {\n                \"height\": 100.0,\n                \"width\": 100.0,\n                \"uom\": \"PX\"\n              },\n              \"rawCodecSpec\": {\n                \"name\": \"jpeg\",\n                \"type\": \"image\"\n              },\n              \"displayAspectRatio\": {\n                \"heightAspect\": 1.0,\n                \"formatted\": \"1.00:1.00\",\n                \"widthAspect\": 1.0\n              },\n              \"mediaType\": \"image/jpeg\"\n            }\n          },\n          \"artifact\": \"urn:li:digitalmediaMediaArtifact:avatar\",\n          \"identifiers\": [\n            {\n              \"identifierExpiresInSeconds\": 4,\n              \"file\": \"urn:li:digitalmediaFile:this-is-the-link\",\n              \"index\": 0,\n              \"identifier\": \"this-is-the-link\",\n              \"mediaType\": \"image/jpeg\",\n              \"identifierType\": \"EXTERNAL_URL\"\n            }\n          ]\n        }\n      ]\n    }\n  }\n}\n\"\"\"\n        acc = SocialAccount(\n            extra_data=loads(extra_data),\n            provider=\"linkedin_oauth2\",\n        )\n        self.assertEqual(\"this-is-the-link\", acc.get_avatar_url())\n\n    @override_settings(\n        SOCIALACCOUNT_PROVIDERS={\n            \"linkedin_oauth2\": {\n                \"PROFILE_FIELDS\": [\n                    \"id\",\n                    \"firstName\",\n                    \"lastName\",\n                    \"profilePicture(displayImage~:playableStreams)\",\n                ],\n                \"PROFILEPICTURE\": {\n                    \"display_size_w_h\": (400, 400.0),\n                },\n            },\n        }\n    )\n    def test_get_avatar_url_size_mismatch(self):\n        extra_data = \"\"\"\n{\n  \"profilePicture\": {\n    \"displayImage\": \"urn:li:digitalmediaAsset:12345abcdefgh-12abcd\"\n  },\n  \"id\": \"1234567\",\n  \"lastName\": {\n    \"preferredLocale\": {\n      \"language\": \"en\",\n      \"country\": \"US\"\n    },\n    \"localized\": {\n      \"en_US\": \"Penners\"\n    }\n  },\n  \"firstName\": {\n    \"preferredLocale\": {\n      \"language\": \"en\",\n      \"country\": \"US\"\n    },\n    \"localized\": {\n      \"en_US\": \"Raymond\"\n    }\n  },\n  \"profilePicture\": {\n    \"displayImage~\": {\n      \"elements\": [\n        {\n          \"authorizationMethod\": \"PUBLIC\",\n          \"data\": {\n            \"com.linkedin.digitalmedia.mediaartifact.StillImage\": {\n              \"storageSize\": {\n                \"height\": 100,\n                \"width\": 100\n              },\n              \"storageAspectRatio\": {\n                \"heightAspect\": 1.0,\n                \"formatted\": \"1.00:1.00\",\n                \"widthAspect\": 1.0\n              },\n              \"displaySize\": {\n                \"height\": 100.0,\n                \"width\": 100.0,\n                \"uom\": \"PX\"\n              },\n              \"rawCodecSpec\": {\n                \"name\": \"jpeg\",\n                \"type\": \"image\"\n              },\n              \"displayAspectRatio\": {\n                \"heightAspect\": 1.0,\n                \"formatted\": \"1.00:1.00\",\n                \"widthAspect\": 1.0\n              },\n              \"mediaType\": \"image/jpeg\"\n            }\n          },\n          \"artifact\": \"urn:li:digitalmediaMediaArtifact:avatar\",\n          \"identifiers\": [\n            {\n              \"identifierExpiresInSeconds\": 4,\n              \"file\": \"urn:li:digitalmediaFile:this-is-the-link\",\n              \"index\": 0,\n              \"identifier\": \"this-is-the-link\",\n              \"mediaType\": \"image/jpeg\",\n              \"identifierType\": \"EXTERNAL_URL\"\n            }\n          ]\n        }\n      ]\n    }\n  }\n}\n\"\"\"\n        acc = SocialAccount(\n            extra_data=loads(extra_data),\n            provider=\"linkedin_oauth2\",\n        )\n        self.assertIsNone(acc.get_avatar_url())\n\n    @override_settings(\n        SOCIALACCOUNT_PROVIDERS={\n            \"linkedin_oauth2\": {\n                \"PROFILE_FIELDS\": [\n                    \"id\",\n                    \"firstName\",\n                    \"lastName\",\n                    \"profilePicture(displayImage~:playableStreams)\",\n                ],\n                \"PROFILEPICTURE\": {\n                    \"display_size_w_h\": (400, 400.0),\n                },\n            },\n        }\n    )\n    def test_get_avatar_url_auth_mismatch(self):\n        extra_data = \"\"\"\n{\n  \"profilePicture\": {\n    \"displayImage\": \"urn:li:digitalmediaAsset:12345abcdefgh-12abcd\"\n  },\n  \"id\": \"1234567\",\n  \"lastName\": {\n    \"preferredLocale\": {\n      \"language\": \"en\",\n      \"country\": \"US\"\n    },\n    \"localized\": {\n      \"en_US\": \"Penners\"\n    }\n  },\n  \"firstName\": {\n    \"preferredLocale\": {\n      \"language\": \"en\",\n      \"country\": \"US\"\n    },\n    \"localized\": {\n      \"en_US\": \"Raymond\"\n    }\n  },\n  \"profilePicture\": {\n    \"displayImage~\": {\n      \"elements\": [\n        {\n          \"authorizationMethod\": \"PRIVATE\",\n          \"data\": {\n            \"com.linkedin.digitalmedia.mediaartifact.StillImage\": {\n              \"storageSize\": {\n                \"height\": 100,\n                \"width\": 100\n              },\n              \"storageAspectRatio\": {\n                \"heightAspect\": 1.0,\n                \"formatted\": \"1.00:1.00\",\n                \"widthAspect\": 1.0\n              },\n              \"displaySize\": {\n                \"height\": 100.0,\n                \"width\": 100.0,\n                \"uom\": \"PX\"\n              },\n              \"rawCodecSpec\": {\n                \"name\": \"jpeg\",\n                \"type\": \"image\"\n              },\n              \"displayAspectRatio\": {\n                \"heightAspect\": 1.0,\n                \"formatted\": \"1.00:1.00\",\n                \"widthAspect\": 1.0\n              },\n              \"mediaType\": \"image/jpeg\"\n            }\n          },\n          \"artifact\": \"urn:li:digitalmediaMediaArtifact:avatar\",\n          \"identifiers\": [\n            {\n              \"identifierExpiresInSeconds\": 4,\n              \"file\": \"urn:li:digitalmediaFile:this-is-the-link\",\n              \"index\": 0,\n              \"identifier\": \"this-is-the-link\",\n              \"mediaType\": \"image/jpeg\",\n              \"identifierType\": \"EXTERNAL_URL\"\n            }\n          ]\n        }\n      ]\n    }\n  }\n}\n\"\"\"\n        acc = SocialAccount(\n            extra_data=loads(extra_data),\n            provider=\"linkedin_oauth2\",\n        )\n        self.assertIsNone(acc.get_avatar_url())\n\n    @override_settings(\n        SOCIALACCOUNT_PROVIDERS={\n            \"linkedin_oauth2\": {\n                \"PROFILE_FIELDS\": [\n                    \"id\",\n                    \"firstName\",\n                    \"lastName\",\n                    \"profilePicture(displayImage~:playableStreams)\",\n                ],\n                \"PROFILEPICTURE\": {\n                    \"display_size_w_h\": (100, 100),\n                },\n            },\n        }\n    )\n    def test_get_avatar_url_float_vs_int(self):\n        extra_data = \"\"\"\n{\n  \"profilePicture\": {\n    \"displayImage\": \"urn:li:digitalmediaAsset:12345abcdefgh-12abcd\"\n  },\n  \"id\": \"1234567\",\n  \"lastName\": {\n    \"preferredLocale\": {\n      \"language\": \"en\",\n      \"country\": \"US\"\n    },\n    \"localized\": {\n      \"en_US\": \"Penners\"\n    }\n  },\n  \"firstName\": {\n    \"preferredLocale\": {\n      \"language\": \"en\",\n      \"country\": \"US\"\n    },\n    \"localized\": {\n      \"en_US\": \"Raymond\"\n    }\n  },\n  \"profilePicture\": {\n    \"displayImage~\": {\n      \"elements\": [\n        {\n          \"authorizationMethod\": \"PUBLIC\",\n          \"data\": {\n            \"com.linkedin.digitalmedia.mediaartifact.StillImage\": {\n              \"storageSize\": {\n                \"height\": 100,\n                \"width\": 100\n              },\n              \"storageAspectRatio\": {\n                \"heightAspect\": 1.0,\n                \"formatted\": \"1.00:1.00\",\n                \"widthAspect\": 1.0\n              },\n              \"displaySize\": {\n                \"height\": 100.0,\n                \"width\": 100.0,\n                \"uom\": \"PX\"\n              },\n              \"rawCodecSpec\": {\n                \"name\": \"jpeg\",\n                \"type\": \"image\"\n              },\n              \"displayAspectRatio\": {\n                \"heightAspect\": 1.0,\n                \"formatted\": \"1.00:1.00\",\n                \"widthAspect\": 1.0\n              },\n              \"mediaType\": \"image/jpeg\"\n            }\n          },\n          \"artifact\": \"urn:li:digitalmediaMediaArtifact:avatar\",\n          \"identifiers\": [\n            {\n              \"identifierExpiresInSeconds\": 4,\n              \"file\": \"urn:li:digitalmediaFile:this-is-the-link\",\n              \"index\": 0,\n              \"identifier\": \"this-is-the-link\",\n              \"mediaType\": \"image/jpeg\",\n              \"identifierType\": \"EXTERNAL_URL\"\n            }\n          ]\n        }\n      ]\n    }\n  }\n}\n\"\"\"\n        acc = SocialAccount(\n            extra_data=loads(extra_data),\n            provider=\"linkedin_oauth2\",\n        )\n        self.assertEqual(\"this-is-the-link\", acc.get_avatar_url())\n\n    def test_id_missing(self):\n        extra_data = \"\"\"\n{\n  \"profilePicture\": {\n    \"displayImage\": \"urn:li:digitalmediaAsset:12345abcdefgh-12abcd\"\n  },\n  \"Id\": \"1234567\"\n}\n\"\"\"\n        self.assertRaises(\n            ProviderException, self.provider.extract_uid, loads(extra_data)\n        )\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/mailchimp/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/mailchimp/tests.py",
    "content": "\"\"\"Test MailChimp OAuth2 v3 Flow.\"\"\"\n\nfrom http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.mailchimp.provider import MailChimpProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass MailChimpTests(OAuth2TestsMixin, TestCase):\n    \"\"\"Test Class for MailChimp OAuth2 v3.\"\"\"\n\n    provider_id = MailChimpProvider.id\n\n    def get_mocked_response(self):\n        \"\"\"Test authentication with an non-null avatar.\"\"\"\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n            \"dc\": \"usX\",\n            \"role\": \"owner\",\n            \"accountname\": \"Name can have spaces\",\n            \"user_id\": \"99999999\",\n            \"login\": {\n                \"email\": \"test@example.com\",\n                \"avatar\": \"http://gallery.mailchimp.com/1a1a/avatar/2a2a.png\",\n                \"login_id\": \"88888888\",\n                \"login_name\": \"test@example.com\",\n                \"login_email\": \"test@example.com\"\n            },\n            \"login_url\": \"https://login.mailchimp.com\",\n            \"api_endpoint\": \"https://usX.api.mailchimp.com\"\n        }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"test@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/mailcow/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/mailcow/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.mailcow.provider import MailcowProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass MailcowTests(OAuth2TestsMixin, TestCase):\n    provider_id = MailcowProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n            \"success\": true,\n            \"username\": \"user@example.com\",\n            \"id\": \"user@example.com\",\n            \"identifier\": \"user@example.com\",\n            \"email\": \"user@example.com\",\n            \"full_name\": \"Test User\",\n            \"displayName\": \"Test User\",\n            \"created\": \"2021-12-15 14:35:54\",\n            \"modified\": \"2023-11-02 09:37:58\",\n            \"active\": 1\n        }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"user@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/mailru/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/mailru/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.mailru.provider import MailRuProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass MailRuTests(OAuth2TestsMixin, TestCase):\n    provider_id = MailRuProvider.id\n\n    def get_mocked_response(self, verified_email=True):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n[ { \"uid\": \"15410773191172635989\", \"first_name\": \"Евгений\", \"last_name\": \"Маслов\", \"nick\": \"maslov\", \"email\": \"emaslov@mail.ru\", \"sex\": 0,  \"birthday\": \"15.02.1980\",  \"has_pic\": 1, \"pic\": \"http://avt.appsmail.ru/mail/emaslov/_avatar\",  \"pic_small\": \"http://avt.appsmail.ru/mail/emaslov/_avatarsmall\",  \"pic_big\": \"http://avt.appsmail.ru/mail/emaslov/_avatarbig\", \"link\": \"http://my.mail.ru/mail/emaslov/\", \"referer_type\": \"\", \"referer_id\": \"\", \"is_online\": 1, \"friends_count\": 145, \"is_verified\": 1, \"vip\" : 0, \"app_installed\": 1, \"location\": { \"country\": { \"name\": \"Россия\", \"id\": \"24\" }, \"city\": { \"name\": \"Москва\", \"id\": \"25\" }, \"region\": { \"name\": \"Москва\", \"id\": \"999999\" } } }]\"\"\",\n        )  # noqa\n\n    def get_login_response_json(self, with_refresh_token=True):\n        # TODO: This is not an actual response. I added this in order\n        # to get the test suite going but did not verify to check the\n        # exact response being returned.\n        return '{\"access_token\": \"testac\", \"uid\": \"weibo\", \"refresh_token\": \"testrf\", \"x_mailru_vid\": \"1\"}'  # noqa\n\n    def get_expected_to_str(self):\n        return \"emaslov@mail.ru\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/mediawiki/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/mediawiki/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.mediawiki.provider import MediaWikiProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass MediaWikiTests(OAuth2TestsMixin, TestCase):\n    provider_id = MediaWikiProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n                {\n                    \"iss\": \"https://meta.wikimedia.org\",\n                    \"sub\": 12345,\n                    \"aud\": \"1234567890abcdef\",\n                    \"exp\": 946681300,\n                    \"iat\": 946681200,\n                    \"username\": \"John Doe\",\n                    \"editcount\": 123,\n                    \"confirmed_email\": true,\n                    \"blocked\": false,\n                    \"registered\": \"20000101000000\",\n                    \"groups\": [\"*\", \"user\", \"autoconfirmed\"],\n                    \"rights\": [\"read\", \"edit\"],\n                    \"grants\": [\"basic\"],\n                    \"email\": \"johndoe@example.com\"\n                }\n            \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"John Doe\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/meetup/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/meetup/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.meetup.provider import MeetupProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass MeetupTests(OAuth2TestsMixin, TestCase):\n    provider_id = MeetupProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\"id\": 1, \"lang\": \"en_US\", \"city\": \"Bhubaneswar\",\n        \"photo\": {\n        \"thumb_link\":\"\",\n        \"photo_id\": 240057062,\n        \"highres_link\":\"\",\n        \"base_url\": \"http://photos2.meetupstatic.com\",\n        \"type\": \"member\",\n        \"name\": \"Abhishek Jaiswal\", \"other_services\": {},\n        \"country\": \"in\", \"topics\": [{\"name\": \"Open Source\",\n        \"urlkey\": \"opensource\", \"id\": 563}, {\"name\": \"Python\", \"urlkey\":\n        \"python\", \"id\": 1064}, {\"name\": \"Software Development\", \"urlkey\":\n        \"softwaredev\", \"id\": 3833}, {\"name\": \"Computer programming\",\n        \"urlkey\": \"computer-programming\", \"id\": 48471},\n        {\"name\": \"Python Web Development\",\n        \"urlkey\": \"python-web-development\", \"id\": 917242},\n        {\"name\": \"Data Science using Python\",\n        \"urlkey\": \"data-science-using-python\", \"id\": 1481522}],\n        \"lon\": 85.83999633789062, \"joined\": 1411642310000,\n        \"id\": 173662372, \"status\": \"active\",\n        \"link\": \"http://www.meetup.com/members/173662372\",\n        \"hometown\": \"Kolkata\", \"lat\": 20.270000457763672,\n        \"visited\": 1488829924000, \"self\": {\"common\": {}}}}\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"Meetup\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/microsoft/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/microsoft/tests.py",
    "content": "import json\nfrom http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.microsoft.provider import MicrosoftGraphProvider\nfrom allauth.socialaccount.providers.microsoft.views import _check_errors\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass MicrosoftGraphTests(OAuth2TestsMixin, TestCase):\n    provider_id = MicrosoftGraphProvider.id\n\n    def get_mocked_response(self):\n        response_data = \"\"\"\n        {\n            \"@odata.context\": \"https://graph.microsoft.com/v1.0/$metadata#users/$entity\",\n            \"id\": \"16f5a7b6-5a15-4568-aa5a-31bb117e9967\",\n            \"businessPhones\": [],\n            \"displayName\": \"Anne Weiler\",\n            \"givenName\": \"Anne\",\n            \"jobTitle\": \"Manufacturing Lead\",\n            \"mail\": \"annew@CIE493742.onmicrosoft.com\",\n            \"mobilePhone\": \"+1 3528700812\",\n            \"officeLocation\": null,\n            \"preferredLanguage\": \"en-US\",\n            \"surname\": \"Weiler\",\n            \"userPrincipalName\": \"annew@CIE493742.onmicrosoft.com\",\n            \"mailNickname\": \"annew\"\n        }\n        \"\"\"  # noqa\n        return MockedResponse(HTTPStatus.OK, response_data)\n\n    def get_expected_to_str(self):\n        return \"annew@CIE493742.onmicrosoft.com\"\n\n    def test_invalid_data(self):\n        response = MockedResponse(HTTPStatus.OK, json.dumps({}))\n        with self.assertRaises(OAuth2Error):\n            # No id, raises\n            _check_errors(response)\n\n    def test_profile_invalid_response(self):\n        data = {\n            \"error\": {\n                \"code\": \"InvalidAuthenticationToken\",\n                \"message\": \"Access token validation failure. Invalid audience.\",\n            }\n        }\n        response = MockedResponse(HTTPStatus.UNAUTHORIZED, json.dumps(data))\n\n        with self.assertRaises(OAuth2Error):\n            # no id, 4xx code, raises with message\n            _check_errors(response)\n\n    def test_invalid_response(self):\n        response = MockedResponse(HTTPStatus.OK, \"invalid json data\")\n        with self.assertRaises(OAuth2Error):\n            # bad json, raises\n            _check_errors(response)\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/miro/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/miro/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.miro.provider import MiroProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass MiroTests(OAuth2TestsMixin, TestCase):\n    provider_id = MiroProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n                \"type\" : \"user\",\n                \"id\" : \"5298357290348572584\",\n                \"name\" : \"Pavel Oborin\",\n                \"createdAt\" : \"2017-03-23T09:41:01Z\",\n                \"role\" : \"developer\",\n                \"email\" : \"oborin.p@gmail.com\",\n                \"state\" : \"registered\",\n                \"picture\" : {\n                    \"type\" : \"picture\",\n                    \"id\" : \"Optional[5289752983457238457]\",\n                    \"imageUrl\" : \"https://r.miro.com/some/image\"\n                }\n            }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"oborin.p@gmail.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/naver/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/naver/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.naver.provider import NaverProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass NaverTests(OAuth2TestsMixin, TestCase):\n    provider_id = NaverProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\n\"response\":\n{\n\"enc_id\": \"46111c25f969116de4e545f13a415bb5383db2a79782da8851db72b2cced3180\",\n\"nickname\": \"\\ubc31\\ud638\",\n\"profile_image\":\n\"https://ssl.pstatic.net/static/pwe/address/nodata_33x33.gif\",\n\"gender\": \"M\",\n\"id\": \"7163491\",\n\"age\": \"20-29\",\n\"birthday\": \"03-22\",\n\"email\": \"shlee940322@example.com\",\n\"name\": \"\\uc774\\uc0c1\\ud601\"\n},\n\"message\": \"success\",\n\"resultcode\": \"00\"\n}\n\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"shlee940322@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/netiq/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/netiq/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.netiq.provider import NetIQProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass NetIQTests(OAuth2TestsMixin, TestCase):\n    provider_id = NetIQProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n            {\n                \"sub\": \"d4c094dd899ab0408fb9d4c094dd899a\",\n                \"acr\": \"secure/name/password/uri\",\n                \"preferred_username\": \"Mocktest\",\n                \"email\": \"mocktest@your.netiq.server.example.com\",\n                \"nickname\": \"Mocktest\",\n                \"family_name\": \"test\",\n                \"given_name\": \"Mock\",\n                \"website\": \"https://www.exanple.com\"\n            }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"mocktest@your.netiq.server.example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/nextcloud/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/nextcloud/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\n\nfrom allauth.socialaccount.providers.nextcloud.provider import NextCloudProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\n@override_settings(\n    SOCIALACCOUNT_PROVIDERS={\"nextcloud\": {\"SERVER\": \"https://nextcloud.example.org\"}}\n)\nclass NextCloudTests(OAuth2TestsMixin, TestCase):\n    provider_id = NextCloudProvider.id\n\n    def get_login_response_json(self, with_refresh_token=True):\n        return (\n            super()\n            .get_login_response_json(with_refresh_token=with_refresh_token)\n            .replace(\"uid\", \"user_id\")\n        )\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\n  \"ocs\": {\n    \"meta\": {\n      \"status\": \"ok\",\n      \"statuscode\": 100,\n      \"message\": \"OK\",\n      \"totalitems\": \"\",\n      \"itemsperpage\": \"\"\n    },\n    \"data\": {\n      \"enabled\": true,\n      \"storageLocation\": \"\\\\/var\\\\/www\\\\/html\\\\/data\\\\/pennersr\",\n      \"id\": \"pennersr\",\n      \"lastLogin\": 1730973409000,\n      \"backend\": \"Database\",\n      \"subadmin\": [],\n      \"quota\": {\n        \"free\": 9159623057408,\n        \"used\": 1585107741,\n        \"total\": 9161208165149,\n        \"relative\": 0.02,\n        \"quota\": -3\n      },\n      \"email\": \"batman@wayne.com\",\n      \"displayname\": \"pennersr\",\n      \"phone\": \"\",\n      \"address\": \"\",\n      \"website\": \"\",\n      \"twitter\": \"\",\n      \"groups\": [\n        \"admin\"\n      ],\n      \"language\": \"nl\",\n      \"locale\": \"\"\n    }\n  }\n}\n\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"batman@wayne.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/notion/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/notion/tests.py",
    "content": "from http import HTTPStatus\nfrom urllib.parse import parse_qs, urlparse\n\nfrom django.test import TestCase\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nfrom allauth.socialaccount.providers.notion.provider import NotionProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse, mocked_response\n\n\nclass NotionTests(OAuth2TestsMixin, TestCase):\n    provider_id = NotionProvider.id\n    pkce_enabled_default = False  # Notion does not support PKCE.\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n            {\n                \"workspace_id\": \"workspace-abc\",\n                \"workspace_name\": \"My Workspace\",\n                \"owner\": {\n                    \"user\": {\n                        \"id\": \"test123\",\n                        \"name\": \"John Doe\",\n                        \"avatar_url\": \"\",\n                        \"person\": {\"email\": \"john@example.com\"},\n                    }\n                },\n            }\n            \"\"\",\n        )  # noqa\n\n    def get_expected_to_str(self):\n        return \"John Doe (My Workspace)\"\n\n    def get_login_response_json(self, with_refresh_token=False):\n        \"\"\"\n        Docs here:\n        https://developers.notion.com/docs/authorization#step-4-notion-responds-with-an-access_token-and-additional-information\n        \"\"\"\n        return \"\"\"\n        {\n            \"access_token\": \"testac\",\n            \"bot_id\": \"bot-abc\",\n            \"duplicated_template_id\": \"template-abc\",\n            \"owner\": {\n            \"workspace_id\": \"workspace-abc\",\n                \"user\": {\n                    \"id\": \"test123\",\n                    \"name\": \"John Doe\",\n                    \"avatar_url\": \"\",\n                    \"person\": {\n                        \"email\": \"john@example.com\"\n                    }\n                }\n            },\n            \"workspace_icon\": \"https://example.com/icon.png\",\n            \"workspace_id\": \"workspace-abc\",\n            \"workspace_name\": \"My Workspace\"\n        }\n        \"\"\"\n\n    def login(self, resp_mock=None, process=\"login\", with_refresh_token=True):\n        resp = self.client.post(\n            f\"{reverse(f'{self.provider.id}_login')}?{urlencode(dict(process=process))}\"\n        )\n\n        p = urlparse(resp[\"location\"])\n        q = parse_qs(p.query)\n\n        complete_url = reverse(f\"{self.provider.id}_callback\")\n        response_json = self.get_login_response_json(\n            with_refresh_token=with_refresh_token\n        )\n\n        if isinstance(resp_mock, list):\n            resp_mocks = resp_mock\n        elif resp_mock is None:\n            resp_mocks = []\n        else:\n            resp_mocks = [resp_mock]\n\n        with mocked_response(\n            MockedResponse(\n                HTTPStatus.OK, response_json, {\"content-type\": \"application/json\"}\n            ),\n            *resp_mocks,\n        ):\n            resp = self.client.get(complete_url, self.get_complete_parameters(q))\n\n        return resp\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/oauth2/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/oauth2/tests/test_views.py",
    "content": "import copy\n\nfrom django.urls import reverse\n\nimport pytest\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.socialaccount.adapter import get_adapter\n\n\n@pytest.mark.parametrize(\n    \"samesite_strict,did_already_redirect,expect_redirect\",\n    [\n        (True, False, True),\n        (True, True, False),\n        (False, False, False),\n    ],\n)\ndef test_samesite_strict(\n    client,\n    samesite_strict,\n    settings,\n    google_provider_settings,\n    did_already_redirect,\n    expect_redirect,\n    db,\n):\n    settings.SESSION_COOKIE_SAMESITE = \"Strict\" if samesite_strict else \"Lax\"\n    query = \"?state=123\"\n    resp = client.get(\n        reverse(\"google_callback\") + query + (\"&_redir\" if did_already_redirect else \"\")\n    )\n    if expect_redirect:\n        assertTemplateUsed(resp, \"socialaccount/login_redirect.html\")\n        assert (\n            resp.context[\"redirect_to\"]\n            == f\"{reverse('google_callback')}{query}&_redir=\"\n        )\n    else:\n        assertTemplateUsed(resp, \"socialaccount/authentication_error.html\")\n\n\n@pytest.mark.parametrize(\"pkce_enabled\", [False, True])\ndef test_config_from_app_settings(\n    google_provider_settings, rf, db, settings, pkce_enabled\n):\n    settings.SOCIALACCOUNT_PROVIDERS = copy.deepcopy(settings.SOCIALACCOUNT_PROVIDERS)\n    settings.SOCIALACCOUNT_PROVIDERS[\"google\"][\"APPS\"][0][\"settings\"] = {\n        \"scope\": [\"this\", \"that\"],\n        \"auth_params\": {\"x\": \"y\"},\n        \"oauth_pkce_enabled\": pkce_enabled,\n    }\n    settings.SOCIALACCOUNT_PROVIDERS[\"google\"][\"SCOPE\"] = [\"not-this\"]\n    settings.SOCIALACCOUNT_PROVIDERS[\"google\"][\"AUTH_PARAMS\"] = {\"not\": \"this\"}\n    provider = get_adapter().get_provider(rf.get(\"/\"), \"google\")\n    assert provider.get_scope() == [\"this\", \"that\"]\n    assert provider.get_auth_params() == {\"x\": \"y\"}\n    assert (\"code_verifier\" in provider.get_pkce_params().keys()) == pkce_enabled\n\n\n@pytest.mark.parametrize(\"pkce_enabled\", [False, True])\ndef test_config_from_provider_config(\n    google_provider_settings, rf, db, settings, pkce_enabled\n):\n    settings.SOCIALACCOUNT_PROVIDERS = copy.deepcopy(settings.SOCIALACCOUNT_PROVIDERS)\n    settings.SOCIALACCOUNT_PROVIDERS[\"google\"][\"SCOPE\"] = [\"some-scope\"]\n    settings.SOCIALACCOUNT_PROVIDERS[\"google\"][\"AUTH_PARAMS\"] = {\"auth\": \"param\"}\n    settings.SOCIALACCOUNT_PROVIDERS[\"google\"][\"OAUTH_PKCE_ENABLED\"] = pkce_enabled\n    provider = get_adapter().get_provider(rf.get(\"/\"), \"google\")\n    assert provider.get_scope() == [\"some-scope\"]\n    assert provider.get_auth_params() == {\"auth\": \"param\"}\n    assert (\"code_verifier\" in provider.get_pkce_params().keys()) == pkce_enabled\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/odnoklassniki/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/odnoklassniki/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.odnoklassniki.provider import OdnoklassnikiProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass OdnoklassnikiTests(OAuth2TestsMixin, TestCase):\n    provider_id = OdnoklassnikiProvider.id\n\n    def get_mocked_response(self, verified_email=True):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\"uid\":\"561999209121\",\"birthday\":\"1999-09-09\",\"age\":33,\"first_name\":\"Ivan\",\n\"last_name\":\"Petrov\",\"name\":\"Ivan Petrov\",\"locale\":\"en\",\"gender\":\"male\",\n\"has_email\":true,\"location\":{\"city\":\"Moscow\",\"country\":\"RUSSIAN_FEDERATION\",\n\"countryCode\":\"RU\",\"countryName\":\"Russia\"},\"online\":\"web\",\"pic_1\":\n\"http://i500.mycdn.me/res/stub_50x50.gif\",\n\"pic_2\":\"http://usd1.mycdn.me/res/stub_128x96.gif\"}\n\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"Ivan Petrov\"\n\n    def get_login_response_json(self, with_refresh_token=True):\n        return '{\"access_token\": \"testac\"}'  # noqa\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/okta/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/okta/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.okta.provider import OktaProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass OktaTests(OAuth2TestsMixin, TestCase):\n    provider_id = OktaProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n            {\n                \"sub\": \"00u33ow83pjQpCQJr1j8\",\n                \"name\": \"Jon Smith\",\n                \"locale\": \"AE\",\n                \"email\": \"jsmith@example.com\",\n                \"nickname\": \"Jon Smith\",\n                \"preferred_username\": \"jsmith@example.com\",\n                \"given_name\": \"Jon\",\n                \"family_name\": \"Smith\",\n                \"zoneinfo\": \"America/Los_Angeles\",\n                \"updated_at\": 1601285210,\n                \"email_verified\": true\n            }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"jsmith@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/openid/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/openid/tests.py",
    "content": "import urllib.error\nfrom http import HTTPStatus\nfrom unittest.mock import Mock, patch\n\nfrom django.conf import settings\nfrom django.contrib.auth import get_user_model\nfrom django.test import override_settings\nfrom django.urls import reverse\n\nimport pytest\nfrom openid import fetchers\nfrom openid.consumer import consumer\nfrom openid.message import InvalidOpenIDNamespace\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.openid import views\nfrom allauth.socialaccount.providers.openid.utils import AXAttribute\n\n\nclass TestFetcher(fetchers.Urllib2Fetcher):\n    def fetch(self, url, body=None, headers=None):\n        if url == \"https://steamcommunity.com/openid\":\n            return fetchers.HTTPResponse(\n                final_url=\"https://steamcommunity.com/openid\",\n                status=HTTPStatus.OK,\n                headers={\"content-type\": \"application/xrds+xml;charset=utf-8\"},\n                body='<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<xrds:XRDS xmlns:xrds=\"xri://$xrds\" xmlns=\"xri://$xrd*($v*2.0)\">\\n\\t<XRD>\\n\\t\\t<Service priority=\"0\">\\n\\t\\t\\t<Type>http://specs.openid.net/auth/2.0/server</Type>\\t\\t\\n\\t\\t\\t<URI>https://steamcommunity.com/openid/login</URI>\\n\\t\\t</Service>\\n\\t</XRD>\\n</xrds:XRDS>',\n            )\n        if url == \"https://steamcommunity.com/openid/login\":\n            return fetchers.HTTPResponse(\n                final_url=\"https://steamcommunity.com/openid/login\",\n                status=HTTPStatus.OK,\n                headers={\"content-type\": \"text/plain;charset=utf-8\"},\n                body=\"ns:http://specs.openid.net/auth/2.0\\nerror_code:unsupported-type\\nerror:Associations not supported\\n\",\n            )\n\n        if url == \"https://discovery-failure.com/\":\n            raise urllib.error.URLError\n        ret = super().fetch(url, body=body, headers=headers)\n        breakpoint()\n        return ret\n\n\n@pytest.fixture(autouse=True)\ndef setup_fetcher():\n    old_fetcher = fetchers.getDefaultFetcher()\n    fetchers.setDefaultFetcher(TestFetcher())\n    yield\n    fetchers.setDefaultFetcher(old_fetcher)\n\n\ndef test_discovery_failure(client):\n    \"\"\"\n    This used to generate a server 500:\n    DiscoveryFailure: No usable OpenID services found\n    for http://www.google.com/\n    \"\"\"\n    resp = client.post(\n        reverse(\"openid_login\"), dict(openid=\"https://discovery-failure.com/\")\n    )\n    assert \"openid\" in resp.context[\"form\"].errors\n\n\ndef test_login(client, db):\n    # Location: https://s.yimg.com/wm/mbr/html/openid-eol-0.0.1.html\n    resp = client.post(\n        reverse(views.login), dict(openid=\"https://steamcommunity.com/openid\")\n    )\n    assert \"steamcommunity.com/openid/login\" in resp[\"location\"]\n    with patch(\n        \"allauth.socialaccount.providers.openid.views._openid_consumer\"\n    ) as consumer_mock:\n        consumer_client = Mock()\n        complete = Mock()\n        consumer_mock.return_value = consumer_client\n        consumer_client.complete = complete\n        complete_response = Mock()\n        complete.return_value = complete_response\n        complete_response.status = consumer.SUCCESS\n        complete_response.identity_url = \"http://dummy/john/\"\n        with patch(\n            \"allauth.socialaccount.providers.openid.utils.SRegResponse\"\n        ) as sr_mock:\n            with patch(\n                \"allauth.socialaccount.providers.openid.utils.FetchResponse\"\n            ) as fr_mock:\n                sreg_mock = Mock()\n                ax_mock = Mock()\n                sr_mock.fromSuccessResponse = sreg_mock\n                fr_mock.fromSuccessResponse = ax_mock\n                sreg_mock.return_value = {}\n                ax_mock.return_value = {AXAttribute.PERSON_FIRST_NAME: [\"raymond\"]}\n                resp = client.post(reverse(\"openid_callback\"))\n                assert resp[\"location\"] == \"/accounts/profile/\"\n                get_user_model().objects.get(first_name=\"raymond\")\n                social_account = SocialAccount.objects.get(\n                    uid=complete_response.identity_url\n                )\n                account = social_account.get_provider_account()\n                assert account.to_str() == complete_response.identity_url\n\n\n@override_settings(\n    SOCIALACCOUNT_PROVIDERS={\n        \"openid\": {\n            \"SERVERS\": [\n                dict(\n                    id=\"yahoo\",\n                    name=\"Yahoo\",\n                    openid_url=\"http://me.yahoo.com\",\n                    extra_attributes=[\n                        (\n                            \"phone\",\n                            \"http://axschema.org/contact/phone/default\",\n                            True,\n                        )\n                    ],\n                )\n            ]\n        }\n    }\n)\ndef test_login_with_extra_attributes(client, db):\n    with patch(\"allauth.socialaccount.providers.openid.views.QUERY_EMAIL\", True):\n        resp = client.post(\n            reverse(views.login), dict(openid=\"https://steamcommunity.com/openid\")\n        )\n    assert \"steamcommunity.com/openid/login\" in resp[\"location\"]\n    with patch(\n        \"allauth.socialaccount.providers.openid.views._openid_consumer\"\n    ) as consumer_mock:\n        consumer_client = Mock()\n        complete = Mock()\n        endpoint = Mock()\n        consumer_mock.return_value = consumer_client\n        consumer_client.complete = complete\n        complete_response = Mock()\n        complete.return_value = complete_response\n        complete_response.endpoint = endpoint\n        complete_response.endpoint.server_url = \"http://me.yahoo.com\"\n        complete_response.status = consumer.SUCCESS\n        complete_response.identity_url = \"http://dummy/john/\"\n        with patch(\n            \"allauth.socialaccount.providers.openid.utils.SRegResponse\"\n        ) as sr_mock:\n            with patch(\n                \"allauth.socialaccount.providers.openid.utils.FetchResponse\"\n            ) as fr_mock:\n                sreg_mock = Mock()\n                ax_mock = Mock()\n                sr_mock.fromSuccessResponse = sreg_mock\n                fr_mock.fromSuccessResponse = ax_mock\n                sreg_mock.return_value = {}\n                ax_mock.return_value = {\n                    AXAttribute.CONTACT_EMAIL: [\"raymond@example.com\"],\n                    AXAttribute.PERSON_FIRST_NAME: [\"raymond\"],\n                    \"http://axschema.org/contact/phone/default\": [\"123456789\"],\n                }\n                resp = client.post(reverse(\"openid_callback\"))\n                assert resp[\"location\"] == \"/accounts/profile/\"\n                socialaccount = SocialAccount.objects.get(user__first_name=\"raymond\")\n                assert socialaccount.extra_data.get(\"phone\") == \"123456789\"\n\n\ndef test_callback_error(client, db):\n    with patch(\n        \"allauth.socialaccount.providers.openid.views._openid_consumer\"\n    ) as consumer_mock:\n        consumer_client = Mock()\n        complete = Mock()\n        consumer_mock.return_value = consumer_client\n        consumer_client.complete = complete\n\n        def raise_invalid_openid_namespace(*args, **kwargs):\n            raise InvalidOpenIDNamespace(\"Invalid OpenID Namespace 'http://evil.com'\")\n\n        complete.side_effect = raise_invalid_openid_namespace\n        template_ext = getattr(settings, \"ACCOUNT_TEMPLATE_EXTENSION\", \"html\")\n        with patch(\n            \"allauth.socialaccount.providers.openid.utils.SRegResponse\"\n        ) as sr_mock:\n            with patch(\n                \"allauth.socialaccount.providers.openid.utils.FetchResponse\"\n            ) as fr_mock:\n                sreg_mock = Mock()\n                ax_mock = Mock()\n                sr_mock.fromSuccessResponse = sreg_mock\n                fr_mock.fromSuccessResponse = ax_mock\n                sreg_mock.return_value = {}\n                ax_mock.return_value = {AXAttribute.PERSON_FIRST_NAME: [\"raymond\"]}\n                resp = client.post(reverse(\"openid_callback\"))\n                assertTemplateUsed(\n                    resp, f\"socialaccount/authentication_error.{template_ext}\"\n                )\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/openid_connect/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/openid_connect/tests.py",
    "content": "from django.test import TestCase\n\nimport pytest\n\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.openid_connect.provider import (\n    OpenIDConnectProviderAccount,\n)\nfrom tests.apps.socialaccount.base import OpenIDConnectTests\n\n\nclass OpenIDConnectFetchUserInfoTests(OpenIDConnectTests, TestCase):\n    provider_id = \"oidc-server\"\n\n\nclass OpenIDConnectUseIDTokenTests(OpenIDConnectTests, TestCase):\n    provider_id = \"other-oidc-server\"\n\n    def setup_provider(self):\n        super().setup_provider()\n        self.app.settings[\"fetch_userinfo\"] = False\n        self.app.save()\n        self.extra_data = self.id_token\n\n\n@pytest.mark.parametrize(\n    \"extra_data,expected_to_str\",\n    [\n        ({\"username\": \"compatpre6511\"}, \"compatpre6511\"),\n        ({\"id_token\": {\"username\": \"idtokusr\"}}, \"idtokusr\"),\n        ({\"userinfo\": {\"username\": \"userinfousr\"}}, \"userinfousr\"),\n    ],\n)\ndef test_socialaccount_extra_data(extra_data, expected_to_str):\n    sa = SocialAccount()\n    sa.extra_data = extra_data\n    assert OpenIDConnectProviderAccount(sa).to_str() == expected_to_str\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/openstreetmap/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/openstreetmap/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.openstreetmap.provider import OpenStreetMapProvider\nfrom tests.apps.socialaccount.base import OAuthTestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass OpenStreetMapTests(OAuthTestsMixin, TestCase):\n    provider_id = OpenStreetMapProvider.id\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                r\"\"\"\n{\n  \"version\": \"0.6\",\n  \"generator\": \"OpenStreetMap server\",\n  \"copyright\": \"OpenStreetMap and contributors\",\n  \"attribution\": \"http://www.openstreetmap.org/copyright\",\n  \"license\": \"http://opendatacommons.org/licenses/odbl/1-0/\",\n  \"user\": {\n    \"id\": 1,\n    \"display_name\": \"Steve\",\n    \"account_created\": \"2024-11-06T20:11:01Z\",\n    \"description\": \"\",\n    \"contributor_terms\": {\n      \"agreed\": true,\n      \"pd\": true\n    },\n    \"img\": {\n      \"href\": \"https://secure.gravatar.com/avatar.jpg\"\n    },\n    \"roles\": [],\n    \"changesets\": {\n      \"count\": 0\n    },\n    \"traces\": {\n      \"count\": 0\n    },\n    \"blocks\": {\n      \"received\": {\n        \"count\": 0,\n        \"active\": 0\n      }\n    },\n    \"languages\": [\n      \"en-US\",\n      \"en\"\n    ],\n    \"messages\": {\n      \"received\": {\n        \"count\": 0,\n        \"unread\": 0\n      },\n      \"sent\": {\n        \"count\": 0\n      }\n    }\n  }\n}\n\"\"\",\n            )\n        ]  # noqa\n\n    def get_expected_to_str(self):\n        return \"Steve\"\n\n    def test_login(self):\n        super().test_login()\n        account = SocialAccount.objects.get(uid=\"1\")\n        osm_account = account.get_provider_account()\n        self.assertEqual(osm_account.get_username(), \"Steve\")\n        self.assertEqual(\n            osm_account.get_avatar_url(),\n            \"https://secure.gravatar.com/avatar.jpg\",\n        )\n        self.assertEqual(\n            osm_account.get_profile_url(),\n            \"https://www.openstreetmap.org/user/Steve\",\n        )\n        self.assertEqual(osm_account.to_str(), \"Steve\")\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/orcid/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/orcid/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.orcid.provider import OrcidProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass OrcidTests(OAuth2TestsMixin, TestCase):\n    provider_id = OrcidProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n    {\n    \"orcid-identifier\": {\n        \"uri\": \"https://sandbox.orcid.org/0000-0001-6796-198X\",\n        \"path\": \"0000-0001-6796-198X\",\n        \"host\": \"sandbox.orcid.org\"\n    },\n    \"preferences\": {\n        \"locale\": \"EN\"\n    },\n    \"history\": {\n        \"creation-method\": \"MEMBER_REFERRED\",\n        \"completion-date\": null,\n        \"submission-date\": {\n        \"value\": 1456951327337\n        },\n        \"last-modified-date\": {\n        \"value\": 1519493486728\n        },\n        \"claimed\": true,\n        \"source\": null,\n        \"deactivation-date\": null,\n        \"verified-email\": true,\n        \"verified-primary-email\": true\n    },\n    \"person\": {\n        \"last-modified-date\": {\n        \"value\": 1519493469738\n        },\n        \"name\": {\n        \"created-date\": {\n            \"value\": 1460669254582\n        },\n        \"last-modified-date\": {\n            \"value\": 1460669254582\n        },\n        \"given-names\": {\n            \"value\": \"Patricia\"\n        },\n        \"family-name\": {\n            \"value\": \"Lawrence\"\n        },\n        \"credit-name\": null,\n        \"source\": null,\n        \"visibility\": \"PUBLIC\",\n        \"path\": \"0000-0001-6796-198X\"\n        },\n        \"other-names\": {\n        \"last-modified-date\": null,\n        \"other-name\": [],\n        \"path\": \"/0000-0001-6796-198X/other-names\"\n        },\n        \"biography\": {\n        \"created-date\": {\n            \"value\": 1460669254583\n        },\n        \"last-modified-date\": {\n            \"value\": 1460669254583\n        },\n        \"content\": null,\n        \"visibility\": \"PUBLIC\",\n        \"path\": \"/0000-0001-6796-198X/biography\"\n        },\n        \"researcher-urls\": {\n        \"last-modified-date\": null,\n        \"researcher-url\": [],\n        \"path\": \"/0000-0001-6796-198X/researcher-urls\"\n        },\n        \"emails\": {\n        \"last-modified-date\": {\n            \"value\": 1519493469738\n        },\n        \"email\": [\n            {\n            \"created-date\": {\n                \"value\": 1456951327661\n            },\n            \"last-modified-date\": {\n                \"value\": 1519493469738\n            },\n            \"source\": {\n                \"source-orcid\": {\n                \"uri\": \"https://sandbox.orcid.org/0000-0001-6796-198X\",\n                \"path\": \"0000-0001-6796-198X\",\n                \"host\": \"sandbox.orcid.org\"\n                },\n                \"source-client-id\": null,\n                \"source-name\": {\n                \"value\": \"Patricia Lawrence\"\n                }\n            },\n            \"email\": \"lawrencepatricia@mailinator.com\",\n            \"path\": null,\n            \"visibility\": \"PUBLIC\",\n            \"verified\": true,\n            \"primary\": true,\n            \"put-code\": null\n            }\n        ],\n        \"path\": \"/0000-0001-6796-198X/email\"\n        },\n        \"addresses\": {\n        \"last-modified-date\": null,\n        \"address\": [],\n        \"path\": \"/0000-0001-6796-198X/address\"\n        },\n        \"keywords\": {\n        \"last-modified-date\": null,\n        \"keyword\": [],\n        \"path\": \"/0000-0001-6796-198X/keywords\"\n        },\n        \"external-identifiers\": {\n        \"last-modified-date\": null,\n        \"external-identifier\": [],\n        \"path\": \"/0000-0001-6796-198X/external-identifiers\"\n        },\n        \"path\": \"/0000-0001-6796-198X/person\"\n    },\n    \"activities-summary\": {\n        \"last-modified-date\": {\n        \"value\": 1513777479628\n        },\n        \"educations\": {\n        \"last-modified-date\": {\n            \"value\": 1459957293365\n        },\n        \"education-summary\": [\n            {\n            \"created-date\": {\n                \"value\": 1459957293365\n            },\n            \"last-modified-date\": {\n                \"value\": 1459957293365\n            },\n            \"source\": {\n                \"source-orcid\": {\n                \"uri\": \"https://sandbox.orcid.org/0000-0001-6796-198X\",\n                \"path\": \"0000-0001-6796-198X\",\n                \"host\": \"sandbox.orcid.org\"\n                },\n                \"source-client-id\": null,\n                \"source-name\": {\n                \"value\": \"Patricia Lawrence\"\n                }\n            },\n            \"department-name\": null,\n            \"role-title\": null,\n            \"start-date\": null,\n            \"end-date\": null,\n            \"organization\": {\n                \"name\": \"Polytech'Rambouillet\",\n                \"address\": {\n                \"city\": \"Rambouillet\",\n                \"region\": null,\n                \"country\": \"FR\"\n                },\n                \"disambiguated-organization\": null\n            },\n            \"visibility\": \"PUBLIC\",\n            \"put-code\": 19996,\n            \"path\": \"/0000-0001-6796-198X/education/19996\"\n            }\n        ],\n        \"path\": \"/0000-0001-6796-198X/educations\"\n        },\n        \"employments\": {\n        \"last-modified-date\": {\n            \"value\": 1513777479628\n        },\n        \"employment-summary\": [\n            {\n            \"created-date\": {\n                \"value\": 1510399314937\n            },\n            \"last-modified-date\": {\n                \"value\": 1513777479628\n            },\n            \"source\": {\n                \"source-orcid\": {\n                \"uri\": \"https://sandbox.orcid.org/0000-0001-6796-198X\",\n                \"path\": \"0000-0001-6796-198X\",\n                \"host\": \"sandbox.orcid.org\"\n                },\n                \"source-client-id\": null,\n                \"source-name\": {\n                \"value\": \"Patricia Lawrence\"\n                }\n            },\n            \"department-name\": null,\n            \"role-title\": null,\n            \"start-date\": {\n                \"year\": {\n                \"value\": \"2015\"\n                },\n                \"month\": {\n                \"value\": \"03\"\n                },\n                \"day\": {\n                \"value\": \"02\"\n                }\n            },\n            \"end-date\": null,\n            \"organization\": {\n                \"name\": \"École nationale supérieure de céramique industrielle\",\n                \"address\": {\n                \"city\": \"Limoges\",\n                \"region\": null,\n                \"country\": \"FR\"\n                },\n                \"disambiguated-organization\": {\n                \"disambiguated-organization-identifier\": \"105362\",\n                \"disambiguation-source\": \"RINGGOLD\"\n                }\n            },\n            \"visibility\": \"PUBLIC\",\n            \"put-code\": 29138,\n            \"path\": \"/0000-0001-6796-198X/employment/29138\"\n            },\n            {\n            \"created-date\": {\n                \"value\": 1502366640610\n            },\n            \"last-modified-date\": {\n                \"value\": 1513777467282\n            },\n            \"source\": {\n                \"source-orcid\": {\n                \"uri\": \"https://sandbox.orcid.org/0000-0001-6796-198X\",\n                \"path\": \"0000-0001-6796-198X\",\n                \"host\": \"sandbox.orcid.org\"\n                },\n                \"source-client-id\": null,\n                \"source-name\": {\n                \"value\": \"Patricia Lawrence\"\n                }\n            },\n            \"department-name\": null,\n            \"role-title\": null,\n            \"start-date\": {\n                \"year\": {\n                \"value\": \"2002\"\n                },\n                \"month\": {\n                \"value\": \"02\"\n                },\n                \"day\": {\n                \"value\": \"16\"\n                }\n            },\n            \"end-date\": {\n                \"year\": {\n                \"value\": \"2015\"\n                },\n                \"month\": {\n                \"value\": \"08\"\n                },\n                \"day\": {\n                \"value\": \"12\"\n                }\n            },\n            \"organization\": {\n                \"name\": \"University of Cambridge\",\n                \"address\": {\n                \"city\": \"Cambridge\",\n                \"region\": \"Cambridgeshire\",\n                \"country\": \"GB\"\n                },\n                \"disambiguated-organization\": {\n                \"disambiguated-organization-identifier\": \"2152\",\n                \"disambiguation-source\": \"RINGGOLD\"\n                }\n            },\n            \"visibility\": \"PUBLIC\",\n            \"put-code\": 27562,\n            \"path\": \"/0000-0001-6796-198X/employment/27562\"\n            }\n        ],\n        \"path\": \"/0000-0001-6796-198X/employments\"\n        },\n        \"fundings\": {\n        \"last-modified-date\": null,\n        \"group\": [],\n        \"path\": \"/0000-0001-6796-198X/fundings\"\n        },\n        \"peer-reviews\": {\n        \"last-modified-date\": null,\n        \"group\": [],\n        \"path\": \"/0000-0001-6796-198X/peer-reviews\"\n        },\n        \"works\": {\n        \"last-modified-date\": {\n            \"value\": 1459957753077\n        },\n        \"group\": [\n            {\n            \"last-modified-date\": {\n                \"value\": 1459957753077\n            },\n            \"external-ids\": {\n                \"external-id\": []\n            },\n            \"work-summary\": [\n                {\n                \"put-code\": 583440,\n                \"created-date\": {\n                    \"value\": 1459957753047\n                },\n                \"last-modified-date\": {\n                    \"value\": 1459957753077\n                },\n                \"source\": {\n                    \"source-orcid\": {\n                    \"uri\": \"https://sandbox.orcid.org/0000-0001-6796-198X\",\n                    \"path\": \"0000-0001-6796-198X\",\n                    \"host\": \"sandbox.orcid.org\"\n                    },\n                    \"source-client-id\": null,\n                    \"source-name\": {\n                    \"value\": \"Patricia Lawrence\"\n                    }\n                },\n                \"title\": {\n                    \"title\": {\n                    \"value\": \"Standard & Poor's fiscal methodology reviewed\"\n                    },\n                    \"subtitle\": null,\n                    \"translated-title\": null\n                },\n                \"external-ids\": {\n                    \"external-id\": []\n                },\n                \"type\": \"JOURNAL_ARTICLE\",\n                \"publication-date\": {\n                    \"year\": {\n                    \"value\": \"2001\"\n                    },\n                    \"month\": {\n                    \"value\": \"07\"\n                    },\n                    \"day\": {\n                    \"value\": \"14\"\n                    },\n                    \"media-type\": null\n                },\n                \"visibility\": \"PUBLIC\",\n                \"path\": \"/0000-0001-6796-198X/work/583440\",\n                \"display-index\": \"0\"\n                }\n            ]\n            }\n        ],\n        \"path\": \"/0000-0001-6796-198X/works\"\n        },\n        \"path\": \"/0000-0001-6796-198X/activities\"\n    },\n    \"path\": \"/0000-0001-6796-198X\"\n    }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"Orcid.org\"\n\n    def get_login_response_json(self, with_refresh_token=True):\n        # TODO: This is not an actual response. I added this in order\n        # to get the test suite going but did not verify to check the\n        # exact response being returned.\n        return \"\"\"\n        {\n            \"access_token\": \"testac\",\n            \"expires_in\": 631138026,\n            \"token_type\": \"bearer\",\n            \"orcid\": \"0000-0001-6796-198X\",\n            \"scope\": \"/orcid-profile/read-limited\",\n            \"refresh_token\": \"testrf\"\n        }\"\"\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/patreon/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/patreon/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.patreon.provider import PatreonProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass PatreonTests(OAuth2TestsMixin, TestCase):\n    provider_id = PatreonProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n        \"data\": {\n            \"relationships\": {\n                \"pledges\": {\n                    \"data\": [{\n                        \"type\": \"pledge\", \"id\": \"123456\"\n                    }]\n                }\n            },\n            \"attributes\": {\n                \"last_name\": \"Interwebs\",\n                \"is_suspended\": false,\n                \"has_password\": true,\n                \"full_name\": \"John Interwebs\",\n                \"is_nuked\": false,\n                \"first_name\": \"John\",\n                \"social_connections\": {\n                    \"spotify\": null,\n                    \"discord\": null,\n                    \"twitter\": null,\n                    \"youtube\": null,\n                    \"facebook\": null,\n                    \"deviantart\": null,\n                    \"twitch\": null\n                },\n                \"twitter\": null,\n                \"is_email_verified\": true,\n                \"facebook_id\": null,\n                \"email\": \"john@example.com\",\n                \"facebook\": null,\n                \"thumb_url\": \"https://c8.patreon.com/100/123456\",\n                \"vanity\": null,\n                \"about\": null,\n                \"is_deleted\": false,\n                \"created\": \"2017-05-05T05:16:34+00:00\",\n                \"url\": \"https://www.patreon.com/user?u=123456\",\n                \"gender\": 0,\n                \"youtube\": null,\n                \"discord_id\": null,\n                \"image_url\": \"https://c8.patreon.com/400/123456\",\n                \"twitch\": null\n            },\n            \"type\": \"user\",\n            \"id\": \"123456\"\n        }\n        }\"\"\",\n        )  # noqa\n\n    def get_expected_to_str(self):\n        return \"john@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/paypal/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/paypal/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.paypal.provider import PaypalProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass PaypalTests(OAuth2TestsMixin, TestCase):\n    provider_id = PaypalProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n            \"user_id\":\n            \"https://www.paypal.com/webapps/auth/server/64ghr894040044\",\n            \"name\": \"Jane Doe\",\n            \"given_name\": \"Jane\",\n            \"family_name\": \"Doe\",\n            \"email\": \"janedoe@example.com\"\n        }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"janedoe@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/pinterest/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/pinterest/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\n\nfrom allauth.socialaccount.providers.pinterest.provider import PinterestProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass PinterestTests(OAuth2TestsMixin, TestCase):\n    provider_id = PinterestProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n            {\n                \"data\": {\n                    \"url\": \"https://www.pinterest.com/muravskiyyarosl/\",\n                    \"first_name\": \"Jane\",\n                    \"last_name\": \"Doe\",\n                    \"id\": \"351247977031674143\"\n                }\n            }\n            \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"Jane Doe\"\n\n    @override_settings(\n        SOCIALACCOUNT_AUTO_SIGNUP=False,\n        SOCIALACCOUNT_PROVIDERS={\n            \"pinterest\": {\n                \"API_VERSION\": \"v5\",\n            }\n        },\n    )\n    def test_login_v5(self):\n        self.provider_id = PinterestProvider.id\n        resp = self.login(\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"\n                {\n                    \"account_type\": \"BUSINESS\",\n                    \"profile_image\": \"https://i.pinimg.com/280x280_RS/5c/88/2f/5c882f4b02468fcd6cda2ce569c2c166.jpg\",\n                    \"website_url\": \"https://sns-sdks.github.io/\",\n                    \"username\": \"enjoylifebot\"\n                }\n                \"\"\",\n            ),\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/pocket/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/pocket/tests.py",
    "content": "from http import HTTPStatus\nfrom urllib.parse import parse_qs, urlencode, urlparse\n\nfrom django.test import TestCase\nfrom django.urls import reverse\n\nfrom allauth.socialaccount.providers.pocket.provider import PocketProvider\nfrom tests.apps.socialaccount.base import OAuthTestsMixin\nfrom tests.mocking import MockedResponse, mocked_response\n\n\nclass PocketOAuthTests(OAuthTestsMixin, TestCase):\n    provider_id = PocketProvider.id\n\n    def get_mocked_response(self):\n        return []\n\n    def get_expected_to_str(self):\n        return \"name@example.com\"\n\n    def get_access_token_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\"access_token\":\"5678defg-5678-defg-5678-defg56\",\n        \"username\":\"name@example.com\"}\n        \"\"\",\n        )\n\n    def login(self, resp_mocks, process=\"login\"):\n        with mocked_response(\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"\n                {\"code\": \"dcba4321-dcba-4321-dcba-4321dc\"}\n                \"\"\",\n                {\"content-type\": \"application/json\"},\n            )\n        ):\n            resp = self.client.post(\n                reverse(f\"{self.provider.id}_login\")\n                + \"?\"\n                + urlencode(dict(process=process))\n            )\n        p = urlparse(resp[\"location\"])\n        q = parse_qs(p.query)\n        complete_url = reverse(f\"{self.provider.id}_callback\")\n        self.assertGreater(q[\"redirect_uri\"][0].find(complete_url), 0)\n        with mocked_response(self.get_access_token_response(), *resp_mocks):\n            resp = self.client.get(complete_url)\n        return resp\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/questrade/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/questrade/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.questrade.provider import QuestradeProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass QuestradeTests(OAuth2TestsMixin, TestCase):\n    provider_id = QuestradeProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\"userId\":400,\"accounts\":[]}\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"Questrade\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/quickbooks/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/quickbooks/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.quickbooks.provider import QuickBooksOAuth2Provider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass QuickBooksOAuth2Tests(OAuth2TestsMixin, TestCase):\n    provider_id = QuickBooksOAuth2Provider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{       \"sub\": \"d8752092-0f2b-4b6e-86ef-6b72f2457a00\",\n        \"emailVerified\": true,\n        \"familyName\": \"Mckeeman\",\n        \"phoneNumber\": \"+1 4156694355\",\n        \"givenName\": \"Darren\",\n        \"phoneNumberVerified\": true,\n        \"email\": \"darren@blocklight.io\"}\n\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"darren@blocklight.io\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/reddit/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/reddit/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.reddit.provider import RedditProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass RedditTests(OAuth2TestsMixin, TestCase):\n    provider_id = RedditProvider.id\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"{\n        \"name\": \"wayward710\"}\"\"\",\n            )\n        ]\n\n    def get_expected_to_str(self):\n        return \"wayward710\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/robinhood/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/robinhood/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.robinhood.provider import RobinhoodProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass RobinhoodTests(OAuth2TestsMixin, TestCase):\n    provider_id = RobinhoodProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\n  \"username\": \"test_username\",\n  \"id\": \"1234-5678-910\"\n}\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"test_username\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/salesforce/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/salesforce/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.salesforce.provider import SalesforceProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass SalesforceTests(OAuth2TestsMixin, TestCase):\n    provider_id = SalesforceProvider.id\n\n    def get_mocked_response(\n        self,\n        last_name=\"Penners\",\n        first_name=\"Raymond\",\n        name=\"Raymond Penners\",\n        email=\"raymond.penners@gmail.com\",\n        verified_email=True,\n    ):\n        userinfo = USERINFO_RESPONSE.format(\n            org_id=\"00Dxx00000000000A0\",\n            user_id=\"005xx000000aWwRQAU\",\n            vip=\"https://test.salesforce.com\",\n            nickname=\"test-ooi2xhmjteep\",\n            first_name=first_name,\n            last_name=last_name,\n            my_domain=\"https://fun.cs46.my.salesforce.com\",\n            content_domain=\"https://fun--c.cs46.content.force.com\",\n            verified_email=repr(verified_email).lower(),\n            email=email,\n            active=\"true\",\n            is_app_installed=\"true\",\n        )\n        return MockedResponse(HTTPStatus.OK, userinfo)\n\n    def get_expected_to_str(self):\n        return \"raymond.penners@gmail.com\"\n\n\nUSERINFO_RESPONSE = \"\"\"\n{{\n    \"sub\": \"{vip}/id/{org_id}/{user_id}\",\n    \"user_id\": \"{user_id}\",\n    \"organization_id\": \"{org_id}\",\n    \"preferred_username\": \"{nickname}@sample_-_dev_workspace.net\",\n    \"nickname\": \"{nickname}\",\n    \"name\": \"{first_name} {last_name}\",\n    \"email\": \"{email}\",\n    \"email_verified\": {verified_email},\n    \"given_name\": \"{first_name}\",\n    \"family_name\": \"{last_name}\",\n    \"zoneinfo\": \"America/Los_Angeles\",\n    \"photos\": {{\n        \"picture\": \"{content_domain}/profilephoto/005/F\",\n        \"thumbnail\": \"{content_domain}/profilephoto/005/T\"\n    }},\n    \"profile\": \"{my_domain}/{user_id}\",\n    \"picture\": \"{content_domain}/profilephoto/005/F\",\n    \"address\": {{\"country\": \"US\"}},\n    \"urls\": {{\"custom_domain\": \"{my_domain}\"}},\n    \"active\": {active},\n    \"user_type\": \"STANDARD\",\n    \"language\": \"en_US\",\n    \"locale\": \"en_US\",\n    \"utcOffset\": -28800000,\n    \"updated_at\": \"2017-10-05T20:39:02.000+0000\",\n    \"is_app_installed\": {is_app_installed}\n}}\n\"\"\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/saml/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/saml/conftest.py",
    "content": "import base64\nfrom unittest.mock import patch\n\nfrom django.test.client import Client\n\nimport pytest\n\n\n@pytest.fixture\ndef client():\n    client = Client(HTTP_HOST=\"example.com\")\n    return client\n\n\n@pytest.fixture\ndef saml_settings(settings):\n    settings.SOCIALACCOUNT_PROVIDERS = {\n        \"saml\": {\n            \"APPS\": [\n                {\n                    \"client_id\": \"org\",\n                    \"provider_id\": \"urn:dev-123.us.auth0.com\",\n                    \"settings\": {\n                        \"attribute_mapping\": {\n                            \"uid\": \"http://schemas.auth0.com/clientID\",\n                            \"email_verified\": \"http://schemas.auth0.com/email_verified\",\n                            \"email\": \"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress\",\n                        },\n                        \"idp\": {\n                            \"name\": \"Test IdP\",\n                            \"entity_id\": \"urn:dev-123.us.auth0.com\",\n                            \"sso_url\": \"https://dev-123.us.auth0.com/samlp/456\",\n                            \"slo_url\": \"https://dev-123.us.auth0.com/samlp/456\",\n                            \"x509cert\": \"\",\n                        },\n                        \"advanced\": {\n                            \"strict\": False,\n                        },\n                    },\n                }\n            ]\n        }\n    }\n\n\n@pytest.fixture\ndef acs_saml_response_factory():\n    def factory(in_response_to=None):\n        xml = f\"\"\"<samlp:Response xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\" ID=\"123\"  InResponseTo=\"{in_response_to or ''}\"  Version=\"2.0\" IssueInstant=\"2023-07-08T08:24:14.141Z\"  Destination=\"https://allauth.org/accounts/org/acs/\">\n  <saml:Issuer xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">urn:dev-123.us.auth0.com\n  </saml:Issuer>\n  <samlp:Status>\n    <samlp:StatusCode Value=\"urn:oasis:names:tc:SAML:2.0:status:Success\"/>\n  </samlp:Status>\n  <saml:Assertion xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\" Version=\"2.0\" ID=\"123\" IssueInstant=\"2023-07-08T08:24:14.094Z\">\n    <saml:Issuer>urn:dev-123.us.auth0.com\n    </saml:Issuer>\n    <Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\">\n      <SignedInfo>\n        <CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\"/>\n        <SignatureMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\"/>\n        <Reference URI=\"#123\">\n          <Transforms>\n            <Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\"/>\n            <Transform Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\"/>\n          </Transforms>\n          <DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#sha256\"/>\n          <DigestValue>123\n          </DigestValue>\n        </Reference>\n      </SignedInfo>\n      <SignatureValue>If7dFg...\n      </SignatureValue>\n      <KeyInfo>\n        <X509Data>\n          <X509Certificate>MIIDHTCC...\n          </X509Certificate>\n        </X509Data>\n      </KeyInfo>\n    </Signature>\n    <saml:Subject>\n      <saml:NameID Format=\"urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified\">google-oauth2|108204123456789\n      </saml:NameID>\n      <saml:SubjectConfirmation Method=\"urn:oasis:names:tc:SAML:2.0:cm:bearer\">\n        <saml:SubjectConfirmationData NotOnOrAfter=\"2023-07-08T09:24:14.094Z\" Recipient=\"https://allauth.org/accounts/org/acs/\" InResponseTo=\"ONELOGIN_f293b01d18bb0ac85a611b35e0c898af582bcfdd\"/>\n      </saml:SubjectConfirmation>\n    </saml:Subject>\n    <saml:Conditions NotBefore=\"2023-07-08T08:24:14.094Z\" NotOnOrAfter=\"2023-07-08T09:24:14.094Z\">\n      <saml:AudienceRestriction>\n        <saml:Audience>https://allauth.org/accounts/org/metadata/\n        </saml:Audience>\n      </saml:AudienceRestriction>\n    </saml:Conditions>\n    <saml:AuthnStatement AuthnInstant=\"2023-07-08T08:24:14.094Z\" SessionIndex=\"_qPrYdL0O8w3vdb8eCEY5ZtHe76LA8-JU\">\n      <saml:AuthnContext>\n        <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified\n        </saml:AuthnContextClassRef>\n      </saml:AuthnContext>\n    </saml:AuthnStatement>\n    <saml:AttributeStatement xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n      <saml:Attribute Name=\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:uri\">\n        <saml:AttributeValue xsi:type=\"xs:string\">google-oauth2|108204123456789\n        </saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:uri\">\n        <saml:AttributeValue xsi:type=\"xs:string\">john.doe@email.org\n        </saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:uri\">\n        <saml:AttributeValue xsi:type=\"xs:string\">John\n        </saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:uri\">\n        <saml:AttributeValue xsi:type=\"xs:string\">John\n        </saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:uri\">\n        <saml:AttributeValue xsi:type=\"xs:string\">john.doe@email.org\n        </saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"http://schemas.auth0.com/identities/default/provider\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:uri\">\n        <saml:AttributeValue xsi:type=\"xs:string\">google-oauth2\n        </saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"http://schemas.auth0.com/identities/default/connection\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:uri\">\n        <saml:AttributeValue xsi:type=\"xs:string\">google-oauth2\n        </saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"http://schemas.auth0.com/identities/default/isSocial\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:uri\">\n        <saml:AttributeValue xsi:type=\"xs:boolean\">true\n        </saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"http://schemas.auth0.com/clientID\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:uri\">\n        <saml:AttributeValue xsi:type=\"xs:string\">dummysamluid\n        </saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"http://schemas.auth0.com/created_at\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:uri\">\n        <saml:AttributeValue xsi:type=\"xs:anyType\">Wed Jun 28 2023 17:53:49 GMT+0000 (Coordinated Universal Time)\n        </saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"http://schemas.auth0.com/email_verified\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:uri\">\n        <saml:AttributeValue xsi:type=\"xs:boolean\">true\n        </saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"http://schemas.auth0.com/locale\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:uri\">\n        <saml:AttributeValue xsi:type=\"xs:string\">en\n        </saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"http://schemas.auth0.com/nickname\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:uri\">\n        <saml:AttributeValue xsi:type=\"xs:string\">john.doe\n        </saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"http://schemas.auth0.com/picture\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:uri\">\n        <saml:AttributeValue xsi:type=\"xs:string\">https://lh3.googleusercontent.com/a/AAcHTtfZ0fEyL3BKP1Hk2v1bNwpJd6ckIeo6jSExlkVjMXaIpsY=s96-c\n        </saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"http://schemas.auth0.com/updated_at\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:uri\">\n        <saml:AttributeValue xsi:type=\"xs:anyType\">Sat Jul 08 2023 06:13:07 GMT+0000 (Coordinated Universal Time)\n        </saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"Role\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\">\n         <saml:AttributeValue xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"xs:string\">view-profile</saml:AttributeValue>\n      </saml:Attribute>\n      <saml:Attribute Name=\"Role\" NameFormat=\"urn:oasis:names:tc:SAML:2.0:attrname-format:basic\">\n         <saml:AttributeValue xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"xs:string\">manage-account-links</saml:AttributeValue>\n      </saml:Attribute>\n    </saml:AttributeStatement>\n  </saml:Assertion>\n</samlp:Response>\n\"\"\"\n        return base64.b64encode(xml.encode(\"utf8\")).decode(\"utf8\")\n\n    return factory\n\n\n@pytest.fixture\ndef sls_saml_request():\n    xml = \"<dummy></dummy>\"\n    return base64.b64encode(xml.encode(\"utf8\")).decode(\"utf8\")\n\n\n@pytest.fixture\ndef mocked_signature_validation():\n    with patch(\"onelogin.saml2.utils.OneLogin_Saml2_Utils.validate_sign\") as mock:\n        mock.return_value = True\n        yield\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/saml/tests.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import Mock, patch\nfrom urllib.parse import parse_qs, urlparse\n\nfrom django.conf import settings\nfrom django.urls import reverse, reverse_lazy\nfrom django.utils.http import urlencode\n\nimport pytest\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.socialaccount.adapter import get_adapter\nfrom allauth.socialaccount.internal import statekit\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.base.constants import AuthProcess\nfrom allauth.socialaccount.providers.saml.utils import build_saml_config\n\n\n@pytest.mark.parametrize(\n    \"idp_initiated,adv_settings,state_kwargs,relay_state, expected_url\",\n    [\n        (False, {}, {}, \"/not/here\", settings.LOGIN_REDIRECT_URL),\n        (False, {}, {\"next\": \"/here\"}, \"/not/here\", \"/here\"),\n        (\n            False,\n            {},\n            {\"process\": \"connect\"},\n            \"/not/here\",\n            reverse_lazy(\"socialaccount_connections\"),\n        ),\n        (False, {}, {\"process\": \"connect\", \"next\": \"/here\"}, \"/not/here\", \"/here\"),\n        (True, {\"reject_idp_initiated_sso\": False}, {}, \"/set-by-idp\", \"/set-by-idp\"),\n        (\n            True,\n            {\"reject_idp_initiated_sso\": False},\n            {},\n            \"not-a-url\",\n            settings.LOGIN_REDIRECT_URL,\n        ),\n        (True, {}, {}, \"/set-by-idp\", \"/set-by-idp\"),\n    ],\n)\ndef test_acs(\n    request,\n    idp_initiated,\n    db,\n    saml_settings,\n    acs_saml_response_factory,\n    mocked_signature_validation,\n    expected_url,\n    relay_state,\n    state_kwargs,\n    sociallogin_setup_state,\n    adv_settings,\n    settings,\n):\n    provider_settings = settings.SOCIALACCOUNT_PROVIDERS[\"saml\"][\"APPS\"][0][\"settings\"]\n    advanced = dict(provider_settings[\"advanced\"])\n    advanced.update(adv_settings)\n    provider_settings[\"advanced\"] = advanced\n    process = state_kwargs.setdefault(\"process\", AuthProcess.LOGIN)\n    is_connect = process == AuthProcess.CONNECT\n    if is_connect:\n        client = request.getfixturevalue(\"auth_client\")\n        user = request.getfixturevalue(\"user\")\n    else:\n        client = request.getfixturevalue(\"client\")\n        user = None\n\n    state_id = None\n    if not idp_initiated:\n        state_id = sociallogin_setup_state(client, **state_kwargs)\n\n    data = {\"SAMLResponse\": acs_saml_response_factory(in_response_to=state_id)}\n    if relay_state is not None:\n        data[\"RelayState\"] = relay_state\n    resp = client.post(\n        reverse(\"saml_acs\", kwargs={\"organization_slug\": \"org\"}), data=data\n    )\n    finish_url = reverse(\"saml_finish_acs\", kwargs={\"organization_slug\": \"org\"})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == finish_url\n    resp = client.get(finish_url)\n    if idp_initiated and advanced.get(\"reject_idp_initiated_sso\", True):\n        assert \"socialaccount/authentication_error.html\" in (\n            t.name for t in resp.templates\n        )\n    else:\n        assert resp[\"location\"] == expected_url\n        account = SocialAccount.objects.get(\n            provider=\"urn:dev-123.us.auth0.com\", uid=\"dummysamluid\"\n        )\n        assert account.extra_data[\"Role\"] == [\"view-profile\", \"manage-account-links\"]\n        email = EmailAddress.objects.get(user=account.user)\n        assert email.email == (user.email if is_connect else \"john.doe@email.org\")\n\n\ndef test_acs_error(client, db, saml_settings):\n    data = {\"SAMLResponse\": \"bad-response\"}\n    resp = client.post(\n        reverse(\"saml_acs\", kwargs={\"organization_slug\": \"org\"}), data=data\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    resp = client.get(resp[\"location\"])\n    assert \"socialaccount/authentication_error.html\" in (t.name for t in resp.templates)\n\n\ndef test_acs_get(client, db, saml_settings):\n    \"\"\"WHile ACS expects POST, it always redirects and handles the request in\n    the FinishACSView.\n    \"\"\"\n    resp = client.get(reverse(\"saml_acs\", kwargs={\"organization_slug\": \"org\"}))\n    assert resp.status_code == HTTPStatus.FOUND\n    resp = client.get(resp[\"location\"])\n    assert \"socialaccount/authentication_error.html\" in (t.name for t in resp.templates)\n\n\ndef test_sls_get(client, db, saml_settings):\n    \"\"\"SLS expects POST\"\"\"\n    resp = client.get(reverse(\"saml_sls\", kwargs={\"organization_slug\": \"org\"}))\n    assert resp.status_code == HTTPStatus.BAD_REQUEST\n\n\ndef test_login_on_get(client, db, saml_settings):\n    resp = client.get(reverse(\"saml_login\", kwargs={\"organization_slug\": \"org\"}))\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"socialaccount/login.html\")\n\n\ndef test_login(client, db, saml_settings):\n    resp = client.post(\n        reverse(\"saml_login\", kwargs={\"organization_slug\": \"org\"})\n        + \"?process=connect&next=/foo\"\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    location = resp[\"location\"]\n    assert location.startswith(\"https://dev-123.us.auth0.com/samlp/456?SAMLRequest=\")\n    resp_query = parse_qs(urlparse(location).query)\n    # We're not using RelayState\n    assert resp_query.get(\"RelayState\") is None\n    # We're using the request ID / InResponseTo for tracking state.\n    state_id = list(client.session[statekit.STATES_SESSION_KEY].keys())[0]\n    assert state_id.startswith(\"ONELOGIN_\")\n    state = client.session[statekit.STATES_SESSION_KEY][state_id][0]\n    assert state == {\"process\": \"connect\", \"data\": None, \"next\": \"/foo\"}\n\n\ndef test_metadata(\n    client,\n    db,\n    saml_settings,\n):\n    resp = client.get(reverse(\"saml_metadata\", kwargs={\"organization_slug\": \"org\"}))\n    assert resp.status_code == HTTPStatus.OK\n    assert resp.content.startswith(\n        b'<?xml version=\"1.0\"?>\\n<md:EntityDescriptor xmlns:md=\"urn:oasis:names:tc:SAML:2.0:metadata'\n    )\n\n\ndef test_sls(auth_client, db, saml_settings, user_factory, sls_saml_request):\n    with patch(\"allauth.account.adapter.DefaultAccountAdapter.logout\") as logout_mock:\n        resp = auth_client.get(\n            reverse(\"saml_sls\", kwargs={\"organization_slug\": \"org\"})\n            + \"?\"\n            + urlencode({\"SAMLRequest\": sls_saml_request})\n        )\n        assert logout_mock.call_count == 1\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"].startswith(\n        \"https://dev-123.us.auth0.com/samlp/456?SAMLResponse=\"\n    )\n\n\n@pytest.mark.parametrize(\n    \"provider_config\",\n    [\n        {\n            \"idp\": {\n                \"entity_id\": \"dummy\",\n                \"sso_url\": \"https://idp.org/sso/\",\n                \"slo_url\": \"https://idp.saml.org/slo/\",\n                \"x509cert\": \"cert\",\n            }\n        },\n    ],\n)\ndef test_build_saml_config_without_metadata_url(rf, provider_config):\n    request = rf.get(\"/\")\n    config = build_saml_config(request, provider_config, \"org\")\n    assert config[\"idp\"][\"entityId\"] == \"dummy\"\n    assert config[\"idp\"][\"x509cert\"] == \"cert\"\n    assert config[\"idp\"][\"singleSignOnService\"] == {\"url\": \"https://idp.org/sso/\"}\n    assert config[\"idp\"][\"singleLogoutService\"] == {\"url\": \"https://idp.saml.org/slo/\"}\n\n\n@pytest.mark.parametrize(\n    \"provider_config\",\n    [\n        {\n            \"idp\": {\n                \"entity_id\": \"dummy\",\n                \"metadata_url\": \"https://idp.org/sso/\",\n            }\n        },\n        {\n            \"idp\": {\n                \"entity_id\": \"dummy\",\n                \"metadata_url\": \"https://idp.org/sso/\",\n            },\n            \"sp\": {\"entity_id\": \"dummy-sp-entity-id\"},\n        },\n    ],\n)\ndef test_build_saml_config(rf, provider_config):\n    request = rf.get(\"/\")\n    with patch(\n        \"onelogin.saml2.idp_metadata_parser.OneLogin_Saml2_IdPMetadataParser.parse_remote\"\n    ) as parse_mock:\n        parse_mock.return_value = {\n            \"idp\": {\n                \"entityId\": \"dummy\",\n                \"singleSignOnService\": {\"url\": \"https://idp.org/sso/\"},\n                \"singleLogoutService\": {\"url\": \"https://idp.saml.org/slo/\"},\n                \"x509cert\": \"cert\",\n            }\n        }\n        config = build_saml_config(request, provider_config, \"org\")\n\n    assert config[\"idp\"][\"entityId\"] == \"dummy\"\n    assert config[\"idp\"][\"x509cert\"] == \"cert\"\n    assert config[\"idp\"][\"singleSignOnService\"] == {\"url\": \"https://idp.org/sso/\"}\n    assert config[\"idp\"][\"singleLogoutService\"] == {\"url\": \"https://idp.saml.org/slo/\"}\n    metadata_url = request.build_absolute_uri(reverse(\"saml_metadata\", args=[\"org\"]))\n    sp_entity_id = provider_config.get(\"sp\", {}).get(\"entity_id\")\n    if sp_entity_id:\n        assert config[\"sp\"][\"entityId\"] == sp_entity_id\n    else:\n        assert config[\"sp\"][\"entityId\"] == metadata_url\n\n\n@pytest.mark.parametrize(\n    \"data, result, uid\",\n    [\n        (\n            {\"urn:oasis:names:tc:SAML:attribute:subject-id\": [\"123\"]},\n            {\"uid\": \"123\", \"email\": \"nameid@saml.org\"},\n            \"123\",\n        ),\n        ({}, {\"email\": \"nameid@saml.org\"}, \"nameid@saml.org\"),\n    ],\n)\ndef test_extract_attributes(db, data, result, uid, settings):\n    settings.SOCIALACCOUNT_PROVIDERS = {\n        \"saml\": {\n            \"APPS\": [\n                {\n                    \"client_id\": \"org\",\n                    \"provider_id\": \"urn:dev-123.us.auth0.com\",\n                }\n            ]\n        }\n    }\n    provider = get_adapter().get_provider(request=None, provider=\"saml\")\n    onelogin_data = Mock()\n    onelogin_data.get_attributes.return_value = data\n    onelogin_data.get_nameid.return_value = \"nameid@saml.org\"\n    onelogin_data.get_nameid_format.return_value = (\n        \"urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress\"\n    )\n    assert provider._extract(onelogin_data) == result\n    assert provider.extract_uid(onelogin_data) == uid\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/sharefile/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/sharefile/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.sharefile.provider import ShareFileProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass ShareFileTests(OAuth2TestsMixin, TestCase):\n    provider_id = ShareFileProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\n  \"Id\": \"123\",\n  \"Email\":\"user.one@domain.com\",\n  \"FirstName\":\"Name\",\n  \"LastName\":\"Last Name\",\n  \"Company\":\"Company\",\n  \"DefaultZone\":\n  {\n    \"Id\":\"zoneid\"\n  }\n}         \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"user.one@domain.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/shopify/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/shopify/tests.py",
    "content": "import json\nfrom http import HTTPStatus\nfrom urllib.parse import parse_qs, urlparse\n\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\nfrom django.urls import reverse\nfrom django.utils.http import urlencode\n\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.shopify.provider import ShopifyProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse, mocked_response\n\n\nclass ShopifyTests(OAuth2TestsMixin, TestCase):\n    provider_id = ShopifyProvider.id\n\n    def _complete_shopify_login(self, q, resp, resp_mock, with_refresh_token):\n        complete_url = reverse(f\"{self.provider.id}_callback\")\n        self.assertGreater(q[\"redirect_uri\"][0].find(complete_url), 0)\n        response_json = self.get_login_response_json(\n            with_refresh_token=with_refresh_token\n        )\n        with mocked_response(\n            MockedResponse(\n                HTTPStatus.OK, response_json, {\"content-type\": \"application/json\"}\n            ),\n            resp_mock,\n        ):\n            resp = self.client.get(\n                complete_url,\n                {\n                    \"code\": \"test\",\n                    \"state\": q[\"state\"][0],\n                    \"shop\": \"test\",\n                },\n            )\n        return resp\n\n    def login(self, resp_mock, process=\"login\", with_refresh_token=True):\n        url = (\n            reverse(f\"{self.provider.id}_login\")\n            + \"?\"\n            + urlencode({\"process\": process, \"shop\": \"test\"})\n        )\n        resp = self.client.post(url)\n        self.assertEqual(resp.status_code, HTTPStatus.FOUND)\n        p = urlparse(resp[\"location\"])\n        q = parse_qs(p.query)\n        resp = self._complete_shopify_login(q, resp, resp_mock, with_refresh_token)\n        return resp\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n            \"shop\": {\n                \"id\": \"1234566\",\n                \"name\": \"Test Shop\",\n                \"email\": \"email@example.com\"\n            }\n        }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"email@example.com\"\n\n\n@override_settings(SOCIALACCOUNT_PROVIDERS={\"shopify\": {\"IS_EMBEDDED\": True}})\nclass ShopifyEmbeddedTests(ShopifyTests):\n    \"\"\"\n    Shopify embedded apps (that run within an iFrame) require a JS (not server)\n    redirect for starting the oauth2 process.\n\n    See Also:\n    https://help.shopify.com/api/sdks/embedded-app-sdk/getting-started#oauth\n    \"\"\"\n\n    def login(self, resp_mock, process=\"login\", with_refresh_token=True):\n        resp = self.client.post(\n            reverse(f\"{self.provider.id}_login\")\n            + \"?\"\n            + urlencode({\"process\": process, \"shop\": \"test\"}),\n        )\n        self.assertEqual(resp.status_code, HTTPStatus.OK)  # No re-direct, JS must do it\n        actual_content = resp.content.decode(\"utf8\")\n        self.assertTrue(\n            \"script\" in actual_content,\n            f\"Content missing script tag. [Actual: {actual_content}]\",\n        )\n        self.assertTrue(\n            resp.xframe_options_exempt,\n            \"Redirect JS must be allowed to run in Shopify iframe\",\n        )\n        self.assertTrue(\n            \"<!DOCTYPE html><html><head>\" in actual_content\n            and \"</head><body></body></html>\" in actual_content,\n            f\"Expected standard HTML skeleton. [Actual: {actual_content}]\",\n        )\n        p = urlparse(\n            actual_content.split(\";</script>\")[0].split('location.href = \"')[1]\n        )\n        q = parse_qs(p.query)\n        resp = self._complete_shopify_login(q, resp, resp_mock, with_refresh_token)\n        return resp\n\n\n@override_settings(\n    SOCIALACCOUNT_PROVIDERS={\n        \"shopify\": {\"AUTH_PARAMS\": {\"grant_options[]\": \"per-user\"}}\n    }\n)\nclass ShopifyPerUserAccessTests(ShopifyTests):\n    \"\"\"\n    Shopify has two access modes, offline (the default) and online/per-user.\n    Enabling 'online' access should cause all-auth to tie the logged in\n    Shopify user to the all-auth account (rather than the shop as a whole).\n\n    See Also:\n    https://help.shopify.com/api/getting-started/authentication/\n    oauth#api-access-modes\n    \"\"\"\n\n    def get_login_response_json(self, with_refresh_token=True):\n        response_data = {\n            \"access_token\": \"testac\",\n            \"account_number\": None,\n            \"associated_user\": {\n                \"account_owner\": True,\n                \"collaborator\": False,\n                \"email\": \"john@example.com\",\n                \"email_verified\": True,\n                \"first_name\": \"John\",\n                \"id\": 902541635,\n                \"last_name\": \"Smith\",\n                \"locale\": \"en\",\n            },\n            \"associated_user_scope\": \"read_products,read_customers,read_inventory,write_merchant_managed_fulfillment_orders,write_third_party_fulfillment_orders,read_orders,write_assigned_fulfillment_orders\",\n            \"expires_in\": 86381,\n            \"scope\": \"read_products,read_customers,read_inventory,write_merchant_managed_fulfillment_orders,write_third_party_fulfillment_orders,read_orders,write_assigned_fulfillment_orders\",\n            \"session\": None,\n        }\n        if with_refresh_token:\n            response_data[\"refresh_token\"] = \"testrf\"\n\n        return json.dumps(response_data)\n\n    @override_settings(\n        SOCIALACCOUNT_AUTO_SIGNUP=True,\n        SOCIALACCOUNT_EMAIL_REQUIRED=True,\n        ACCOUNT_EMAIL_REQUIRED=True,\n    )\n    def test_associated_user(self):\n        resp_mocks = self.get_mocked_response()\n        resp = self.login(resp_mocks)\n        self.assertRedirects(resp, \"/accounts/profile/\", fetch_redirect_response=False)\n\n        social_account = SocialAccount.objects.filter(\n            provider=self.provider.id,\n            uid=902541635,\n        ).first()\n        self.assertIsNotNone(social_account)\n        self.assertTrue(\"associated_user\" in social_account.extra_data)\n\n        self.assertEqual(social_account.user.email, \"john@example.com\")\n        self.assertEqual(social_account.user.first_name, \"John\")\n        self.assertEqual(social_account.user.last_name, \"Smith\")\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/slack/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/slack/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.slack.provider import SlackProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass SlackOAuth2Tests(OAuth2TestsMixin, TestCase):\n    provider_id = SlackProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n    \"ok\": true,\n    \"sub\": \"U0R7JM\",\n    \"https://slack.com/user_id\": \"U0R7JM\",\n    \"https://slack.com/team_id\": \"T0R7GR\",\n    \"email\": \"krane@slack-corp.com\",\n    \"email_verified\": true,\n    \"date_email_verified\": 1622128723,\n    \"name\": \"krane\",\n    \"picture\": \"https://secure.gravatar.com/....png\",\n    \"given_name\": \"Bront\",\n    \"family_name\": \"Labradoodle\",\n    \"locale\": \"en-US\",\n    \"https://slack.com/team_name\": \"kraneflannel\",\n    \"https://slack.com/team_domain\": \"kraneflannel\"\n        }\"\"\",\n        )  # noqa\n\n    def get_expected_to_str(self):\n        return \"krane@slack-corp.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/snapchat/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/snapchat/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.snapchat.provider import SnapchatProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass SnapchatOAuth2Tests(OAuth2TestsMixin, TestCase):\n    provider_id = SnapchatProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n                  \"data\":{\n                      \"me\":{\n                        \"externalId\":\"CAESIPiRBp0e5gLDq7VVurQ3rVdmdbqxpOJWynjyBL/xlo0w\",\n                        \"displayName\":\"Karun Shrestha\",\n                        \"bitmoji\":{\n                            \"avatar\":\"https://sdk.bitmoji.com/render/panel/336d1e96-9055-4818-81aa-adde45ec030f-3aBXH5B0ZPCr~grPTZScjprXRT2RkU90oSd7X_PjDFFnBe3wuFkD1R-v1.png?transparent=1&palette=1\",\n                            \"id\":\"3aBXH5B0ZPCr~grPTZScjprXRT2RkU90oSd7X_PjDFFnBe3wuFkD1R\"\n                        }\n                      }\n                  },\n                  \"errors\":[]\n            }\"\"\",\n        )  # noqa\n\n    def get_expected_to_str(self):\n        return \"Karun Shrestha\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/soundcloud/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/soundcloud/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.soundcloud.provider import SoundCloudProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass SoundCloudTests(OAuth2TestsMixin, TestCase):\n    provider_id = SoundCloudProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n           \"website\": null,\n            \"myspace_name\": null,\n            \"public_favorites_count\": 0,\n            \"followings_count\": 1,\n            \"full_name\": \"\",\n            \"urn\": \"soundcloud:users:22341947\",\n            \"city\": null,\n            \"track_count\": 0,\n            \"playlist_count\": 0,\n            \"discogs_name\": null,\n            \"private_tracks_count\": 0,\n            \"followers_count\": 0,\n            \"online\": true,\n            \"username\": \"user187631676\",\n            \"description\": null,\n            \"kind\": \"user\",\n            \"website_title\": null,\n            \"primary_email_confirmed\": false,\n            \"permalink_url\": \"http://soundcloud.com/user187631676\",\n            \"private_playlists_count\": 0,\n            \"permalink\": \"user187631676\",\n            \"country\": null,\n            \"uri\": \"https://api.soundcloud.com/users/22341947\",\n            \"avatar_url\":\n            \"https://a1.sndcdn.com/images/default_avatar_large.png?4b4189b\",\n            \"plan\": \"Free\"\n        }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"user187631676\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/spotify/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/spotify/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.spotify.provider import SpotifyOAuth2Provider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass SpotifyOAuth2Tests(OAuth2TestsMixin, TestCase):\n    provider_id = SpotifyOAuth2Provider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n          \"birthdate\": \"1937-06-01\",\n          \"country\": \"SE\",\n          \"display_name\": \"JM Wizzler\",\n          \"email\": \"email@example.com\",\n          \"external_urls\": {\n            \"spotify\": \"https://open.spotify.com/user/wizzler\"\n          },\n          \"followers\" : {\n            \"href\" : null,\n            \"total\" : 3829\n          },\n          \"href\": \"https://api.spotify.com/v1/users/wizzler\",\n          \"id\": \"wizzler\",\n          \"images\": [\n            {\n              \"height\": null,\n              \"url\":\n              \"https://fbcdn-profile-a.akamaihd.net/hprofile-ak-frc3/t1.0-1/1970403_10152215092574354_1798272330_n.jpg\",\n              \"width\": null\n            }\n          ],\n          \"product\": \"premium\",\n          \"type\": \"user\",\n          \"uri\": \"spotify:user:wizzler\"\n        }\"\"\",\n        )  # noqa\n\n    def get_expected_to_str(self):\n        return \"email@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/stackexchange/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/stackexchange/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.stackexchange.provider import StackExchangeProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass StackExchangeTests(OAuth2TestsMixin, TestCase):\n    provider_id = StackExchangeProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n          \"has_more\": false,\n           \"items\": [\n              {\n                \"is_employee\": false,\n                 \"last_access_date\": 1356200390,\n                 \"display_name\": \"pennersr\",\n                 \"account_id\": 291652,\n                 \"badge_counts\": {\n                     \"bronze\": 2,\n                     \"silver\": 2,\n                     \"gold\": 0\n                 },\n                 \"last_modified_date\": 1356199552,\n                 \"profile_image\":\n                 \"http://www.gravatar.com/avatar/053d648486d567d3143d6bad8df8cfeb?d=identicon&r=PG\",\n                 \"user_type\": \"registered\",\n                 \"creation_date\": 1296223711,\n                 \"reputation_change_quarter\": 148,\n                 \"reputation_change_year\": 378,\n                 \"reputation\": 504,\n                 \"link\": \"http://stackoverflow.com/users/593944/pennersr\",\n                 \"reputation_change_week\": 0,\n                 \"user_id\": 593944,\n                 \"reputation_change_month\": 10,\n                 \"reputation_change_day\": 0\n              }\n           ],\n           \"quota_max\": 10000,\n           \"quota_remaining\": 9999\n        }\"\"\",\n        )  # noqa\n\n    def get_expected_to_str(self):\n        return \"pennersr\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/steam/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/steam/tests.py",
    "content": "from unittest.mock import Mock, patch\n\nfrom django.conf import settings\nfrom django.test import TestCase\nfrom django.urls import reverse\n\nfrom openid.yadis.discover import DiscoveryFailure\nfrom pytest_django.asserts import assertRedirects\n\nfrom allauth.socialaccount.providers.steam import views\nfrom allauth.socialaccount.providers.steam.provider import SteamOpenIDProvider\nfrom tests.apps.socialaccount.base import setup_app\n\n\nclass SteamTests(TestCase):\n    def setUp(self):\n        self.app = setup_app(SteamOpenIDProvider.id)\n\n    def test_redirect(self):\n        with patch(\n            \"allauth.socialaccount.providers.steam.provider._openid_consumer\"\n        ) as consumer_mock:\n            consumer_client = Mock()\n            begin = Mock()\n            auth_request = Mock()\n            redirectURL = Mock()\n            consumer_mock.return_value = consumer_client\n            consumer_client.begin = begin\n            begin.return_value = auth_request\n            auth_request.redirectURL = redirectURL\n            redirectURL.return_value = \"https://steamcommunity.com/openid/login?XXX\"\n\n            resp = self.client.post(reverse(views.steam_login))\n            assertRedirects(\n                resp,\n                \"https://steamcommunity.com/openid/login?XXX\",\n                fetch_redirect_response=False,\n            )\n\n    def test_redirect_error(self):\n        with patch(\n            \"allauth.socialaccount.providers.steam.provider._openid_consumer\"\n        ) as consumer_mock:\n            consumer_client = Mock()\n            begin = Mock()\n            consumer_mock.return_value = consumer_client\n            consumer_client.begin = begin\n\n            def discovery_failure(*args, **kwargs):\n                raise DiscoveryFailure(\n                    \"HTTP Response status from identity URL host is not 200. Got status 502\",\n                    None,\n                )\n\n            begin.side_effect = discovery_failure\n\n            resp = self.client.post(reverse(views.steam_login))\n            template_ext = getattr(settings, \"ACCOUNT_TEMPLATE_EXTENSION\", \"html\")\n            self.assertTemplateUsed(\n                resp, f\"socialaccount/authentication_error.{template_ext}\"\n            )\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/stocktwits/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/stocktwits/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.stocktwits.provider import StocktwitsProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass StocktwitsTests(OAuth2TestsMixin, TestCase):\n    provider_id = StocktwitsProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\n  \"response\": {\n    \"status\": 200\n  },\n  \"user\": {\n    \"id\": 3,\n    \"username\": \"zerobeta\",\n    \"name\": \"Justin Paterno\",\n    \"avatar_url\": \"http://avatars.stocktwits.com/images/default_avatar_thumb.jpg\",\n    \"avatar_url_ssl\": \"https://s3.amazonaws.com/st-avatars/images/default_avatar_thumb.jpg\",\n    \"identity\": \"Official\",\n    \"classification\": [\n      \"ir\"\n    ]\n  }\n}\n\"\"\",\n        )  # noqa\n\n    def get_expected_to_str(self):\n        return \"zerobeta\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/strava/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/strava/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.contrib.auth.models import User\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.strava.provider import StravaProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass StravaTests(OAuth2TestsMixin, TestCase):\n    provider_id = StravaProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n                \"id\": 32641234,\n                \"username\": null,\n                \"resource_state\": 2,\n                \"firstname\": \"georges\",\n                \"lastname\": \"camembert\",\n                \"city\": \"London\",\n                \"state\": \"England\",\n                \"country\": \"United Kingdom\",\n                \"sex\": \"M\",\n                \"premium\": false,\n                \"summit\": false,\n                \"created_at\": \"2017-07-12T12:42:52Z\",\n                \"updated_at\": \"2017-10-21T11:01:23Z\",\n                \"badge_type_id\": 0,\n                \"profile_medium\": \"avatar/athlete/medium.png\",\n                \"profile\": \"avatar/athlete/large.png\",\n                \"friend\": null,\n                \"follower\": null,\n                \"email\": \"bill@example.com\"\n            }\"\"\",\n        )  # noqa\n\n    def get_expected_to_str(self):\n        return \"bill@example.com\"\n\n    def get_mocked_response_avatar_invalid_id(self):\n        \"\"\"Profile including realistic avatar URL\n        user ID set to 0 to test edge case where id would be missing\"\"\"\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n                \"id\": 0,\n                \"username\": null,\n                \"resource_state\": 2,\n                \"firstname\": \"georges\",\n                \"lastname\": \"camembert\",\n                \"city\": \"London\",\n                \"state\": \"England\",\n                \"country\": \"United Kingdom\",\n                \"sex\": \"M\",\n                \"premium\": false,\n                \"summit\": false,\n                \"created_at\": \"2017-07-12T12:42:52Z\",\n                \"updated_at\": \"2017-10-21T11:01:23Z\",\n                \"badge_type_id\": 0,\n                \"profile_medium\": \"https://cloudfront.net/1/medium.jpg\",\n                \"profile\": \"https://cloudfront.net/1/large.jpg\",\n                \"friend\": null,\n                \"follower\": null,\n                \"email\": \"bill@example.com\"\n            }\"\"\",\n        )  # noqa\n\n    def test_valid_avatar(self):\n        \"\"\"test response with Avatar URL\"\"\"\n        self.login(self.get_mocked_response_avatar_invalid_id())\n        user = User.objects.get(email=\"bill@example.com\")\n        soc_acc = SocialAccount.objects.filter(\n            user=user, provider=self.provider.id\n        ).get()\n        provider_account = soc_acc.get_provider_account()\n        self.assertEqual(\n            provider_account.get_avatar_url(),\n            \"https://cloudfront.net/1/large.jpg\",\n        )\n        self.assertIsNone(provider_account.get_profile_url())\n\n    def get_login_response_json(self, with_refresh_token=True):\n        rt = \"\"\n        if with_refresh_token:\n            rt = ',\"refresh_token\": \"testrf\"'\n        return (\n            \"\"\"{\n            \"uid\":\"weibo\",\n            \"access_token\":\"testac\",\n            \"livemode\": false,\n            \"token_type\": \"bearer\",\n            \"strava_publishable_key\": \"pk_test_someteskey\",\n            \"strava_user_id\": \"acct_sometestid\",\n            \"scope\": \"read_write\"\n            %s }\"\"\"\n            % rt\n        )\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/stripe/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/stripe/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.stripe.provider import StripeProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass StripeTests(OAuth2TestsMixin, TestCase):\n    provider_id = StripeProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n          \"id\": \"acct_sometestid\",\n          \"object\": \"account\",\n          \"business_logo\": null,\n          \"business_name\": null,\n          \"business_url\": \"example.com\",\n          \"charges_enabled\": true,\n          \"country\": \"SE\",\n          \"currencies_supported\": [\n            \"usd\",\n            \"eur\",\n            \"sek\"\n          ],\n          \"default_currency\": \"eur\",\n          \"details_submitted\": true,\n          \"display_name\": \"Test\",\n          \"email\": \"test@example.com\",\n          \"managed\": false,\n          \"metadata\": {},\n          \"statement_descriptor\": \"TEST.COM\",\n          \"support_phone\": \"+460123456789\",\n          \"timezone\": \"Europe/Stockholm\",\n          \"transfers_enabled\": true\n        }\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"test@example.com\"\n\n    def get_login_response_json(self, with_refresh_token=True):\n        rt = \"\"\n        if with_refresh_token:\n            rt = ',\"refresh_token\": \"testrf\"'\n        return (\n            \"\"\"{\n            \"uid\":\"weibo\",\n            \"access_token\":\"testac\",\n            \"livemode\": false,\n            \"token_type\": \"bearer\",\n            \"stripe_publishable_key\": \"pk_test_someteskey\",\n            \"stripe_user_id\": \"acct_sometestid\",\n            \"scope\": \"read_write\"\n            %s }\"\"\"\n            % rt\n        )\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/telegram/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/telegram/tests.py",
    "content": "import base64\nimport json\nfrom http import HTTPStatus\n\nfrom django.urls import reverse\n\nimport pytest\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.socialaccount.models import SocialAccount\n\n\n@pytest.fixture\ndef telegram_app(settings):\n    settings.SOCIALACCOUNT_PROVIDERS = {\n        \"telegram\": {\n            \"APPS\": [\n                {\n                    \"client_id\": \"123\",\n                }\n            ]\n        }\n    }\n\n\ndef test_login(client, db, telegram_app):\n    resp = client.post(reverse(\"telegram_login\"))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"].startswith(\n        \"https://oauth.telegram.org/auth?origin=http%3A%2F%2Ftestserver%2F&bot_id=123&request_access=write&embed=0&return_to=http%3A%2F%2Ftestserver%2Faccounts%2Ftelegram%2Flogin%2Fcallback%2F%3Fstate%3D\"\n    )\n\n\ndef test_callback_get(client, db, telegram_app):\n    resp = client.get(reverse(\"telegram_callback\"))\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"telegram/callback.html\")\n\n\ndef test_callback(client, db, telegram_app, sociallogin_setup_state):\n    state = sociallogin_setup_state(client)\n    auth_result = (\n        base64.b64encode(\n            json.dumps(\n                {\n                    \"id\": \"123\",\n                    \"hash\": \"0744ab643757850e82fa8b4ac35978dca287c81df6a9829032d868c7f90e3b99\",\n                    \"auth_date\": 2342342342,\n                }\n            ).encode(\"utf8\")\n        )\n        .decode(\"ascii\")\n        .replace(\"=\", \"\")\n    )\n    post_data = {\n        \"tgAuthResult\": auth_result,\n    }\n    resp = client.post(f\"{reverse('telegram_callback')}?state={state}\", post_data)\n    assert resp.status_code == HTTPStatus.FOUND\n    assert SocialAccount.objects.filter(uid=\"123\").exists()\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/tiktok/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/tiktok/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.tiktok.provider import TikTokProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass TikTokTests(OAuth2TestsMixin, TestCase):\n    provider_id = TikTokProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n          \"data\": {\n            \"user\": {\n                \"open_id\": \"44322889\",\n                \"username\": \"username123\",\n                \"display_name\": \"Nice Display Name\",\n                \"avatar_url\": \"https://example.com/avatar.jpg\",\n                \"profile_deep_link\": \"https://example.com/profile\"\n            }\n          }\n        }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"username123\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/trainingpeaks/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/trainingpeaks/tests.py",
    "content": "\"\"\"\nRun just this suite:\npython manage.py test allauth.socialaccount.providers.trainingpeaks.tests.TrainingPeaksTests\n\"\"\"\n\nfrom collections import namedtuple\nfrom http import HTTPStatus\n\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\n\nfrom allauth.socialaccount.providers.trainingpeaks.provider import TrainingPeaksProvider\nfrom allauth.socialaccount.providers.trainingpeaks.views import (\n    TrainingPeaksOAuth2Adapter,\n)\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass TrainingPeaksTests(OAuth2TestsMixin, TestCase):\n    provider_id = TrainingPeaksProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n                \"Id\": 123456,\n                \"FirstName\": \"John\",\n                \"LastName\": \"Doe\",\n                \"Email\": \"user@example.com\",\n                \"DateOfBirth\": \"1986-02-01T00:00:00\",\n                \"CoachedBy\": 987654,\n                \"Weight\": 87.5223617553711\n            }\"\"\",\n        )  # noqa\n\n    def get_expected_to_str(self):\n        return \"user@example.com\"\n\n    def get_login_response_json(self, with_refresh_token=True):\n        rtoken = \"\"\n        if with_refresh_token:\n            rtoken = ',\"refresh_token\": \"testrf\"'\n        return (\n            \"\"\"{\n                \"access_token\" : \"testac\",\n                \"token_type\" : \"bearer\",\n                \"expires_in\" : 600,\n                \"scope\": \"scopes granted\"\n            %s }\"\"\"\n            % rtoken\n        )\n\n    def test_default_use_sandbox_uri(self):\n        adapter = TrainingPeaksOAuth2Adapter(None)\n        self.assertTrue(\".sandbox.\" in adapter.authorize_url)\n        self.assertTrue(\".sandbox.\" in adapter.access_token_url)\n        self.assertTrue(\".sandbox.\" in adapter.profile_url)\n\n    @override_settings(\n        SOCIALACCOUNT_PROVIDERS={\"trainingpeaks\": {\"USE_PRODUCTION\": True}}\n    )\n    def test_use_production_uri(self):\n        adapter = TrainingPeaksOAuth2Adapter(None)\n        self.assertFalse(\".sandbox.\" in adapter.authorize_url)\n        self.assertFalse(\".sandbox.\" in adapter.access_token_url)\n        self.assertFalse(\".sandbox.\" in adapter.profile_url)\n\n    def test_scope_from_default(self):\n        Request = namedtuple(\"request\", [\"GET\"])\n        mock_request = Request(GET={})\n        scope = self.provider.get_scope_from_request(mock_request)\n        self.assertTrue(\"athlete:profile\" in scope)\n\n    @override_settings(\n        SOCIALACCOUNT_PROVIDERS={\n            \"trainingpeaks\": {\"SCOPE\": [\"athlete:profile\", \"workouts\", \"workouts:wod\"]}\n        }\n    )\n    def test_scope_from_settings(self):\n        Request = namedtuple(\"request\", [\"GET\"])\n        mock_request = Request(GET={})\n        scope = self.provider.get_scope_from_request(mock_request)\n        for item in (\"athlete:profile\", \"workouts\", \"workouts:wod\"):\n            self.assertTrue(item in scope)\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/trello/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/trello/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.trello.provider import TrelloProvider\nfrom tests.apps.socialaccount.base import OAuthTestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass TrelloTests(OAuthTestsMixin, TestCase):\n    provider_id = TrelloProvider.id\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                r\"\"\"\n{\"id\": \"123\", \"email\": \"raymond.penners@example.com\", \"username\": \"pennersr\", \"name\": \"Raymond\"}\n        \"\"\",\n            ),\n        ]  # noqa\n\n    def get_expected_to_str(self):\n        return \"pennersr\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/tumblr/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/tumblr/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.tumblr.provider import TumblrProvider\nfrom tests.apps.socialaccount.base import OAuthTestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass TumblrTests(OAuthTestsMixin, TestCase):\n    provider_id = TumblrProvider.id\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"\n{\n   \"meta\": {\n      \"status\": 200,\n      \"msg\": \"OK\"\n   },\n   \"response\": {\n     \"user\": {\n       \"following\": 263,\n       \"default_post_format\": \"html\",\n       \"name\": \"derekg\",\n       \"likes\": 606,\n       \"blogs\": [\n          {\n           \"name\": \"derekg\",\n           \"title\": \"Derek Gottfrid\",\n           \"url\": \"http://derekg.org/\",\n           \"tweet\": \"auto\",\n           \"primary\": true,\n           \"followers\": 33004929\n          },\n          {\n           \"name\": \"ihatehipstrz\",\n           \"title\": \"I Hate Hipstrz\"\n           }\n        ]\n     }\n} }\n\"\"\",\n            )\n        ]\n\n    def get_expected_to_str(self):\n        return \"derekg\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/tumblr_oauth2/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/tumblr_oauth2/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.tumblr_oauth2.provider import TumblrOAuth2Provider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass TumblrTests(OAuth2TestsMixin, TestCase):\n    provider_id = TumblrOAuth2Provider.id\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"\n{\n   \"meta\": {\n      \"status\": 200,\n      \"msg\": \"OK\"\n   },\n   \"response\": {\n     \"user\": {\n       \"following\": 263,\n       \"default_post_format\": \"html\",\n       \"name\": \"derekg\",\n       \"likes\": 606,\n       \"blogs\": [\n          {\n           \"name\": \"derekg\",\n           \"title\": \"Derek Gottfrid\",\n           \"url\": \"http://derekg.org/\",\n           \"tweet\": \"auto\",\n           \"primary\": true,\n           \"followers\": 33004929\n          },\n          {\n           \"name\": \"ihatehipstrz\",\n           \"title\": \"I Hate Hipstrz\"\n           }\n        ]\n     }\n} }\n\"\"\",\n            )\n        ]\n\n    def get_expected_to_str(self):\n        return \"derekg\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/twentythreeandme/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/twentythreeandme/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.twentythreeandme.provider import (\n    TwentyThreeAndMeProvider,\n)\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass TwentyThreeAndMeTests(OAuth2TestsMixin, TestCase):\n    provider_id = TwentyThreeAndMeProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n            \"profiles\": [\n                {\"id\": \"56c46bdb0902f8e2\", \"genotyped\": false}\n            ],\n            \"id\": \"b4b975a5a6a1b80b\"\n        }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"23andMe\"\n\n    def get_login_response_json(self, with_refresh_token=True):\n        return \"\"\"\n        {\n            \"access_token\":\"testac\",\n            \"token_type\":\"bearer\",\n            \"expires_in\": 86400,\n            \"refresh_token\":\"33c53cd7bb\",\n            \"scope\":\"basic\"\n        }\"\"\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/twitch/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/twitch/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\nfrom django.test.client import RequestFactory\nfrom django.urls import reverse\n\nfrom allauth.socialaccount.models import SocialToken\nfrom allauth.socialaccount.providers.oauth2.client import OAuth2Error\nfrom allauth.socialaccount.providers.twitch.provider import TwitchProvider\nfrom allauth.socialaccount.providers.twitch.views import TwitchOAuth2Adapter\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse, mocked_response\n\n\nclass TwitchTests(OAuth2TestsMixin, TestCase):\n    provider_id = TwitchProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n          \"data\": [{\n            \"id\": \"44322889\",\n            \"login\": \"dallas\",\n            \"display_name\": \"dallas\",\n            \"type\": \"staff\",\n            \"broadcaster_type\": \"\",\n            \"description\": \"Just a gamer playing games and chatting. :)\",\n            \"profile_image_url\": \"https://static-cdn.jtvnw.net/jtv_user_pictures/dallas-profile_image-1a2c906ee2c35f12-300x300.png\",\n            \"offline_image_url\": \"https://static-cdn.jtvnw.net/jtv_user_pictures/dallas-channel_offline_image-1a2c906ee2c35f12-1920x1080.png\",\n            \"view_count\": 191836881,\n            \"email\": \"login@provider.com\"\n          }]\n        }\n        \"\"\",\n        )  # noqa\n\n    def get_expected_to_str(self):\n        return \"dallas\"\n\n    def test_response_over_400_raises_OAuth2Error(self):\n        resp_mock = MockedResponse(HTTPStatus.BAD_REQUEST, '{\"error\": \"Invalid token\"}')\n        expected_error = \"Twitch API Error: Invalid token ()\"\n\n        self.check_for_error(resp_mock, expected_error)\n\n    def test_empty_or_missing_data_key_raises_OAuth2Error(self):\n        resp_mock = MockedResponse(HTTPStatus.OK, '{\"data\": []}')\n        expected_error = \"Invalid data from Twitch API: {'data': []}\"\n\n        self.check_for_error(resp_mock, expected_error)\n\n        resp_mock = MockedResponse(HTTPStatus.OK, '{\"missing_data\": \"key\"}')\n        expected_error = \"Invalid data from Twitch API: {'missing_data': 'key'}\"\n\n        self.check_for_error(resp_mock, expected_error)\n\n    def test_missing_twitch_id_raises_OAuth2Error(self):\n        resp_mock = MockedResponse(\n            HTTPStatus.OK, '{\"data\": [{\"login\": \"fake_twitch\"}]}'\n        )\n        expected_error = \"Invalid data from Twitch API: {'login': 'fake_twitch'}\"\n\n        self.check_for_error(resp_mock, expected_error)\n\n    def check_for_error(self, resp_mock, expected_error):\n        with self.assertRaises(OAuth2Error) as error_ctx:\n            self._run_just_complete_login(resp_mock)\n\n        self.assertEqual(str(error_ctx.exception).replace(\"u\", \"\"), expected_error)\n\n    def _run_just_complete_login(self, resp_mock):\n        \"\"\"\n        Helper function for checking that Error cases are\n        handled correctly. Running only `complete_login` means\n        we can check that the specific errors are raised before\n        they are caught and rendered to generic error HTML\n        \"\"\"\n        request = RequestFactory().get(\n            reverse(f\"{self.provider.id}_login\"),\n            {\"process\": \"login\"},\n        )\n        adapter = TwitchOAuth2Adapter(request)\n        app = adapter.get_provider().app\n        token = SocialToken(token=\"this-is-my-fake-token\")\n\n        with mocked_response(resp_mock):\n            adapter = TwitchOAuth2Adapter(request)\n            adapter.complete_login(request, app, token)\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/twitter/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/twitter/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.twitter.provider import TwitterProvider\nfrom tests.apps.socialaccount.base import OAuthTestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass TwitterTests(OAuthTestsMixin, TestCase):\n    provider_id = TwitterProvider.id\n\n    def get_mocked_response(self):\n        # TODO: Replace with actual/complete Twitter response\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                r\"\"\"\n{\"follow_request_sent\": false,\n \"profile_use_background_image\": true,\n \"id\": 45671919, \"verified\": false, \"profile_text_color\": \"333333\",\n \"profile_image_url_https\":\n       \"https://pbs.twimg.com/profile_images/793142149/r_normal.png\",\n \"profile_sidebar_fill_color\": \"DDEEF6\",\n \"is_translator\": false, \"geo_enabled\": false, \"entities\":\n {\"description\": {\"urls\": []}}, \"followers_count\": 43, \"protected\": false,\n \"location\": \"The Netherlands\", \"default_profile_image\": false,\n \"id_str\": \"45671919\", \"status\": {\"contributors\": null, \"truncated\":\n  false, \"text\": \"RT @denibertovic: Okay I'm definitely using django-allauth from now on. So easy to set up, far less time consuming, and it just works. #dja\\u2026\", \"in_reply_to_status_id\": null, \"id\": 400658301702381568, \"favorite_count\": 0, \"source\": \"<a href=\\\"http://x.com\\\" rel=\\\"nofollow\\\">Twitter Web Client</a>\", \"retweeted\": true, \"coordinates\": null, \"entities\": {\"symbols\": [], \"user_mentions\": [{\"indices\": [3, 16], \"screen_name\": \"denibertovic\", \"id\": 23508244, \"name\": \"Deni Bertovic\", \"id_str\": \"23508244\"}], \"hashtags\": [{\"indices\": [135, 139], \"text\": \"dja\"}], \"urls\": []}, \"in_reply_to_screen_name\": null, \"id_str\": \"400658301702381568\", \"retweet_count\": 6, \"in_reply_to_user_id\": null, \"favorited\": false, \"retweeted_status\": {\"lang\": \"en\", \"favorited\": false, \"in_reply_to_user_id\": null, \"contributors\": null, \"truncated\": false, \"text\": \"Okay I'm definitely using django-allauth from now on. So easy to set up, far less time consuming, and it just works. #django\", \"created_at\": \"Sun Jul 28 19:56:26 +0000 2013\", \"retweeted\": true, \"in_reply_to_status_id\": null, \"coordinates\": null, \"id\": 361575897674956800, \"entities\": {\"symbols\": [], \"user_mentions\": [], \"hashtags\": [{\"indices\": [117, 124], \"text\": \"django\"}], \"urls\": []}, \"in_reply_to_status_id_str\": null, \"in_reply_to_screen_name\": null, \"source\": \"web\", \"place\": null, \"retweet_count\": 6, \"geo\": null, \"in_reply_to_user_id_str\": null, \"favorite_count\": 8, \"id_str\": \"361575897674956800\"}, \"geo\": null, \"in_reply_to_user_id_str\": null, \"lang\": \"en\", \"created_at\": \"Wed Nov 13 16:15:57 +0000 2013\", \"in_reply_to_status_id_str\": null, \"place\": null}, \"utc_offset\": 3600, \"statuses_count\": 39, \"description\": \"\", \"friends_count\": 83, \"profile_link_color\": \"0084B4\", \"profile_image_url\": \"http://pbs.twimg.com/profile_images/793142149/r_normal.png\", \"notifications\": false, \"profile_background_image_url_https\": \"https://abs.twimg.com/images/themes/theme1/bg.png\", \"profile_background_color\": \"C0DEED\", \"profile_background_image_url\": \"http://abs.twimg.com/images/themes/theme1/bg.png\", \"name\": \"Raymond Penners\", \"lang\": \"nl\", \"profile_background_tile\": false, \"favourites_count\": 0, \"screen_name\": \"pennersr\", \"url\": null, \"created_at\": \"Mon Jun 08 21:10:45 +0000 2009\", \"contributors_enabled\": false, \"time_zone\": \"Amsterdam\", \"profile_sidebar_border_color\": \"C0DEED\", \"default_profile\": true, \"following\": false, \"listed_count\": 1} \"\"\",\n            )\n        ]  # noqa\n\n    def get_expected_to_str(self):\n        return \"pennersr\"\n\n    def test_login(self):\n        super().test_login()\n        account = SocialAccount.objects.get(uid=\"45671919\")\n        tw_account = account.get_provider_account()\n        self.assertEqual(tw_account.get_screen_name(), \"pennersr\")\n        self.assertEqual(\n            tw_account.get_avatar_url(),\n            \"http://pbs.twimg.com/profile_images/793142149/r.png\",\n        )\n        self.assertEqual(tw_account.get_profile_url(), \"https://x.com/pennersr\")\n        self.assertEqual(tw_account.to_str(), \"pennersr\")\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/twitter_oauth2/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/twitter_oauth2/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.twitter_oauth2.provider import (\n    TwitterOAuth2Provider,\n)\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass TwitterOAuth2Tests(OAuth2TestsMixin, TestCase):\n    provider_id = TwitterOAuth2Provider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n                \"data\": {\n                    \"created_at\": \"2020-09-02T13:39:14.000Z\",\n                    \"id\": \"1301152652357595137\",\n                    \"verified\": false,\n                    \"username\": \"realllkk520\",\n                    \"name\": \"realllkk520\",\n                    \"profile_image_url\": \"https://pbs.twimg.com/profile_images/1537259565632593920/OoRGPbUg_normal.jpg\"\n                }\n            }\n            \"\"\",\n        )  # noqa\n\n    def get_expected_to_str(self):\n        return \"realllkk520\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/untappd/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/untappd/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.untappd.provider import UntappdProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass UntappdTests(OAuth2TestsMixin, TestCase):\n    provider_id = UntappdProvider.id\n\n    def get_login_response_json(self, with_refresh_token=True):\n        return \"\"\"\n            {\n                \"meta\": {\n                    \"http_code\": 200\n                },\n                \"response\": {\n                    \"access_token\": \"testac\"\n                }\n            }\"\"\"\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\n   \"meta\":{\n      \"code\":200,\n      \"response_time\":{\n         \"time\":0.29,\n         \"measure\":\"seconds\"\n      },\n      \"init_time\":{\n         \"time\":0.011,\n         \"measure\":\"seconds\"\n      }\n   },\n   \"notifications\":{\n      \"type\":\"notifications\",\n      \"unread_count\":{\n         \"comments\":0,\n         \"toasts\":0,\n         \"friends\":0,\n         \"messages\":0,\n         \"news\":0\n      }\n   },\n   \"response\":{\n      \"user\":{\n         \"uid\":123456,\n         \"id\":123456,\n         \"user_name\":\"groovecoder\",\n         \"first_name\":\"\",\n         \"last_name\":\"\",\n         \"user_avatar\":\"https:\\\\/\\\\/gravatar.com\\\\/avatar\\\\/ec25d046746de3be33779256f6957d8f?size=100&d=https%3A%2F%2Funtappd.akamaized.net%2Fsite%2Fassets%2Fimages%2Fdefault_avatar_v2.jpg%3Fv%3D1\",\n         \"user_avatar_hd\":\"https:\\\\/\\\\/gravatar.com\\\\/avatar\\\\/ec25d046746de3be33779256f6957d8f?size=125&d=https%3A%2F%2Funtappd.akamaized.net%2Fsite%2Fassets%2Fimages%2Fdefault_avatar_v2.jpg%3Fv%3D1\",\n         \"user_cover_photo\":\"https:\\\\/\\\\/untappd.akamaized.net\\\\/site\\\\/assets\\\\/v3\\\\/images\\\\/cover_default.jpg\",\n         \"user_cover_photo_offset\":0,\n         \"is_private\":0,\n         \"location\":\"Testville\",\n         \"url\":\"\",\n         \"bio\":\"\",\n         \"is_supporter\":0,\n         \"relationship\":\"self\",\n         \"untappd_url\":\"http:\\\\/\\\\/untappd.com\\\\/user\\\\/testuser\",\n         \"account_type\":\"user\",\n         \"stats\":{\n            \"total_badges\":43,\n            \"total_friends\":43,\n            \"total_checkins\":73,\n            \"total_beers\":61,\n            \"total_created_beers\":1,\n            \"total_followings\":9,\n            \"total_photos\":31\n         },\n         \"recent_brews\":{},\n         \"checkins\":{},\n         \"media\":{},\n         \"contact\":{},\n         \"date_joined\":\"Tue, 11 Dec 2012 14:27:53 +0000\",\n         \"settings\":{\n            \"badge\":{\n               \"badges_to_facebook\":1,\n               \"badges_to_twitter\":1\n            },\n            \"checkin\":{\n               \"checkin_to_facebook\":0,\n               \"checkin_to_twitter\":0,\n               \"checkin_to_foursquare\":0\n            },\n            \"navigation\":{\n               \"default_to_checkin\":0\n            },\n            \"email_address\":\"test@example.com\"\n         }\n      }\n   }\n}\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"groovecoder\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/vimeo/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/vimeo/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.vimeo.provider import VimeoProvider\nfrom tests.apps.socialaccount.base import OAuthTestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass VimeoTests(OAuthTestsMixin, TestCase):\n    provider_id = VimeoProvider.id\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"\n{\"generated_in\":\"0.0137\",\n \"stat\":\"ok\",\"person\":{\n \"created_on\": \"2013-04-08 14:24:47\",\n \"id\":\"17574504\",\n \"is_contact\":\"0\",\n \"is_plus\":\"0\",\"is_pro\":\"0\",\"is_staff\":\"0\",\"is_subscribed_to\":\"0\",\n \"username\":\"user17574504\",\"display_name\":\"Raymond Penners\",\"location\":\"\",\n \"url\":[\"\"],\"bio\":\"\",\"number_of_contacts\":\"0\",\"number_of_uploads\":\"0\",\n \"number_of_likes\":\"0\",\"number_of_videos\":\"0\",\n \"number_of_videos_appears_in\":\"0\",\"number_of_albums\":\"0\",\n \"number_of_channels\":\"0\",\"number_of_groups\":\"0\",\n \"profileurl\":\"http:\\\\/\\\\/vimeo.com\\\\/user17574504\",\n \"videosurl\":\"http:\\\\/\\\\/vimeo.com\\\\/user17574504\\\\/videos\",\n \"portraits\":{\"portrait\":[{\"height\":\"30\",\"width\":\"30\",\n \"_content\":\n \"http:\\\\/\\\\/a.vimeocdn.com\\\\/images_v6\\\\/portraits\\\\/portrait_30_yellow.png\"},\n {\"height\":\"75\",\"width\":\"75\",\"_content\":\n \"http:\\\\/\\\\/a.vimeocdn.com\\\\/images_v6\\\\/portraits\\\\/portrait_75_yellow.png\"},\n {\"height\":\"100\",\"width\":\"100\",\"_content\":\n \"http:\\\\/\\\\/a.vimeocdn.com\\\\/images_v6\\\\/portraits\\\\/portrait_100_yellow.png\"},\n {\"height\":\"300\",\"width\":\"300\",\"_content\":\n \"http:\\\\/\\\\/a.vimeocdn.com\\\\/images_v6\\\\/portraits\\\\/portrait_300_yellow.png\"}]}}}\n\"\"\",\n            )\n        ]\n\n    def get_expected_to_str(self):\n        return \"user17574504\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/vimeo_oauth2/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/vimeo_oauth2/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.vimeo_oauth2.provider import VimeoOAuth2Provider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass VimeoOAuth2Tests(OAuth2TestsMixin, TestCase):\n    provider_id = VimeoOAuth2Provider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"{\n            \"uri\": \"/users/12345\",\n            \"name\": \"AllAuth\",\n            \"link\": \"https://vimeo.com/user12345\",\n            \"created_time\": \"2012-06-04T00:02:16+00:00\",\n            \"pictures\": {\n                \"uri\": null,\n                \"active\": false,\n                \"type\": \"default\",\n                \"sizes\": [{\n                    \"width\": 30,\n                    \"height\": 30,\n                    \"link\": \"https://i.vimeocdn.com/portrait/defaults-blue_30x30.png\"\n                }],\n                \"resource_key\": \"1234567890abcdef\"\n            },\n            \"resource_key\": \"1234567890abcdef\",\n            \"account\": \"pro\"\n        }\"\"\",\n        )  # noqa\n\n    def get_expected_to_str(self):\n        return \"AllAuth\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/vk/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/vk/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.vk.provider import VKProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass VKTests(OAuth2TestsMixin, TestCase):\n    provider_id = VKProvider.id\n\n    def get_mocked_response(self, verified_email=True):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\n    \"user\": {\n        \"user_id\": \"1234567890\",\n        \"first_name\": \"Ivan\",\n        \"last_name\": \"I.\",\n        \"phone\": \"79991234567\",\n        \"avatar\": \"http://avatar.com/12345678\",\n        \"email\": \"ivan_i123@vk.ru\",\n        \"sex\": 2,\n        \"verified\": false,\n        \"birthday\": \"01.01.2000\"\n    }\n}\n\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"ivan_i123@vk.ru\"\n\n    def get_login_response_json(self, with_refresh_token=True):\n        return \"\"\"\n{\n  \"access_token\": \"testac\",\n  \"refresh_token\": \"XXXXX\",\n  \"expires_in\": 0,\n  \"user_id\": 1234567890,\n  \"state\": \"XXX\",\n  \"scope\": \"email phone\"\n}\n\"\"\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/wahoo/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/wahoo/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.wahoo.provider import WahooProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass WahooTests(OAuth2TestsMixin, TestCase):\n    provider_id = WahooProvider.id\n\n    def get_mocked_response(self):\n        # https://cloud-api.wahooligan.com/#users\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n            {\n              \"id\": 60462,\n              \"height\": \"2.0\",\n              \"weight\": \"80.0\",\n              \"first\": \"Bob\",\n              \"last\": \"Smith\",\n              \"email\": \"sample@test-domain.com\",\n              \"birth\": \"1980-10-02\",\n              \"gender\": 1,\n              \"created_at\": \"2018-10-23T15:38:23.000Z\",\n              \"updated_at\": \"2018-10-24T20:46:40.000Z\"\n            }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"sample@test-domain.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/weibo/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/weibo/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.weibo.provider import WeiboProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass WeiboTests(OAuth2TestsMixin, TestCase):\n    provider_id = WeiboProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\"bi_followers_count\": 0,\n \"domain\": \"\", \"avatar_large\": \"http://tp3.sinaimg.cn/3195025850/180/0/0\",\n \"block_word\": 0, \"star\": 0, \"id\": 3195025850, \"city\": \"1\", \"verified\": false,\n \"follow_me\": false, \"verified_reason\": \"\", \"followers_count\": 6,\n \"location\": \"\\u5317\\u4eac \\u4e1c\\u57ce\\u533a\", \"mbtype\": 0,\n \"profile_url\": \"u/3195025850\", \"province\": \"11\", \"statuses_count\": 0,\n \"description\": \"\", \"friends_count\": 0, \"online_status\": 0, \"mbrank\": 0,\n \"idstr\": \"3195025850\",\n \"profile_image_url\": \"http://tp3.sinaimg.cn/3195025850/50/0/0\",\n \"allow_all_act_msg\": false, \"allow_all_comment\": true, \"geo_enabled\": true,\n \"name\": \"pennersr\", \"lang\": \"zh-cn\", \"weihao\": \"\", \"remark\": \"\",\n \"favourites_count\": 0, \"screen_name\": \"pennersr\", \"url\": \"\", \"gender\": \"f\",\n \"created_at\": \"Tue Feb 19 19:43:39 +0800 2013\", \"verified_type\": -1,\n \"following\": false}\n\n\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"pennersr\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/weixin/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/weixin/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.weixin.provider import WeixinProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass WeixinTests(OAuth2TestsMixin, TestCase):\n    provider_id = WeixinProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\"access_token\":\n \"OezXcEiiBSKSxW0eoylIeO5cPxb4Ks1RpbXGMv9uiV35032zNHGzXcld-EKsSScE3gRZMrUU78skCbp1ShtZnR0dQB8Wr_LUf7FA-H97Lnd2HgQah_GnkQex-vPFsGEwPPcNAV6q1Vz3uRNgL0MUFg\",\n \"city\": \"Pudong New District\",\n \"country\": \"CN\",\n \"expires_in\": 7200,\n \"headimgurl\":\n \"http://wx.qlogo.cn/mmopen/VkvLVEpoJiaibYsVyW8GzxHibzlnqSM7iaX09r6TWUJXCNQHibHz37krvN65HR1ibEpgH5K5sukcIzA3r1C4KQ9qyyX9XIUdY9lNOk/0\",\n \"language\": \"zh_CN\",\n \"nickname\": \"某某某\",\n \"openid\": \"ohS-VwAJ9GEXlplngwybJ3Z-ZHrI\",\n \"privilege\": [],\n \"province\": \"Shanghai\",\n \"refresh_token\":\n \"OezXcEiiBSKSxW0eoylIeO5cPxb4Ks1RpbXGMv9uiV35032zNHGzXcld-EKsSScEbMnnMqVExcSpj7KRAuBA8BU2j2e_FK5dgBe-ro32k7OuHtznwqqBn5QR7LZGo2-P8G7gG0eitjyZ751sFlnTAw\",\n \"scope\": \"snsapi_login\",\n \"sex\": 1,\n \"unionid\": \"ohHrhwKnD9TOunEW0eKTS45vS5Qo\"}\"\"\",\n        )  # noqa\n\n    def get_expected_to_str(self):\n        # For some reason, WeixinOAuth2Adapter.complete_login runs this line:\n        # extra_data[\"nickname\"] = nickname.encode(\"raw_unicode_escape\").decode(\n        #     \"utf-8\"\n        # )\n        return \"\\\\u67d0\\\\u67d0\\\\u67d0\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/windowslive/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/windowslive/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.windowslive.provider import WindowsLiveProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass WindowsLiveTests(OAuth2TestsMixin, TestCase):\n    provider_id = WindowsLiveProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n        {\n          \"first_name\": \"James\",\n          \"last_name\": \"Smith\",\n          \"name\": \"James Smith\",\n          \"locale\": \"en_US\",\n          \"gender\": null,\n          \"emails\": {\n              \"personal\": null,\n              \"account\": \"jsmith@example.com\",\n              \"business\": null,\n              \"preferred\": \"jsmith@example.com\"\n              },\n          \"link\": \"https://profile.live.com/\",\n          \"updated_time\": \"2014-02-07T00:35:27+0000\",\n          \"id\": \"83605e110af6ff98\"\n        }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"jsmith@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/xing/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/xing/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.xing.provider import XingProvider\nfrom tests.apps.socialaccount.base import OAuthTestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass XingTests(OAuthTestsMixin, TestCase):\n    provider_id = XingProvider.id\n\n    def get_mocked_response(self):\n        return [\n            MockedResponse(\n                HTTPStatus.OK,\n                \"\"\"\n{\"users\":[{\"id\":\"20493333_1cd028\",\"active_email\":\"raymond.penners@example.com\",\n\"badges\":[],\"birth_date\":{\"year\":null,\"month\":null,\"day\":null},\n\"business_address\":{\"street\":null,\"zip_code\":null,\"city\":null,\"province\":null,\n\"country\":\"NL\",\"email\":null,\"fax\":null,\"phone\":null,\"mobile_phone\":null},\n\"display_name\":\"Raymond Penners\",\"educational_background\":\n{\"primary_school_id\":null,\"schools\":[],\"qualifications\":[]},\n\"employment_status\":\"EMPLOYEE\",\"first_name\":\"Raymond\",\"gender\":\"m\",\n\"haves\":null,\"instant_messaging_accounts\":{},\"interests\":null,\"languages\":\n{\"nl\":null},\"last_name\":\"Penners\",\"organisation_member\":null,\n\"page_name\":\"Raymond_Penners\",\n\"permalink\":\"https://www.xing.com/profile/Raymond_Penners\",\n\"photo_urls\":{\"thumb\":\"https://www.xing.com/img/n/nobody_m.30x40.jpg\",\n\"large\":\"https://www.xing.com/img/n/nobody_m.140x185.jpg\",\"mini_thumb\":\n\"https://www.xing.com/img/n/nobody_m.18x24.jpg\",\"maxi_thumb\":\n\"https://www.xing.com/img/n/nobody_m.70x93.jpg\",\"medium_thumb\":\n\"https://www.xing.com/img/n/nobody_m.57x75.jpg\"},\"premium_services\":[],\n\"private_address\":{\"street\":null,\"zip_code\":null,\"city\":null,\"province\":null,\n\"country\":null,\"email\":\"raymond.penners@example.com\",\"fax\":null,\n\"phone\":null,\"mobile_phone\":null},\"professional_experience\":\n{\"primary_company\":{\"name\":null,\"url\":null,\"tag\":null,\"title\":null,\n\"begin_date\":null,\"end_date\":null,\"description\":null,\"industry\":\"OTHERS\",\n\"company_size\":null,\"career_level\":null},\"non_primary_companies\":[],\n\"awards\":[]},\"time_zone\":{\"utc_offset\":2.0,\"name\":\"Europe/Berlin\"},\n\"wants\":null,\"web_profiles\":{}}]}\n\n\"\"\",\n            )\n        ]\n\n    def get_expected_to_str(self):\n        return \"raymond.penners@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/yahoo/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/yahoo/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.yahoo.provider import YahooProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass YahooTests(OAuth2TestsMixin, TestCase):\n    provider_id = YahooProvider.id\n\n    def get_mocked_response(self):\n        response_data = \"\"\"\n        {\n         \"sub\": \"FSVIDUW3D7FSVIDUW3D72F2F\",\n         \"name\": \"Jane Doe\",\n         \"given_name\": \"Jane\",\n         \"family_name\": \"Doe\",\n         \"preferred_username\": \"j.doe\",\n         \"email\": \"janedoe@example.com\",\n         \"email_verified\": true,\n         \"picture\": \"http://example.com/janedoe/me.jpg\"\n        }\n        \"\"\"  # noqa\n        return MockedResponse(HTTPStatus.OK, response_data)\n\n    def get_expected_to_str(self):\n        return \"janedoe@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/yandex/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/yandex/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.yandex.provider import YandexProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass YandexTests(OAuth2TestsMixin, TestCase):\n    provider_id = YandexProvider.id\n\n    yandex_data = \"\"\"\n        {\n            \"login\": \"vasya\",\n                \"old_social_login\": \"uid-mmzxrnry\",\n                    \"default_email\": \"test@yandex.ru\",\n                        \"id\": \"1000034426\",\n                            \"client_id\": \"4760187d81bc4b7799476b42b5103713\",\n                                \"emails\": [\n                                    \"test@yandex.ru\",\n                                    \"other-test@yandex.ru\"\n                                ],\n                                \"openid_identities\": [\n                                    \"http://openid.yandex.ru/vasya/\",\n                                    \"http://vasya.ya.ru/\"\n                                ]\n        }\"\"\"\n\n    def get_mocked_response(self, data=None):\n        if data is None:\n            data = self.yandex_data\n        return MockedResponse(HTTPStatus.OK, data)\n\n    def get_expected_to_str(self):\n        return \"test@yandex.ru\"\n\n    def get_login_response_json(self, with_refresh_token=True):\n        return \"\"\"\n            {\n                \"access_token\":\"testac\",\n                \"refresh_token\":\"1:GN686QVt0mmakDd9:A4pYuW9LGk0_UnlrMIWklk\",\n                \"token_type\":\"bearer\",\n                \"expires_in\":124234123534\n            }\"\"\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/ynab/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/ynab/tests.py",
    "content": "from http import HTTPStatus\nfrom requests.exceptions import HTTPError\n\nfrom django.test import TestCase\nfrom django.test.client import RequestFactory\nfrom django.test.utils import override_settings\nfrom django.urls import reverse\n\nfrom allauth.socialaccount.models import SocialToken\nfrom allauth.socialaccount.providers.ynab.provider import YNABProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse, mocked_response\n\n\n@override_settings(\n    SOCIALACCOUNT_AUTO_SIGNUP=True,\n    ACCOUNT_SIGNUP_FORM_CLASS=None,\n)\n# ACCOUNT_EMAIL_VERIFICATION=account_settings\n# .EmailVerificationMethod.MANDATORY)\nclass YNABTests(OAuth2TestsMixin, TestCase):\n    provider_id = YNABProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n              {\"data\": {\n        \"user\":{\n        \"id\": \"abcd1234xyz5678\"\n                    }\n                }\n              }\n        \"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"YNAB\"\n\n    def test_ynab_compelete_login_401(self):\n        from allauth.socialaccount.providers.ynab.views import YNABOAuth2Adapter\n\n        class LessMockedResponse(MockedResponse):\n            def raise_for_status(self):\n                if self.status_code != HTTPStatus.OK:\n                    raise HTTPError(None)\n\n        request = RequestFactory().get(\n            reverse(f\"{self.provider.id}_login\"), dict(process=\"login\")\n        )\n\n        adapter = YNABOAuth2Adapter(request)\n        app = adapter.get_provider().app\n        token = SocialToken(token=\"some_token\")\n        response_with_401 = LessMockedResponse(\n            HTTPStatus.UNAUTHORIZED,\n            \"\"\"\n            {\"error\": {\n              \"errors\": [{\n                \"domain\": \"global\",\n                \"reason\": \"authError\",\n                \"message\": \"Invalid Credentials\",\n                \"locationType\": \"header\",\n                \"location\": \"Authorization\" } ],\n              \"code\": 401,\n              \"message\": \"Invalid Credentials\" }\n            }\"\"\",\n        )\n        with mocked_response(response_with_401):\n            with self.assertRaises(HTTPError):\n                adapter.complete_login(request, app, token)\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/zoho/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/zoho/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.zoho.provider import ZohoProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass ZohoTests(OAuth2TestsMixin, TestCase):\n    provider_id = ZohoProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\"First_Name\":\"John\",\"Email\":\"jdoe@example.com\",\n\"Last_Name\":\"Doe\",\"Display_Name\":\"JDoee\",\"ZUID\":1234567}\n\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"jdoe@example.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/providers/zoom/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/socialaccount/providers/zoom/tests.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import TestCase\n\nfrom allauth.socialaccount.providers.zoom.provider import ZoomProvider\nfrom tests.apps.socialaccount.base import OAuth2TestsMixin\nfrom tests.mocking import MockedResponse\n\n\nclass ZoomTests(OAuth2TestsMixin, TestCase):\n    provider_id = ZoomProvider.id\n\n    def get_mocked_response(self):\n        return MockedResponse(\n            HTTPStatus.OK,\n            \"\"\"\n{\n  \"id\": \"KdYKjnimT4KPd8FFgQt9FQ\",\n  \"first_name\": \"Jane\",\n  \"last_name\": \"Dev\",\n  \"email\": \"jane.dev@email.com\",\n  \"type\": 2,\n  \"role_name\": \"Owner\",\n  \"pmi\": 1234567890,\n  \"use_pmi\": false,\n  \"vanity_url\": \"https://janedevinc.zoom.us/my/janedev\",\n  \"personal_meeting_url\": \"https://janedevinc.zoom.us/j/1234567890\",\n  \"timezone\": \"America/Denver\",\n  \"verified\": 1,\n  \"dept\": \"\",\n  \"created_at\": \"2019-04-05T15:24:32Z\",\n  \"last_login_time\": \"2019-12-16T18:02:48Z\",\n  \"last_client_version\": \"4.6.12611.1124(mac)\",\n  \"pic_url\": \"https://janedev.zoom.us/p/KdYKjnimFR5Td8KKdQt9FQ/19f6430f-...\",\n  \"host_key\": \"533895\",\n  \"jid\": \"kdykjnimt4kpd8kkdqt9fq@xmpp.zoom.us\",\n  \"group_ids\": [],\n  \"im_group_ids\": [\n    \"3NXCD9VFTCOUH8LD-QciGw\"\n  ],\n  \"account_id\": \"gVcjZnYYRLDbb_MfgHuaxg\",\n  \"language\": \"en-US\",\n  \"phone_country\": \"US\",\n  \"phone_number\": \"+1 1234567891\",\n  \"status\": \"active\"\n}\n\"\"\",\n        )\n\n    def get_expected_to_str(self):\n        return \"jane.dev@email.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/test_adapter.py",
    "content": "from urllib.parse import parse_qs, urlparse\n\nfrom django.contrib.sites.models import Site\nfrom django.urls import reverse\n\nfrom allauth.socialaccount.adapter import DefaultSocialAccountAdapter, get_adapter\nfrom allauth.socialaccount.internal import statekit\nfrom allauth.socialaccount.models import SocialApp\n\n\nclass PrefixStateSocialAccountAdapter(DefaultSocialAccountAdapter):\n    def generate_state_param(self, state: dict) -> str:\n        return f\"prefix-{super().generate_state_param(state)}\"\n\n\ndef test_generate_state_param(settings, client, db, google_provider_settings):\n    settings.SOCIALACCOUNT_ADAPTER = (\n        \"tests.apps.socialaccount.test_adapter.PrefixStateSocialAccountAdapter\"\n    )\n    resp = client.post(reverse(\"google_login\"))\n    parsed = urlparse(resp[\"location\"])\n    query = parse_qs(parsed.query)\n    state = query[\"state\"][0]\n    assert len(state) == len(\"prefix-\") + statekit.STATE_ID_LENGTH\n    assert state.startswith(\"prefix-\")\n\n\ndef test_list_db_based_apps(db, settings):\n    app = SocialApp.objects.create(\n        provider=\"saml\", provider_id=\"urn:idp-identity-id\", client_id=\"org-slug\"\n    )\n    app.sites.add(Site.objects.get_current())\n    apps = get_adapter().list_apps(None, provider=\"saml\", client_id=\"org-slug\")\n    assert app.pk in [a.pk for a in apps]\n\n\ndef test_list_settings_based_apps(db, settings):\n    settings.SOCIALACCOUNT_PROVIDERS = {\n        \"saml\": {\n            \"APPS\": [\n                {\n                    \"provider_id\": \"urn:idp-entity-id\",\n                    \"client_id\": \"org-slug\",\n                }\n            ]\n        }\n    }\n    apps = get_adapter().list_apps(None, provider=\"saml\", client_id=\"org-slug\")\n    assert len(apps) == 1\n    app = apps[0]\n    assert not app.pk\n    assert app.client_id == \"org-slug\"\n\n\ndef test_get_signup_form_initial_data(sociallogin_factory):\n    sociallogin = sociallogin_factory(email=\"a@b.com\")\n    # it should pick up sociallogin.email_addresses\n    sociallogin.user.email = \"\"\n    initial_data = get_adapter().get_signup_form_initial_data(sociallogin)\n    assert initial_data[\"email\"] == \"a@b.com\"\n"
  },
  {
    "path": "tests/apps/socialaccount/test_connect.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import patch\n\nfrom django.urls import reverse\n\nimport pytest\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.socialaccount.internal import flows\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.providers.base.constants import AuthProcess\n\n\n@pytest.mark.parametrize(\"reauthentication_required\", [False, True])\ndef test_disconnect(auth_client, user, settings, mailoutbox, reauthentication_required):\n    settings.ACCOUNT_EMAIL_NOTIFICATIONS = True\n    settings.ACCOUNT_REAUTHENTICATION_REQUIRED = reauthentication_required\n    account_to_del = SocialAccount.objects.create(\n        uid=\"123\", provider=\"other-server\", user=user\n    )\n    account_to_keep = SocialAccount.objects.create(\n        uid=\"456\", provider=\"other-server\", user=user\n    )\n    resp = auth_client.get(reverse(\"socialaccount_connections\"))\n    assertTemplateUsed(resp, \"socialaccount/connections.html\")\n    resp = auth_client.post(\n        reverse(\"socialaccount_connections\"), {\"account\": account_to_del.pk}\n    )\n    if reauthentication_required:\n        assert SocialAccount.objects.filter(pk=account_to_del.pk).exists()\n        assert SocialAccount.objects.filter(pk=account_to_keep.pk).exists()\n    else:\n        assert not SocialAccount.objects.filter(pk=account_to_del.pk).exists()\n        assert SocialAccount.objects.filter(pk=account_to_keep.pk).exists()\n        assert len(mailoutbox) == 1\n        assert mailoutbox[0].subject == \"[example.com] Third-Party Account Disconnected\"\n\n\ndef test_connect_with_reauthentication(\n    auth_client, user, provider_callback_response, settings, user_password\n):\n    settings.ACCOUNT_REAUTHENTICATION_REQUIRED = True\n    resp = provider_callback_response(auth_client, process=\"connect\")\n    assert not SocialAccount.objects.filter(user=user).exists()\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_reauthenticate\")\n    resp = auth_client.post(resp[\"location\"], {\"password\": user_password})\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"socialaccount_connections\")\n    assert SocialAccount.objects.filter(user=user).exists()\n\n\ndef test_connect(\n    auth_client, user, provider_callback_response, settings, user_password, mailoutbox\n):\n    settings.ACCOUNT_EMAIL_NOTIFICATIONS = True\n    settings.ACCOUNT_REAUTHENTICATION_REQUIRED = False\n    resp = provider_callback_response(auth_client, process=\"connect\")\n    assert resp.status_code == HTTPStatus.FOUND\n    assert SocialAccount.objects.filter(user=user).exists()\n    assert resp[\"location\"] == reverse(\"socialaccount_connections\")\n    assert len(mailoutbox) == 1\n    assert mailoutbox[0].subject == \"[example.com] Third-Party Account Connected\"\n\n\n@pytest.mark.parametrize(\n    \"email_authentication,account_exists, expected_action\",\n    [\n        (False, False, \"added\"),\n        (False, True, \"updated\"),\n        (True, False, \"added\"),\n        (True, True, \"updated\"),\n    ],\n)\ndef test_connect_vs_email_authentication(\n    request_factory,\n    sociallogin_factory,\n    user,\n    settings,\n    email_authentication,\n    account_exists,\n    expected_action,\n):\n    settings.SOCIALACCOUNT_EMAIL_AUTHENTICATION = email_authentication\n    sociallogin = sociallogin_factory(email=user.email, provider=\"unittest-server\")\n    if account_exists:\n        account = sociallogin.account\n        account.user = user\n        account.save()\n\n    sociallogin.state[\"process\"] = AuthProcess.CONNECT\n    request = request_factory.get(\"/\")\n    request.user = user\n    with patch(\n        \"allauth.account.adapter.DefaultAccountAdapter.add_message\"\n    ) as add_message:\n        flows.login.complete_login(request, sociallogin)\n        assert add_message.call_args[1][\"message_context\"][\"action\"] == expected_action\n    assert SocialAccount.objects.filter(user=user, uid=sociallogin.account.uid).exists()\n"
  },
  {
    "path": "tests/apps/socialaccount/test_login.py",
    "content": "import copy\nfrom http import HTTPStatus\nfrom unittest.mock import ANY, patch\n\nfrom django.contrib.auth import get_user_model\nfrom django.contrib.auth.models import AnonymousUser\nfrom django.urls import reverse\n\nimport pytest\nfrom pytest_django.asserts import assertTemplateUsed\n\nfrom allauth.account.authentication import AUTHENTICATION_METHODS_SESSION_KEY\nfrom allauth.core import context\nfrom allauth.socialaccount.helpers import complete_social_login\nfrom allauth.socialaccount.models import SocialAccount, SocialToken\nfrom allauth.socialaccount.providers.base import AuthProcess\n\n\n@pytest.mark.parametrize(\"with_emailaddress\", [False, True])\n@pytest.mark.parametrize(\"auto_connect\", [False, True])\n@pytest.mark.parametrize(\"setting\", [\"off\", \"on-global\", \"on-provider\"])\ndef test_email_authentication(\n    db,\n    setting,\n    settings,\n    user_factory,\n    sociallogin_factory,\n    client,\n    request_factory,\n    mailoutbox,\n    auto_connect,\n    with_emailaddress,\n):\n    \"\"\"Tests that when an already existing email is given at the social signup\n    form, enumeration preventation kicks in.\n    \"\"\"\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_UNIQUE_EMAIL = True\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.SOCIALACCOUNT_AUTO_SIGNUP = True\n    settings.SOCIALACCOUNT_STORE_TOKENS = True\n    if setting == \"on-global\":\n        settings.SOCIALACCOUNT_EMAIL_AUTHENTICATION = True\n    elif setting == \"on-provider\":\n        settings.SOCIALACCOUNT_PROVIDERS = copy.deepcopy(\n            settings.SOCIALACCOUNT_PROVIDERS\n        )\n        settings.SOCIALACCOUNT_PROVIDERS[\"openid_connect\"][\n            \"EMAIL_AUTHENTICATION\"\n        ] = True\n    else:\n        settings.SOCIALACCOUNT_EMAIL_AUTHENTICATION = False\n    settings.SOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT = auto_connect\n\n    user = user_factory(with_emailaddress=with_emailaddress)\n    assert user.has_usable_password()\n\n    sociallogin = sociallogin_factory(\n        email=user.email, provider=\"unittest-server\", with_token=True\n    )\n\n    request = request_factory.get(\"/\")\n    request.user = AnonymousUser()\n    with context.request_context(request):\n        with patch(\n            \"allauth.socialaccount.signals.social_account_updated.send\"\n        ) as updated_signal:\n            with patch(\n                \"allauth.socialaccount.signals.social_account_added.send\"\n            ) as added_signal:\n                resp = complete_social_login(request, sociallogin)\n    user.refresh_from_db()\n    if setting == \"off\":\n        assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n        assert not added_signal.called\n        assert not updated_signal.called\n    else:\n        if with_emailaddress:\n            assert resp[\"location\"] == \"/accounts/profile/\"\n            assert user.has_usable_password()\n        else:\n            assert not user.has_usable_password()\n            # This should be improved. The provider vouches for the fact that\n            # the user verified the email, so we can mark it as such locally as\n            # well.\n\n            # user.email is set, but not verified.\n            assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n        assert get_user_model().objects.count() == 1\n        assert SocialAccount.objects.filter(user=user.pk).exists() == auto_connect\n        assert (\n            SocialToken.objects.filter(account__user=user.pk).exists() == auto_connect\n        )\n        assert added_signal.called == auto_connect\n        assert not updated_signal.called\n\n\ndef test_login_cancelled(client):\n    resp = client.get(reverse(\"socialaccount_login_cancelled\"))\n    assert resp.status_code == HTTPStatus.OK\n    assertTemplateUsed(resp, \"socialaccount/login_cancelled.html\")\n\n\n@pytest.mark.parametrize(\"store_tokens\", [False, True])\n@pytest.mark.parametrize(\n    \"process,did_record\",\n    [\n        (AuthProcess.LOGIN, True),\n        (AuthProcess.CONNECT, False),\n    ],\n)\ndef test_record_authentication(\n    db,\n    sociallogin_factory,\n    client,\n    request_factory,\n    user,\n    process,\n    did_record,\n    store_tokens,\n    settings,\n):\n    settings.SOCIALACCOUNT_STORE_TOKENS = store_tokens\n    sociallogin = sociallogin_factory(provider=\"unittest-server\", uid=\"123\")\n    sociallogin.state[\"process\"] = process\n    sociallogin.token = SocialToken(\n        app=sociallogin.provider.app, token=\"123\", token_secret=\"456\"\n    )\n    SocialAccount.objects.create(user=user, uid=\"123\", provider=\"unittest-server\")\n    request = request_factory.get(\"/\")\n    request.user = AnonymousUser()\n    with context.request_context(request):\n        complete_social_login(request, sociallogin)\n    if did_record:\n        assert request.session[AUTHENTICATION_METHODS_SESSION_KEY] == [\n            {\n                \"at\": ANY,\n                \"provider\": sociallogin.account.provider,\n                \"method\": \"socialaccount\",\n                \"uid\": \"123\",\n            }\n        ]\n    else:\n        assert AUTHENTICATION_METHODS_SESSION_KEY not in request.session\n    assert (\n        SocialToken.objects.filter(\n            account__uid=\"123\", token=\"123\", token_secret=\"456\"\n        ).exists()\n        == store_tokens\n    )\n"
  },
  {
    "path": "tests/apps/socialaccount/test_phone.py",
    "content": "from http import HTTPStatus\n\nfrom django.conf import settings\nfrom django.contrib.auth import get_user_model\nfrom django.urls import reverse, reverse_lazy\n\nimport pytest\n\nfrom allauth.account.adapter import get_adapter as get_account_adapter\nfrom allauth.socialaccount.models import SocialAccount\n\n\n@pytest.mark.parametrize(\n    \"phone_verified, phone_valid, phone_taken, expected_url\",\n    [\n        (True, True, False, settings.LOGIN_REDIRECT_URL),\n        (False, True, False, reverse_lazy(\"account_verify_phone\")),\n        (True, False, False, reverse_lazy(\"socialaccount_signup\")),\n        (True, True, True, reverse_lazy(\"socialaccount_signup\")),\n    ],\n)\ndef test_signup_with_phone(\n    db,\n    settings_impacting_urls,\n    client,\n    phone,\n    phone_verified,\n    phone_valid,\n    phone_taken,\n    expected_url,\n    user_factory,\n):\n    if phone_taken:\n        user_factory(phone=phone)\n    with settings_impacting_urls(\n        SOCIALACCOUNT_AUTO_SIGNUP=True,\n        ACCOUNT_LOGIN_METHODS=(\"phone\",),\n        ACCOUNT_SIGNUP_FIELDS=[\"phone*\"],\n    ):\n        resp = client.post(reverse(\"dummy_login\"))\n        assert resp.status_code == HTTPStatus.FOUND\n        assert resp[\"location\"].startswith(f\"{reverse('dummy_authenticate')}?state=\")\n        resp = client.post(\n            resp[\"location\"],\n            {\n                \"id\": \"123\",\n                \"email\": \"a@b.com\",\n                \"email_verified\": True,\n                \"phone\": phone if phone_valid else \"*INVALID*\",\n                \"phone_verified\": phone_verified,\n            },\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n        assert resp[\"location\"] == expected_url\n        if not phone_valid or phone_taken:\n            return\n        get_user_model().objects.filter(email=\"a@b.com\").exists()\n        socialaccount = SocialAccount.objects.get(uid=\"123\")\n        account = socialaccount.get_provider_account()\n        assert account.to_str() == \"a@b.com\"\n        assert get_account_adapter().get_phone(socialaccount.user) == (\n            phone,\n            phone_verified,\n        )\n"
  },
  {
    "path": "tests/apps/socialaccount/test_registry.py",
    "content": "from django.apps import AppConfig, apps\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\n\nfrom allauth.socialaccount import providers\n\n\nclass CustomFacebookAppConfig(AppConfig):\n    name = \"allauth.socialaccount.providers.facebook\"\n    label = \"allauth_facebook\"\n\n\nclass ProviderRegistryTests(TestCase):\n    @override_settings(\n        INSTALLED_APPS=[\n            \"allauth.socialaccount.providers.facebook\",\n        ]\n    )\n    def test_load_provider_with_default_app_config(self):\n        registry = providers.ProviderRegistry()\n        provider_list = registry.get_class_list()\n\n        self.assertTrue(registry.loaded)\n        self.assertEqual(1, len(provider_list))\n        self.assertTrue(\n            issubclass(\n                provider_list[0],\n                providers.facebook.provider.FacebookProvider,\n            )\n        )\n\n        app_config_list = list(apps.get_app_configs())\n        self.assertEqual(1, len(app_config_list))\n        app_config = app_config_list[0]\n        self.assertEqual(\"allauth.socialaccount.providers.facebook\", app_config.name)\n        self.assertEqual(\"facebook\", app_config.label)\n\n    @override_settings(\n        INSTALLED_APPS=[\n            \"tests.apps.socialaccount.test_registry.CustomFacebookAppConfig\",\n        ]\n    )\n    def test_load_provider_with_custom_app_config(self):\n        registry = providers.ProviderRegistry()\n        provider_list = registry.get_class_list()\n\n        self.assertTrue(registry.loaded)\n        self.assertEqual(1, len(provider_list))\n        self.assertTrue(\n            issubclass(\n                provider_list[0],\n                providers.facebook.provider.FacebookProvider,\n            )\n        )\n\n        app_config_list = list(apps.get_app_configs())\n        self.assertEqual(1, len(app_config_list))\n        app_config = app_config_list[0]\n        self.assertEqual(\"allauth.socialaccount.providers.facebook\", app_config.name)\n        self.assertEqual(\"allauth_facebook\", app_config.label)\n"
  },
  {
    "path": "tests/apps/socialaccount/test_signup.py",
    "content": "from http import HTTPStatus\nfrom unittest.mock import ANY, patch\n\nfrom django.conf import settings\nfrom django.contrib.auth import get_user_model\nfrom django.contrib.auth.models import AnonymousUser\nfrom django.urls import reverse\n\nimport pytest\nfrom pytest_django.asserts import assertFormError, assertRedirects\n\nfrom allauth.account import app_settings as account_settings\nfrom allauth.account.authentication import AUTHENTICATION_METHODS_SESSION_KEY\nfrom allauth.account.models import EmailAddress\nfrom allauth.account.utils import user_email, user_username\nfrom allauth.core import context\nfrom allauth.socialaccount.helpers import complete_social_login\nfrom allauth.socialaccount.models import SocialAccount\nfrom allauth.socialaccount.views import signup\n\n\n@pytest.fixture\ndef setup_sociallogin_flow(request_factory):\n    def f(client, sociallogin):\n        request = request_factory.get(\"/\")\n        request.user = AnonymousUser()\n\n        with context.request_context(request):\n            resp = complete_social_login(request, sociallogin)\n            session = client.session\n            for k, v in request.session.items():\n                session[k] = v\n            session.save()\n            return resp\n\n    return f\n\n\n@pytest.fixture\ndef email_address_clash(\n    request_factory, sociallogin_factory, twitter_provider_settings\n):\n    def _email_address_clash(username, email):\n        User = get_user_model()\n        # Some existig user\n        exi_user = User()\n        user_username(exi_user, \"test\")\n        exi_user_email = \"test@example.com\"\n        user_email(exi_user, exi_user_email)\n        exi_user.save()\n        EmailAddress.objects.create(\n            user=exi_user, email=exi_user_email, verified=True, primary=True\n        )\n\n        # A social user being signed up...\n        sociallogin = sociallogin_factory(\n            provider=\"twitter\", username=username, email=email\n        )\n\n        # Signing up, should pop up the social signup form\n        request = request_factory.get(\"/accounts/twitter/login/callback/\")\n        request.user = AnonymousUser()\n        with context.request_context(request):\n            resp = complete_social_login(request, sociallogin)\n        return request, resp\n\n    return _email_address_clash\n\n\ndef test_email_address_created(\n    settings, db, client, setup_sociallogin_flow, sociallogin_factory\n):\n    settings.SOCIALACCOUNT_AUTO_SIGNUP = True\n    settings.ACCOUNT_SIGNUP_FORM_CLASS = None\n    settings.ACCOUNT_EMAIL_VERIFICATION = account_settings.EmailVerificationMethod.NONE\n\n    sociallogin = sociallogin_factory(\n        email=\"test@example.com\", email_verified=False, username=\"test\"\n    )\n    setup_sociallogin_flow(client, sociallogin)\n\n    user = get_user_model().objects.get(\n        **{account_settings.USER_MODEL_USERNAME_FIELD: \"test\"}\n    )\n    assert SocialAccount.objects.filter(user=user, uid=sociallogin.account.uid).exists()\n    assert EmailAddress.objects.filter(user=user, email=user_email(user)).exists()\n\n\ndef test_email_address_clash_username_required(\n    db, client, settings, email_address_clash\n):\n    \"\"\"Test clash on both username and email\"\"\"\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_UNIQUE_EMAIL = True\n    settings.ACCOUNT_USERNAME_REQUIRED = True\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.SOCIALACCOUNT_AUTO_SIGNUP = True\n    request, resp = email_address_clash(\"test\", \"test@example.com\")\n    assert resp[\"location\"] == reverse(\"socialaccount_signup\")\n\n    # POST different username/email to social signup form\n    request.method = \"POST\"\n    request.POST = {\"username\": \"other\", \"email\": \"other@example.com\"}\n    with context.request_context(request):\n        resp = signup(request)\n    assert resp[\"location\"] == \"/accounts/profile/\"\n    user = get_user_model().objects.get(\n        **{account_settings.USER_MODEL_EMAIL_FIELD: \"other@example.com\"}\n    )\n    assert user_username(user) == \"other\"\n\n\ndef test_email_address_clash_username_not_required(db, settings, email_address_clash):\n    \"\"\"Test clash while username is not required\"\"\"\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_UNIQUE_EMAIL = True\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.SOCIALACCOUNT_AUTO_SIGNUP = True\n    request, resp = email_address_clash(\"test\", \"test@example.com\")\n    assert resp[\"location\"] == reverse(\"socialaccount_signup\")\n\n    # POST email to social signup form (username not present)\n    request.method = \"POST\"\n    request.POST = {\"email\": \"other@example.com\"}\n    with context.request_context(request):\n        resp = signup(request)\n    assert resp[\"location\"] == \"/accounts/profile/\"\n    user = get_user_model().objects.get(\n        **{account_settings.USER_MODEL_EMAIL_FIELD: \"other@example.com\"}\n    )\n    assert user_username(user) != \"test\"\n\n\ndef test_email_address_clash_username_auto_signup(db, settings, email_address_clash):\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_UNIQUE_EMAIL = True\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.SOCIALACCOUNT_AUTO_SIGNUP = True\n    # Clash on username, but auto signup still works\n    request, resp = email_address_clash(\"test\", \"other@example.com\")\n    assert resp[\"location\"] == \"/accounts/profile/\"\n    user = get_user_model().objects.get(\n        **{account_settings.USER_MODEL_EMAIL_FIELD: \"other@example.com\"}\n    )\n    assert user_username(user) != \"test\"\n\n\ndef test_populate_username_in_blacklist(\n    db, settings, request_factory, sociallogin_factory, twitter_provider_settings\n):\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_USERNAME_BLACKLIST = [\"username\", \"username1\", \"username2\"]\n    settings.ACCOUNT_UNIQUE_EMAIL = True\n    settings.ACCOUNT_USERNAME_REQUIRED = True\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.SOCIALACCOUNT_AUTO_SIGNUP = True\n    request = request_factory.get(\"/accounts/twitter/login/callback/\")\n    request.user = AnonymousUser()\n    sociallogin = sociallogin_factory(\n        provider=\"twitter\", username=\"username\", email=\"username@example.com\"\n    )\n    with context.request_context(request):\n        complete_social_login(request, sociallogin)\n\n    assert request.user.username not in account_settings.USERNAME_BLACKLIST\n\n\ndef test_verified_email_change_at_signup(\n    db, client, settings, sociallogin_factory, setup_sociallogin_flow\n):\n    \"\"\"\n    Test scenario for when the user changes email at social signup. Current\n    behavior is that both the unverified and verified email are added, and\n    that the user is allowed to pass because he did provide a verified one.\n    \"\"\"\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.ACCOUNT_UNIQUE_EMAIL = True\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.SOCIALACCOUNT_AUTO_SIGNUP = False\n\n    sociallogin = sociallogin_factory(email=\"verified@example.com\")\n    setup_sociallogin_flow(client, sociallogin)\n    resp = client.get(reverse(\"socialaccount_signup\"))\n    form = resp.context[\"form\"]\n    assert form[\"email\"].value() == \"verified@example.com\"\n    resp = client.post(\n        reverse(\"socialaccount_signup\"),\n        data={\"email\": \"unverified@example.org\"},\n    )\n    assertRedirects(resp, \"/accounts/profile/\", fetch_redirect_response=False)\n    user = get_user_model().objects.all()[0]\n    assert user_email(user) == \"verified@example.com\"\n    assert EmailAddress.objects.filter(\n        user=user,\n        email=\"verified@example.com\",\n        verified=True,\n        primary=True,\n    ).exists()\n    assert EmailAddress.objects.filter(\n        user=user,\n        email=\"unverified@example.org\",\n        verified=False,\n        primary=False,\n    ).exists()\n\n\ndef test_unverified_email_change_at_signup(\n    db, client, settings, sociallogin_factory, setup_sociallogin_flow\n):\n    \"\"\"\n    Test scenario for when the user changes email at social signup, while\n    his provider did not provide a verified email. In that case, email\n    verification will kick in. Here, both email addresses are added as\n    well.\n    \"\"\"\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.ACCOUNT_UNIQUE_EMAIL = True\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.SOCIALACCOUNT_AUTO_SIGNUP = False\n\n    User = get_user_model()\n    sociallogin = sociallogin_factory(\n        email=\"unverified@example.com\", email_verified=False\n    )\n    setup_sociallogin_flow(client, sociallogin)\n    resp = client.get(reverse(\"socialaccount_signup\"))\n    form = resp.context[\"form\"]\n    assert form[\"email\"].value() == \"unverified@example.com\"\n    resp = client.post(\n        reverse(\"socialaccount_signup\"),\n        data={\"email\": \"unverified@example.org\"},\n    )\n\n    assertRedirects(resp, reverse(\"account_email_verification_sent\"))\n    user = User.objects.all()[0]\n    assert user_email(user) == \"unverified@example.org\"\n    assert EmailAddress.objects.filter(\n        user=user,\n        email=\"unverified@example.com\",\n        verified=False,\n        primary=False,\n    ).exists()\n    assert EmailAddress.objects.filter(\n        user=user,\n        email=\"unverified@example.org\",\n        verified=False,\n        primary=True,\n    ).exists()\n\n\ndef test_unique_email_validation_signup(\n    db, client, sociallogin_factory, settings, setup_sociallogin_flow\n):\n    settings.ACCOUNT_PREVENT_ENUMERATION = False\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.ACCOUNT_UNIQUE_EMAIL = True\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.SOCIALACCOUNT_AUTO_SIGNUP = False\n    User = get_user_model()\n    email = \"me@example.com\"\n    user = User.objects.create(email=email)\n    EmailAddress.objects.create(email=email, user=user, verified=True)\n    sociallogin = sociallogin_factory(email=\"me@example.com\")\n    setup_sociallogin_flow(client, sociallogin)\n    resp = client.get(reverse(\"socialaccount_signup\"))\n    form = resp.context[\"form\"]\n    assert form[\"email\"].value() == email\n    resp = client.post(reverse(\"socialaccount_signup\"), data={\"email\": email})\n    assertFormError(\n        resp.context[\"form\"],\n        \"email\",\n        \"An account already exists with this email address.\"\n        \" Please sign in to that account first, then connect\"\n        \" your Unittest Server account.\",\n    )\n\n\ndef test_social_account_taken_at_signup(\n    db, client, sociallogin_factory, settings, setup_sociallogin_flow\n):\n    \"\"\"\n    Test scenario for when the user signs up with a social account\n    and uses email address in that social account. But upon seeing the\n    verification screen, they realize that email address is somehow\n    unusable for them, and so backs up and enters a different email\n    address (and is forced to choose a new username) while providing\n    the same social account token which is owned by their first attempt.\n    \"\"\"\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.ACCOUNT_UNIQUE_EMAIL = True\n    settings.ACCOUNT_USERNAME_REQUIRED = True\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.SOCIALACCOUNT_AUTO_SIGNUP = False\n\n    User = get_user_model()\n    sociallogin = sociallogin_factory(email=\"me1@example.com\", email_verified=False)\n    setup_sociallogin_flow(client, sociallogin)\n    resp = client.get(reverse(\"socialaccount_signup\"))\n    form = resp.context[\"form\"]\n    assert form[\"email\"].value() == \"me1@example.com\"\n    resp = client.post(\n        reverse(\"socialaccount_signup\"),\n        data={\"username\": \"me1\", \"email\": \"me1@example.com\"},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert User.objects.count() == 1\n    assert SocialAccount.objects.count() == 1\n\n    resp = client.get(reverse(\"socialaccount_signup\"))\n    assertRedirects(resp, reverse(\"account_login\"))\n\n\ndef test_email_address_required_missing_from_sociallogin(\n    db, settings, sociallogin_factory, client, setup_sociallogin_flow\n):\n    \"\"\"Tests that when the email address is missing from the sociallogin email\n    verification kicks in.\n    \"\"\"\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_UNIQUE_EMAIL = True\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.SOCIALACCOUNT_AUTO_SIGNUP = True\n\n    sociallogin = sociallogin_factory(with_email=False)\n    resp = setup_sociallogin_flow(client, sociallogin)\n    assert resp[\"location\"] == reverse(\"socialaccount_signup\")\n\n    resp = client.post(reverse(\"socialaccount_signup\"), {\"email\": \"other@example.org\"})\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n\n\ndef test_email_address_conflict_at_social_signup_form(\n    db,\n    settings,\n    user_factory,\n    sociallogin_factory,\n    client,\n    setup_sociallogin_flow,\n    mailoutbox,\n):\n    \"\"\"Tests that when an already existing email is given at the social signup\n    form, enumeration preventation kicks in.\n    \"\"\"\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_UNIQUE_EMAIL = True\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.SOCIALACCOUNT_AUTO_SIGNUP = True\n\n    user = user_factory()\n    sociallogin = sociallogin_factory(with_email=False)\n\n    resp = setup_sociallogin_flow(client, sociallogin)\n    # Auto signup does not kick in as the `sociallogin` does not have an email.\n    assert resp[\"location\"] == reverse(\"socialaccount_signup\")\n\n    # Here, we input the already existing email.\n    resp = client.post(reverse(\"socialaccount_signup\"), {\"email\": user.email})\n    assert mailoutbox[0].subject == \"[example.com] Account Already Exists\"\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n\n\ndef test_email_address_conflict_during_auto_signup(\n    db,\n    settings,\n    user_factory,\n    sociallogin_factory,\n    client,\n    mailoutbox,\n    setup_sociallogin_flow,\n):\n    \"\"\"Tests that when an already existing email is received from the provider,\n    enumeration preventation kicks in.\n    \"\"\"\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_UNIQUE_EMAIL = True\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"mandatory\"\n    settings.SOCIALACCOUNT_AUTO_SIGNUP = True\n\n    user = user_factory()\n    sociallogin = sociallogin_factory(email=user.email, with_email=True)\n    resp = setup_sociallogin_flow(client, sociallogin)\n    assert resp[\"location\"] == reverse(\"account_email_verification_sent\")\n    assert mailoutbox[0].subject == \"[example.com] Account Already Exists\"\n\n\ndef test_email_address_conflict_removes_conflicting_email(\n    db,\n    settings,\n    user_factory,\n    sociallogin_factory,\n    client,\n    mailoutbox,\n    setup_sociallogin_flow,\n):\n    \"\"\"Tests that when an already existing email is given at the social signup\n    form, enumeration preventation kicks in.\n    \"\"\"\n    settings.ACCOUNT_EMAIL_REQUIRED = True\n    settings.ACCOUNT_UNIQUE_EMAIL = True\n    settings.ACCOUNT_USERNAME_REQUIRED = False\n    settings.ACCOUNT_LOGIN_METHODS = {\"email\"}\n    settings.ACCOUNT_EMAIL_VERIFICATION = \"optional\"\n    settings.SOCIALACCOUNT_AUTO_SIGNUP = True\n    settings.SOCIALACCOUNT_EMAIL_AUTHENTICATION = False\n\n    user = user_factory(email_verified=False)\n    sociallogin = sociallogin_factory(email=user.email, email_verified=False)\n\n    resp = setup_sociallogin_flow(client, sociallogin)\n\n    # Auto signup does not kick in as the `sociallogin` has a conflicting email.\n    assert resp[\"location\"] == reverse(\"socialaccount_signup\")\n\n    # Here, we input the already existing email.\n    resp = client.post(reverse(\"socialaccount_signup\"), {\"email\": \"other@email.org\"})\n    assert mailoutbox[0].subject == \"[example.com] Please Confirm Your Email Address\"\n    assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n    assert EmailAddress.objects.filter(email=user.email).count() == 1\n\n\ndef test_signup_closed(\n    settings,\n    db,\n    client,\n    setup_sociallogin_flow,\n    sociallogin_factory,\n):\n    sociallogin = sociallogin_factory(\n        email=\"test@example.com\", email_verified=False, username=\"test\"\n    )\n    with patch(\n        \"allauth.socialaccount.adapter.DefaultSocialAccountAdapter.is_open_for_signup\"\n    ) as iofs:\n        iofs.return_value = False\n        resp = setup_sociallogin_flow(client, sociallogin)\n    assert b\"Sign Up Closed\" in resp.content\n    assert not get_user_model().objects.exists()\n\n\ndef test_authentication_records(client, db):\n    resp = client.post(reverse(\"dummy_login\"))\n    assert resp.status_code == HTTPStatus.FOUND\n    resp = client.post(\n        resp[\"location\"],\n        {\"id\": \"123\", \"email\": \"a@b.com\", \"email_verified\": True},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == settings.LOGIN_REDIRECT_URL\n    assert client.session[AUTHENTICATION_METHODS_SESSION_KEY] == [\n        {\n            \"at\": ANY,\n            \"method\": \"socialaccount\",\n            \"provider\": \"dummy\",\n            \"uid\": \"123\",\n        }\n    ]\n"
  },
  {
    "path": "tests/apps/socialaccount/test_utils.py",
    "content": "from django.contrib.auth import get_user_model\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\n\nfrom allauth.socialaccount.models import SocialAccount\n\n\nclass UtilTests(TestCase):\n    def test_social_account_str_default(self):\n        User = get_user_model()\n        user = User(username=\"test\")\n        sa = SocialAccount(user=user)\n        self.assertEqual(\"test\", str(sa))\n\n    def socialaccount_str_custom_formatter(socialaccount):\n        return f\"A custom str builder for {socialaccount.user}\"\n\n    @override_settings(\n        SOCIALACCOUNT_SOCIALACCOUNT_STR=socialaccount_str_custom_formatter\n    )\n    def test_social_account_str_customized(self):\n        User = get_user_model()\n        user = User(username=\"test\")\n        sa = SocialAccount(user=user)\n        self.assertEqual(\"A custom str builder for test\", str(sa))\n"
  },
  {
    "path": "tests/apps/test_utils.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import RequestFactory, TestCase\nfrom django.utils.http import base36_to_int, int_to_base36\nfrom django.views import csrf\n\nfrom allauth import app_settings, utils\n\n\nclass BasicTests(TestCase):\n    def setUp(self):\n        self.factory = RequestFactory()\n\n    def test_generate_unique_username(self):\n        examples = [\n            (\"a.b-c@example.com\", \"a.b-c\"),\n            (\"Üsêrnamê\", \"username\"),\n            (\"User Name\", \"user_name\"),\n            (\"\", \"user\"),\n        ]\n        for input, username in examples:\n            self.assertEqual(utils.generate_unique_username([input]), username)\n\n    def test_build_absolute_uri(self):\n        request = None\n        if not app_settings.SITES_ENABLED:\n            request = self.factory.get(\"/\")\n            request.META[\"SERVER_NAME\"] = \"example.com\"\n        self.assertEqual(\n            utils.build_absolute_uri(request, \"/foo\"), \"http://example.com/foo\"\n        )\n        self.assertEqual(\n            utils.build_absolute_uri(request, \"/foo\", protocol=\"ftp\"),\n            \"ftp://example.com/foo\",\n        )\n        self.assertEqual(\n            utils.build_absolute_uri(request, \"http://foo.com/bar\"),\n            \"http://foo.com/bar\",\n        )\n\n    def test_int_to_base36(self):\n        n = 55798679658823689999\n        b36 = \"brxk553wvxbf3\"\n        assert int_to_base36(n) == b36\n        assert base36_to_int(b36) == n\n\n    def test_templatetag_with_csrf_failure(self):\n        # Generate a fictitious GET request\n        if not app_settings.SOCIALACCOUNT_ENABLED:\n            return\n\n        from allauth.socialaccount.models import SocialApp\n\n        app = SocialApp.objects.create(provider=\"google\")\n        if app_settings.SITES_ENABLED:\n            from django.contrib.sites.models import Site\n\n            app.sites.add(Site.objects.get_current())\n\n        request = self.factory.get(\"/tests/test_403_csrf.html\")\n        # Simulate a CSRF failure by calling the View directly\n        # This template is using the `provider_login_url` templatetag\n        response = csrf.csrf_failure(request, template_name=\"test_403_csrf.html\")\n        # Ensure that CSRF failures with this template\n        # tag succeed with the expected 403 response\n        self.assertEqual(response.status_code, HTTPStatus.FORBIDDEN)\n"
  },
  {
    "path": "tests/apps/usersessions/__init__.py",
    "content": ""
  },
  {
    "path": "tests/apps/usersessions/test_middleware.py",
    "content": "from unittest.mock import Mock\n\nfrom django.contrib.auth.models import AnonymousUser\nfrom django.test.utils import override_settings\n\nimport pytest\n\nfrom allauth.usersessions.middleware import UserSessionsMiddleware\nfrom allauth.usersessions.models import UserSession\nfrom allauth.usersessions.signals import session_client_changed\n\n\ndef test_mw_without_request_user(rf, db, settings):\n    settings.USERSESSIONS_TRACK_ACTIVITY = True\n    mw = UserSessionsMiddleware(lambda request: None)\n    request = rf.get(\"/\")\n    mw(request)\n    assert UserSession.objects.count() == 0\n\n\n@pytest.mark.parametrize(\"track_activity\", [False, True])\ndef test_mw_with_request_user(rf, db, settings, user, track_activity):\n    settings.USERSESSIONS_TRACK_ACTIVITY = track_activity\n    mw = UserSessionsMiddleware(lambda request: None)\n    request = rf.get(\"/\")\n    request.user = user\n    request.session = Mock()\n    request.session.session_key = \"sess-123\"\n    mw(request)\n    assert (\n        UserSession.objects.filter(session_key=\"sess-123\", user=user).exists()\n        is track_activity\n    )\n\n\ndef test_mw_with_anonymous_request_user(rf, db, settings):\n    settings.USERSESSIONS_TRACK_ACTIVITY = True\n    mw = UserSessionsMiddleware(lambda request: None)\n    request = rf.get(\"/\")\n    request.user = AnonymousUser()\n    request.session = Mock()\n    request.session.session_key = \"sess-123\"\n    mw(request)\n    assert not UserSession.objects.exists()\n\n\n@override_settings(USERSESSIONS_TRACK_ACTIVITY=True)\ndef test_mw_change_ip_and_useragent(rf, db, user):\n    mw = UserSessionsMiddleware(lambda request: None)\n\n    # First request\n    request1 = rf.get(\"/\")\n    request1.user = user\n    request1.session = Mock()\n    request1.session.session_key = \"sess-123\"\n    request1.META[\"HTTP_USER_AGENT\"] = \"Old User Agent\"\n    request1.META[\"REMOTE_ADDR\"] = \"1.1.1.1\"\n    mw(request1)\n\n    # Second request with changed IP and User Agent\n    request2 = rf.get(\"/\")\n    request2.user = user\n    request2.session = Mock()\n    request2.session.session_key = \"sess-123\"\n    request2.META[\"HTTP_USER_AGENT\"] = \"New User Agent\"\n    request2.META[\"REMOTE_ADDR\"] = \"2.2.2.2\"\n\n    # Set up signal receiver\n    signal_received = []\n\n    def signal_handler(sender, request, from_session, to_session, **kwargs):\n        signal_received.append((from_session, to_session))\n\n    session_client_changed.connect(signal_handler)\n\n    # Process second request\n    mw(request2)\n\n    # Check if UserSession was updated\n    user_session = UserSession.objects.get(session_key=\"sess-123\", user=user)\n    assert user_session.ip == \"2.2.2.2\"\n    assert user_session.user_agent == \"New User Agent\"\n\n    # Check if signal was triggered\n    assert len(signal_received) == 1\n    from_session, to_session = signal_received[0]\n    assert from_session.ip == \"1.1.1.1\"\n    assert from_session.user_agent == \"Old User Agent\"\n    assert to_session.ip == \"2.2.2.2\"\n    assert to_session.user_agent == \"New User Agent\"\n\n    # Clean up signal connection\n    session_client_changed.disconnect(signal_handler)\n"
  },
  {
    "path": "tests/apps/usersessions/test_views.py",
    "content": "from http import HTTPStatus\n\nfrom django.test import Client\nfrom django.urls import reverse\n\nimport pytest\n\nfrom allauth.usersessions.models import UserSession\n\n\ndef test_overall_flow(user, user_password):\n    firefox = Client(HTTP_USER_AGENT=\"Mozilla Firefox\")\n    nyxt = Client(HTTP_USER_AGENT=\"Nyxt\")\n    for client in [firefox, nyxt]:\n        resp = client.post(\n            reverse(\"account_login\"),\n            {\"login\": user.username, \"password\": user_password},\n        )\n        assert resp.status_code == HTTPStatus.FOUND\n    assert UserSession.objects.filter(user=user).count() == 2\n    sessions = list(UserSession.objects.filter(user=user).order_by(\"pk\"))\n    assert sessions[0].user_agent == \"Mozilla Firefox\"\n    assert sessions[1].user_agent == \"Nyxt\"\n    for client in [firefox, nyxt]:\n        resp = client.get(reverse(\"usersessions_list\"))\n        assert resp.status_code == HTTPStatus.OK\n    resp = firefox.post(reverse(\"usersessions_list\"))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert UserSession.objects.filter(user=user).count() == 1\n    assert UserSession.objects.filter(user=user, pk=sessions[0].pk).exists()\n    assert not UserSession.objects.filter(user=user, pk=sessions[1].pk).exists()\n    resp = nyxt.get(reverse(\"usersessions_list\"))\n    assert resp.status_code == HTTPStatus.FOUND\n    assert resp[\"location\"] == reverse(\"account_login\") + \"?next=\" + reverse(\n        \"usersessions_list\"\n    )\n\n\n@pytest.mark.parametrize(\"logout_on_passwd_change\", [True, False])\ndef test_change_password_updates_user_session(\n    settings, logout_on_passwd_change, client, user, user_password, password_factory\n):\n    settings.ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE = logout_on_passwd_change\n    resp = client.post(\n        reverse(\"account_login\"),\n        {\"login\": user.username, \"password\": user_password},\n    )\n    assert resp.status_code == HTTPStatus.FOUND\n    assert len(UserSession.objects.purge_and_list(user)) == 1\n\n    new_password = password_factory()\n    resp = client.post(\n        reverse(\"account_change_password\"),\n        {\n            \"oldpassword\": user_password,\n            \"password1\": new_password,\n            \"password2\": new_password,\n        },\n    )\n    assert len(UserSession.objects.purge_and_list(user)) == (\n        0 if logout_on_passwd_change else 1\n    )\n"
  },
  {
    "path": "tests/conftest.py",
    "content": "import importlib\nimport json\nimport os\nimport random\nimport re\nimport sys\nimport time\nimport uuid\nfrom contextlib import contextmanager\nfrom pathlib import Path\nfrom unittest.mock import Mock, PropertyMock, patch\n\nfrom django.contrib.auth import get_user_model\nfrom django.contrib.messages.middleware import MessageMiddleware\nfrom django.contrib.sessions.middleware import SessionMiddleware\nfrom django.urls import clear_url_caches, set_urlconf\n\nimport pytest\n\nfrom allauth.account.models import EmailAddress\nfrom allauth.account.utils import user_email, user_pk_to_url_str, user_username\nfrom allauth.core import context\nfrom allauth.socialaccount.internal import statekit\nfrom allauth.socialaccount.providers.base.constants import AuthProcess\n\n\ndef pytest_collection_modifyitems(config, items):\n    if config.getoption(\"--ds\") == \"tests.projects.headless_only.settings\":\n        removed_items = []\n        for item in items:\n            if not item.location[0].startswith(\"tests/apps/headless\"):\n                removed_items.append(item)\n        for item in removed_items:\n            items.remove(item)\n\n\n@pytest.fixture\ndef user(user_factory):\n    return user_factory()\n\n\n@pytest.fixture\ndef auth_client(client, user):\n    client.force_login(user)\n    return client\n\n\n@pytest.fixture\ndef password_factory():\n    def f():\n        return str(uuid.uuid4())\n\n    return f\n\n\n@pytest.fixture\ndef user_password(password_factory):\n    return password_factory()\n\n\n@pytest.fixture\ndef email_verified():\n    return True\n\n\n@pytest.fixture\ndef user_factory(email_factory, db, user_password, email_verified):\n    def factory(\n        email=None,\n        username=None,\n        commit=True,\n        with_email=True,\n        email_verified=email_verified,\n        password=None,\n        phone=None,\n        phone_verified=False,\n        with_emailaddress=True,\n        with_totp=False,\n    ):\n        from allauth.account.adapter import get_adapter\n\n        if not username:\n            username = uuid.uuid4().hex\n\n        if not email and with_email:\n            email = email_factory(username=username)\n\n        User = get_user_model()\n        user = User()\n        if password == \"!\":  # nosec\n            user.password = password\n        else:\n            user.set_password(user_password if password is None else password)\n        user_username(user, username)\n        user_email(user, email or \"\")\n        if commit:\n            user.save()\n            if email and with_emailaddress:\n                EmailAddress.objects.create(\n                    user=user,\n                    email=email.lower(),\n                    verified=email_verified,\n                    primary=True,\n                )\n        if with_totp:\n            from allauth.mfa.totp.internal import auth\n\n            auth.TOTP.activate(user, auth.generate_totp_secret())\n        if phone:\n            get_adapter().set_phone(user, phone, phone_verified)\n        return user\n\n    return factory\n\n\n@pytest.fixture\ndef email_factory():\n    def factory(username=None, email=None, mixed_case=False):\n        if email is None:\n            if not username:\n                username = uuid.uuid4().hex\n            email = f\"{username}@{uuid.uuid4().hex}.org\"\n        if mixed_case:\n            email = \"\".join(\n                [random.choice([c.upper(), c.lower()]) for c in email]  # nosec\n            )\n        else:\n            email = email.lower()\n        return email\n\n    return factory\n\n\n@pytest.fixture\ndef reauthentication_bypass():\n    @contextmanager\n    def f():\n        with patch(\n            \"allauth.account.internal.flows.reauthentication.did_recently_authenticate\"\n        ) as m:\n            m.return_value = True\n            yield\n\n    return f\n\n\n@pytest.fixture\ndef webauthn_authentication_bypass():\n    @contextmanager\n    def f(authenticator):\n        from fido2.utils import websafe_encode\n\n        from allauth.mfa.adapter import get_adapter\n\n        with patch(\n            \"allauth.mfa.webauthn.internal.auth.WebAuthn.authenticator_data\",\n            new_callable=PropertyMock,\n        ) as ad_m:\n            with patch(\"fido2.server.Fido2Server.authenticate_begin\") as ab_m:\n                ab_m.return_value = ({}, {\"state\": \"dummy\"})\n                with patch(\"fido2.server.Fido2Server.authenticate_complete\") as ac_m:\n                    with patch(\n                        \"allauth.mfa.webauthn.internal.auth.parse_authentication_response\"\n                    ) as m:\n                        user_handle = (\n                            get_adapter().get_public_key_credential_user_entity(\n                                authenticator.user\n                            )[\"id\"]\n                        )\n                        authenticator_data = Mock()\n                        authenticator_data.credential_data.credential_id = (\n                            \"credential_id\"\n                        )\n                        ad_m.return_value = authenticator_data\n                        m.return_value = Mock()\n                        binding = Mock()\n                        binding.credential_id = \"credential_id\"\n                        ac_m.return_value = binding\n                        yield json.dumps(\n                            {\"response\": {\"userHandle\": websafe_encode(user_handle)}}\n                        )\n\n    return f\n\n\n@pytest.fixture\ndef webauthn_registration_bypass():\n    @contextmanager\n    def f(user, passwordless):\n        with patch(\"fido2.server.Fido2Server.register_complete\") as rc_m:\n            with patch(\n                \"allauth.mfa.webauthn.internal.auth.parse_registration_response\"\n            ) as m:\n                m.return_value = Mock()\n\n                class FakeAuthenticatorData(bytes):\n                    def is_user_verified(self):\n                        return passwordless\n\n                binding = FakeAuthenticatorData(b\"binding\")\n                rc_m.return_value = binding\n                yield json.dumps(\n                    {\n                        \"authenticatorAttachment\": \"cross-platform\",\n                        \"clientExtensionResults\": {\"credProps\": {\"rk\": passwordless}},\n                        \"id\": \"123\",\n                        \"rawId\": \"456\",\n                        \"response\": {\n                            \"attestationObject\": \"ao\",\n                            \"clientDataJSON\": \"cdj\",\n                            \"transports\": [\"usb\"],\n                        },\n                        \"type\": \"public-key\",\n                    }\n                )\n\n    return f\n\n\n@pytest.fixture(autouse=True)\ndef clear_context_request():\n    context._request_var.set(None)\n\n\n@pytest.fixture\ndef enable_cache(settings):\n    from django.core.cache import cache\n\n    settings.CACHES = {\n        \"default\": {\n            \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n        }\n    }\n    cache.clear()\n    yield\n\n\n@pytest.fixture\ndef totp_validation_bypass():\n    @contextmanager\n    def f():\n        with patch(\"allauth.mfa.totp.internal.auth.validate_totp_code\") as m:\n            m.return_value = True\n            yield\n\n    return f\n\n\n@pytest.fixture\ndef provider_id():\n    return \"unittest-server\"\n\n\n@pytest.fixture\ndef openid_connect_provider_id():\n    return \"unittest-server\"\n\n\n@pytest.fixture\ndef password_reset_key_generator():\n    def f(user):\n        from allauth.account import app_settings\n\n        token_generator = app_settings.PASSWORD_RESET_TOKEN_GENERATOR()\n        uid = user_pk_to_url_str(user)\n        temp_key = token_generator.make_token(user)\n        key = f\"{uid}-{temp_key}\"\n        return key\n\n    return f\n\n\n@pytest.fixture\ndef google_provider_settings(settings):\n    gsettings = {\"APPS\": [{\"client_id\": \"client_id\", \"secret\": \"secret\"}]}\n    settings.SOCIALACCOUNT_PROVIDERS = {\"google\": gsettings}\n    return gsettings\n\n\n@pytest.fixture\ndef twitter_provider_settings(settings):\n    tsettings = {\"APPS\": [{\"client_id\": \"client_id\", \"secret\": \"secret\"}]}\n    settings.SOCIALACCOUNT_PROVIDERS = {\"twitter\": tsettings}\n    return tsettings\n\n\n@pytest.fixture\ndef user_with_totp(user):\n    from allauth.mfa.totp.internal import auth\n\n    auth.TOTP.activate(user, auth.generate_totp_secret())\n    return user\n\n\n@pytest.fixture\ndef user_with_recovery_codes(user_with_totp):\n    from allauth.mfa.recovery_codes.internal import auth\n\n    auth.RecoveryCodes.activate(user_with_totp)\n    return user_with_totp\n\n\n@pytest.fixture\ndef passkey(user):\n    from allauth.mfa.models import Authenticator\n\n    authenticator = Authenticator.objects.create(\n        user=user,\n        type=Authenticator.Type.WEBAUTHN,\n        data={\n            \"name\": \"Test passkey\",\n            \"passwordless\": True,\n            \"credential\": {},\n        },\n    )\n    return authenticator\n\n\n@pytest.fixture\ndef user_with_passkey(user, passkey):\n    return user\n\n\n@pytest.fixture\ndef sociallogin_setup_state():\n    def setup(client, process=None, next_url=None, **kwargs):\n        state_id = \"123\"\n        session = client.session\n        state = {\"process\": process or AuthProcess.LOGIN, **kwargs}\n        if next_url:\n            state[\"next\"] = next_url\n        states = {}\n        states[state_id] = [state, time.time()]\n        session[statekit.STATES_SESSION_KEY] = states\n        session.save()\n        return state_id\n\n    return setup\n\n\n@pytest.fixture\ndef request_factory(rf):\n    class RequestFactory:\n        def get(self, path):\n            request = rf.get(path)\n            SessionMiddleware(lambda request: None).process_request(request)\n            MessageMiddleware(lambda request: None).process_request(request)\n            return request\n\n    return RequestFactory()\n\n\n@pytest.fixture\ndef get_last_email_verification_code():\n    from allauth.account.internal.flows import email_verification_by_code\n\n    def f(client, mailoutbox):\n        code = re.search(\n            \"\\n[0-9a-z-]{6,12}\\n\", mailoutbox[-1].body, re.I | re.DOTALL | re.MULTILINE\n        )[0].strip()\n        if hasattr(client, \"headless_session\"):\n            session = client.headless_session()\n        else:\n            session = client.session\n        assert (\n            session[email_verification_by_code.EMAIL_VERIFICATION_CODE_SESSION_KEY][\n                \"code\"\n            ]\n            == code\n        )\n        return code\n\n    return f\n\n\n@pytest.fixture\ndef get_last_password_reset_code():\n    from allauth.account.internal.flows import password_reset_by_code\n\n    def f(client, mailoutbox):\n        code = re.search(\n            \"\\n[0-9a-z-]{8,12}\\n\", mailoutbox[-1].body, re.I | re.DOTALL | re.MULTILINE\n        )[0].strip()\n        if hasattr(client, \"headless_session\"):\n            session = client.headless_session()\n        else:\n            session = client.session\n        assert (\n            session[password_reset_by_code.PASSWORD_RESET_VERIFICATION_SESSION_KEY][\n                \"code\"\n            ]\n            == code\n        )\n        return code\n\n    return f\n\n\n@pytest.fixture\ndef settings_impacting_urls(settings):\n    @contextmanager\n    def f(**kv):\n        def reload_urlconf():\n            clear_url_caches()\n            for urlconf in [\n                settings.ROOT_URLCONF,\n                \"allauth.account.urls\",\n                \"allauth.urls\",\n                \"allauth.mfa.urls\",\n                \"allauth.mfa.base.urls\",\n                \"allauth.headless.urls\",\n                \"allauth.headless.base.urls\",\n                \"allauth.headless.socialaccount.urls\",\n                \"allauth.headless.usersessions.urls\",\n                \"allauth.headless.mfa.urls\",\n                \"allauth.idp.urls\",\n                \"allauth.idp.oidc.urls\",\n            ]:\n                if urlconf in sys.modules:\n                    importlib.reload(sys.modules[urlconf])\n            set_urlconf(None)\n\n        old_values = {}\n        for k, v in kv.items():\n            if hasattr(settings, k):\n                old_values[k] = getattr(settings, k)\n            setattr(settings, k, v)\n        reload_urlconf()\n        yield\n        for k, v in kv.items():\n            if k in old_values:\n                setattr(settings, k, old_values[k])\n            else:\n                delattr(settings, k)\n        reload_urlconf()\n\n    return f\n\n\n@pytest.fixture(autouse=True)\ndef clear_phone_stub():\n    from tests.projects.common import phone_stub\n\n    yield\n    phone_stub.clear()\n\n\n@pytest.fixture\ndef sms_outbox():\n    from tests.projects.common import phone_stub\n\n    return phone_stub.sms_outbox\n\n\n@pytest.fixture\ndef phone_factory():\n    def f():\n        return f\"+31{random.randint(1, 10**10):010}\"\n\n    return f\n\n\n@pytest.fixture\ndef phone(phone_factory):\n    return phone_factory()\n\n\n@pytest.fixture\ndef user_with_phone(user, phone):\n    from allauth.account.adapter import get_adapter\n\n    get_adapter().set_phone(user, phone, True)\n    return user\n\n\ndef pytest_ignore_collect(collection_path, config):\n    from tests.projects.common.settings import INSTALLED_SOCIALACCOUNT_APPS\n\n    if \"allauth.socialaccount.providers.saml\" not in INSTALLED_SOCIALACCOUNT_APPS:\n        if (\n            Path(__file__).parent / \"apps\" / \"socialaccount\" / \"providers\" / \"saml\"\n            in collection_path.parents\n        ):\n            return True\n\n    tests_to_skip = {\n        \"tests.projects.account_only.settings\": (\n            \"headless\",\n            \"mfa\",\n            \"usersessions\",\n            \"socialaccount\",\n            \"idp\",\n        ),\n        \"tests.projects.headless_only.settings\": (\"idp\",),\n    }\n    dsm = os.getenv(\"DJANGO_SETTINGS_MODULE\")\n    skipped_paths = tests_to_skip.get(dsm)\n    if not skipped_paths:\n        return False\n    for skipped_path in skipped_paths:\n        abs_skipped_path = Path(__file__).parent / \"apps\" / skipped_path\n        if (\n            abs_skipped_path == collection_path\n            or abs_skipped_path in collection_path.parents\n        ):\n            return True\n    return False\n\n\n@pytest.fixture()\ndef messagesoutbox():\n    from tests.projects.common import adapters\n\n    adapters.messagesoutbox = []\n    yield adapters.messagesoutbox\n"
  },
  {
    "path": "tests/mocking.py",
    "content": "import json\nimport requests\nfrom http import HTTPStatus\nfrom unittest.mock import Mock\n\n\nclass MockedResponse:\n    def __init__(self, status_code, content, headers=None):\n        if headers is None:\n            headers = {}\n\n        self.status_code = status_code\n        if isinstance(content, dict):\n            content = json.dumps(content)\n            headers[\"content-type\"] = \"application/json\"\n        self.content = content.encode(\"utf8\")\n        self.headers = headers\n\n    def json(self):\n        return json.loads(self.text)\n\n    def raise_for_status(self):\n        pass\n\n    @property\n    def ok(self):\n        return self.status_code // 100 == 2\n\n    @property\n    def text(self):\n        return self.content.decode(\"utf8\")\n\n\nclass mocked_response:\n    def __init__(self, *responses, callback=None):\n        self.callback = callback\n        self.responses = list(responses)\n\n    def __enter__(self):\n        self.orig_get = requests.Session.get\n        self.orig_post = requests.Session.post\n        self.orig_request = requests.Session.request\n\n        def mockable_request(f):\n            def new_f(*args, **kwargs):\n                if self.callback:\n                    response = self.callback(*args, **kwargs)\n                    if response is not None:\n                        return response\n                if self.responses:\n                    resp = self.responses.pop(0)\n                    if isinstance(resp, dict):\n                        resp = MockedResponse(HTTPStatus.OK, resp)\n                    return resp\n                return f(*args, **kwargs)\n\n            return Mock(side_effect=new_f)\n\n        requests.Session.get = mockable_request(requests.Session.get)\n        requests.Session.post = mockable_request(requests.Session.post)\n        requests.Session.request = mockable_request(requests.Session.request)\n\n    def __exit__(self, type, value, traceback):\n        requests.Session.get = self.orig_get\n        requests.Session.post = self.orig_post\n        requests.Session.request = self.orig_request\n"
  },
  {
    "path": "tests/projects/account_only/__init__.py",
    "content": ""
  },
  {
    "path": "tests/projects/account_only/settings.py",
    "content": "from pathlib import Path\n\nfrom django.contrib.auth.hashers import PBKDF2PasswordHasher\n\n\nSECRET_KEY = \"psst\"\nSITE_ID = 1\nALLOWED_HOSTS = (\n    \"testserver\",\n    \"example.com\",\n)\nUSE_I18N = False\nUSE_TZ = True\n\nDATABASES = {\n    \"default\": {\n        \"ENGINE\": \"django.db.backends.sqlite3\",\n        \"NAME\": \":memory:\",\n        \"USER\": \"\",\n        \"PASSWORD\": \"\",\n        \"HOST\": \"\",\n        \"PORT\": \"\",\n    }\n}\n\nROOT_URLCONF = \"tests.projects.account_only.urls\"\nLOGIN_URL = \"/accounts/login/\"\n\nTEMPLATES = [\n    {\n        \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n        \"DIRS\": [Path(__file__).parent / \"templates\"],\n        \"APP_DIRS\": True,\n        \"OPTIONS\": {\n            \"context_processors\": [\n                \"django.template.context_processors.debug\",\n                \"django.template.context_processors.request\",\n                \"django.contrib.auth.context_processors.auth\",\n                \"django.contrib.messages.context_processors.messages\",\n            ],\n        },\n    },\n]\n\nCACHES = {\n    \"default\": {\n        \"BACKEND\": \"django.core.cache.backends.dummy.DummyCache\",\n    }\n}\n\nMIDDLEWARE = (\n    \"django.contrib.sessions.middleware.SessionMiddleware\",\n    \"django.middleware.common.CommonMiddleware\",\n    \"django.middleware.csrf.CsrfViewMiddleware\",\n    \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n    \"django.contrib.messages.middleware.MessageMiddleware\",\n    \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n    \"allauth.account.middleware.AccountMiddleware\",\n)\n\nINSTALLED_APPS = (\n    \"django.contrib.auth\",\n    \"django.contrib.contenttypes\",\n    \"django.contrib.sessions\",\n    \"django.contrib.sites\",\n    \"django.contrib.messages\",\n    \"django.contrib.staticfiles\",\n    \"django.contrib.admin\",\n    \"django.contrib.humanize\",\n    \"allauth\",\n    \"allauth.account\",\n)\n\nAUTHENTICATION_BACKENDS = (\n    \"django.contrib.auth.backends.ModelBackend\",\n    \"allauth.account.auth_backends.AuthenticationBackend\",\n)\n\nSTATIC_ROOT = \"/tmp/\"  # Dummy\nSTATIC_URL = \"/static/\"\n\n\nclass MyPBKDF2PasswordHasher(PBKDF2PasswordHasher):\n    \"\"\"\n    A subclass of PBKDF2PasswordHasher that uses 1 iteration.\n\n    This is for test purposes only. Never use anywhere else.\n    \"\"\"\n\n    iterations = 1\n\n\nPASSWORD_HASHERS = [\n    \"tests.projects.headless_only.settings.MyPBKDF2PasswordHasher\",\n    \"django.contrib.auth.hashers.PBKDF2PasswordHasher\",\n    \"django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher\",\n    \"django.contrib.auth.hashers.Argon2PasswordHasher\",\n    \"django.contrib.auth.hashers.BCryptSHA256PasswordHasher\",\n]\n\n\nACCOUNT_LOGIN_BY_CODE_ENABLED = True\nACCOUNT_ADAPTER = \"tests.projects.common.adapters.AccountAdapter\"\n"
  },
  {
    "path": "tests/projects/account_only/templates/429.html",
    "content": "429\n"
  },
  {
    "path": "tests/projects/account_only/urls.py",
    "content": "from django.contrib import admin\nfrom django.urls import include, path\n\nfrom allauth.account.decorators import secure_admin_login\n\n\nadmin.autodiscover()\nadmin.site.login = secure_admin_login(admin.site.login)\n\nurlpatterns = [\n    path(\"admin/\", admin.site.urls),\n    path(\"accounts/\", include(\"allauth.urls\")),\n    path(\"\", include(\"tests.projects.common.account.urls\")),\n]\n"
  },
  {
    "path": "tests/projects/common/__init__.py",
    "content": ""
  },
  {
    "path": "tests/projects/common/account/__init__.py",
    "content": ""
  },
  {
    "path": "tests/projects/common/account/urls.py",
    "content": "from django.urls import path\n\nfrom tests.projects.common.account.views import check_verified_email\n\n\nurlpatterns = [\n    path(\n        \"check-verified-email/\",\n        check_verified_email,\n        name=\"tests_account_check_verified_email\",\n    ),\n]\n"
  },
  {
    "path": "tests/projects/common/account/views.py",
    "content": "from django.http import HttpResponse\n\nfrom allauth.account.decorators import verified_email_required\n\n\n@verified_email_required\ndef check_verified_email(request):\n    return HttpResponse(\"VERIFIED\")\n"
  },
  {
    "path": "tests/projects/common/adapters.py",
    "content": "import typing\n\nfrom django.contrib.auth import get_user_model\nfrom django.core.exceptions import ValidationError\n\nfrom allauth.account.adapter import DefaultAccountAdapter\nfrom tests.projects.common import phone_stub\n\n\nmessagesoutbox = []\n\n\nclass AccountAdapter(DefaultAccountAdapter):\n    def set_phone(self, user, phone: str, verified: bool):\n        phone_stub.set_phone(user.pk, phone, verified)\n\n    def get_phone(self, user) -> tuple[str, bool] | None:\n        return phone_stub.get_phone(user.pk)\n\n    def set_phone_verified(self, user, phone: str):\n        phone_stub.set_phone(user.pk, phone, True)\n\n    def get_user_by_phone(self, phone):\n        user_id = phone_stub.get_user_id_by_phone(phone)\n        if user_id is None:\n            return None\n        User = get_user_model()\n        return User.objects.filter(pk=user_id).first()\n\n    def send_verification_code_sms(self, user, phone: str, code: str, **kwargs):\n        phone_stub.send_verification_code_sms(user, phone, code)\n\n    def send_unknown_account_sms(self, phone: str, **kwargs: typing.Any) -> None:\n        phone_stub.send_unknown_account_sms(phone)\n\n    def send_account_already_exists_sms(self, phone: str, **kwargs: typing.Any) -> None:\n        phone_stub.send_account_already_exists_sms(phone)\n\n    def add_message(self, *args, **kwargs):\n        message_template = kwargs.get(\"message_template\")\n        message = None\n        if message_template is None:\n            message = kwargs.get(\"message\")\n            if message is None:\n                message_template = args[2]\n        messagesoutbox.append(dict(message=message, message_template=message_template))\n        return super().add_message(*args, **kwargs)\n\n    def clean_email(self, email):\n        if email == \"invalid@test.email\":\n            raise ValidationError(\"testing\")\n        return email\n"
  },
  {
    "path": "tests/projects/common/headless/__init__.py",
    "content": ""
  },
  {
    "path": "tests/projects/common/headless/ninja/__init__.py",
    "content": ""
  },
  {
    "path": "tests/projects/common/headless/ninja/urls.py",
    "content": "from django.urls import path\n\nfrom .views import api\n\n\nurlpatterns = [\n    path(\"\", api.urls),\n]\n"
  },
  {
    "path": "tests/projects/common/headless/ninja/views.py",
    "content": "from ninja import NinjaAPI\n\nfrom allauth.headless.contrib.ninja.security import jwt_token_auth\n\n\napi = NinjaAPI(urls_namespace=\"headless\")\n\n\n@api.get(\"/resource\", auth=[jwt_token_auth])\ndef resource(request):\n    data = {\"resource\": \"ok\"}\n    if \"userinfo\" in request.GET:\n        data[\"user_email\"] = request.user.email\n    return data\n"
  },
  {
    "path": "tests/projects/common/headless/rest_framework/__init__.py",
    "content": ""
  },
  {
    "path": "tests/projects/common/headless/rest_framework/urls.py",
    "content": "from django.urls import path\n\nfrom .views import ResourceView\n\n\nurlpatterns = [\n    path(\"resource\", ResourceView.as_view(), name=\"headless_rest_framework_resource\"),\n]\n"
  },
  {
    "path": "tests/projects/common/headless/rest_framework/views.py",
    "content": "from rest_framework.response import Response\nfrom rest_framework.views import APIView\n\nfrom allauth.headless.contrib.rest_framework.authentication import (\n    JWTTokenAuthentication,\n)\n\n\nclass ResourceView(APIView):\n    authentication_classes = [JWTTokenAuthentication]\n\n    def get(self, request, *args, **kwargs):\n        data = {\"resource\": \"ok\"}\n        if \"userinfo\" in request.GET:\n            data[\"user_email\"] = request.user.email\n        return Response(data)\n"
  },
  {
    "path": "tests/projects/common/headless/urls.py",
    "content": "from django.urls import include, path\n\n\nurlpatterns = [\n    path(\"drf/\", include(\"tests.projects.common.headless.rest_framework.urls\")),\n    path(\"ninja/\", include(\"tests.projects.common.headless.ninja.urls\")),\n]\n"
  },
  {
    "path": "tests/projects/common/idp/__init__.py",
    "content": ""
  },
  {
    "path": "tests/projects/common/idp/ninja/__init__.py",
    "content": ""
  },
  {
    "path": "tests/projects/common/idp/ninja/urls.py",
    "content": "from django.urls import path\n\nfrom .views import api\n\n\nurlpatterns = [\n    path(\"\", api.urls),\n]\n"
  },
  {
    "path": "tests/projects/common/idp/ninja/views.py",
    "content": "from ninja import NinjaAPI\n\nfrom allauth.idp.oidc.contrib.ninja.security import TokenAuth\n\n\napi = NinjaAPI()\n\n\n@api.get(\"/resource\", auth=[TokenAuth(scope=[\"view-resource\"])])\ndef resource(request):\n    return {\"resource\": \"ok\", \"user_email\": request.user.email}\n"
  },
  {
    "path": "tests/projects/common/idp/rest_framework/__init__.py",
    "content": ""
  },
  {
    "path": "tests/projects/common/idp/rest_framework/urls.py",
    "content": "from django.urls import path\n\nfrom .views import ResourceView\n\n\nurlpatterns = [\n    path(\"resource\", ResourceView.as_view(), name=\"idp_rest_framework_resource\"),\n]\n"
  },
  {
    "path": "tests/projects/common/idp/rest_framework/views.py",
    "content": "from rest_framework.response import Response\nfrom rest_framework.views import APIView\n\nfrom allauth.idp.oidc.contrib.rest_framework.authentication import TokenAuthentication\nfrom allauth.idp.oidc.contrib.rest_framework.permissions import TokenPermission\n\n\nclass ResourceView(APIView):\n    authentication_classes = [TokenAuthentication]\n    permission_classes = [TokenPermission.has_scope([\"view-resource\"])]\n\n    def get(self, request, *args, **kwargs):\n        return Response(\n            {\n                \"resource\": \"ok\",\n                \"user_email\": (\n                    request.user.email\n                    if request.user and request.user.is_authenticated\n                    else None\n                ),\n            }\n        )\n"
  },
  {
    "path": "tests/projects/common/idp/urls.py",
    "content": "from django.urls import include, path\n\n\nurlpatterns = [\n    path(\"drf/\", include(\"tests.projects.common.idp.rest_framework.urls\")),\n    path(\"ninja/\", include(\"tests.projects.common.idp.ninja.urls\")),\n]\n"
  },
  {
    "path": "tests/projects/common/phone_stub.py",
    "content": "import typing\n\nfrom django.db.utils import IntegrityError\n\n\ndb: dict[int, tuple[str, bool]] = {}\nsms_outbox: list[dict] = []\n\n\ndef clear():\n    db.clear()\n    sms_outbox.clear()\n\n\ndef set_phone(user_id, phone: str, verified: bool):\n    for other_user_id, value in db.items():\n        if user_id != other_user_id and value[0] == phone:\n            raise IntegrityError\n    db[user_id] = (phone, verified)\n\n\ndef get_phone(user_id) -> tuple[str, bool] | None:\n    return db.get(user_id)\n\n\ndef send_verification_code_sms(user, phone: str, code: str):\n    sms_outbox.append(\n        {\n            \"user_id\": user.pk,\n            \"phone\": phone,\n            \"code\": code,\n        }\n    )\n\n\ndef send_unknown_account_sms(phone: str, **kwargs: typing.Any):\n    sms_outbox.append({\"phone\": phone, \"reason\": \"unknon\"})\n\n\ndef send_account_already_exists_sms(phone: str, **kwargs: typing.Any):\n    sms_outbox.append({\"phone\": phone, \"reason\": \"exists\"})\n\n\ndef get_user_id_by_phone(phone):\n    for k, v in db.items():\n        if v[0] == phone:\n            return k\n    return None\n"
  },
  {
    "path": "tests/projects/common/settings.py",
    "content": "from pathlib import Path\n\n\nINSTALLED_SOCIALACCOUNT_APPS: tuple[str, ...] = (\n    \"allauth.socialaccount\",\n    \"allauth.socialaccount.providers.agave\",\n    \"allauth.socialaccount.providers.amazon\",\n    \"allauth.socialaccount.providers.amazon_cognito\",\n    \"allauth.socialaccount.providers.angellist\",\n    \"allauth.socialaccount.providers.apple\",\n    \"allauth.socialaccount.providers.asana\",\n    \"allauth.socialaccount.providers.atlassian\",\n    \"allauth.socialaccount.providers.auth0\",\n    \"allauth.socialaccount.providers.authentiq\",\n    \"allauth.socialaccount.providers.baidu\",\n    \"allauth.socialaccount.providers.basecamp\",\n    \"allauth.socialaccount.providers.battlenet\",\n    \"allauth.socialaccount.providers.bitbucket_oauth2\",\n    \"allauth.socialaccount.providers.bitly\",\n    \"allauth.socialaccount.providers.box\",\n    \"allauth.socialaccount.providers.cilogon\",\n    \"allauth.socialaccount.providers.clever\",\n    \"allauth.socialaccount.providers.coinbase\",\n    \"allauth.socialaccount.providers.dataporten\",\n    \"allauth.socialaccount.providers.daum\",\n    \"allauth.socialaccount.providers.digitalocean\",\n    \"allauth.socialaccount.providers.dingtalk\",\n    \"allauth.socialaccount.providers.discogs\",\n    \"allauth.socialaccount.providers.discord\",\n    \"allauth.socialaccount.providers.disqus\",\n    \"allauth.socialaccount.providers.douban\",\n    \"allauth.socialaccount.providers.doximity\",\n    \"allauth.socialaccount.providers.draugiem\",\n    \"allauth.socialaccount.providers.drip\",\n    \"allauth.socialaccount.providers.dropbox\",\n    \"allauth.socialaccount.providers.dummy\",\n    \"allauth.socialaccount.providers.dwolla\",\n    \"allauth.socialaccount.providers.edmodo\",\n    \"allauth.socialaccount.providers.edx\",\n    \"allauth.socialaccount.providers.eventbrite\",\n    \"allauth.socialaccount.providers.eveonline\",\n    \"allauth.socialaccount.providers.evernote\",\n    \"allauth.socialaccount.providers.exist\",\n    \"allauth.socialaccount.providers.facebook\",\n    \"allauth.socialaccount.providers.feedly\",\n    \"allauth.socialaccount.providers.feishu\",\n    \"allauth.socialaccount.providers.figma\",\n    \"allauth.socialaccount.providers.fivehundredpx\",\n    \"allauth.socialaccount.providers.flickr\",\n    \"allauth.socialaccount.providers.foursquare\",\n    \"allauth.socialaccount.providers.frontier\",\n    \"allauth.socialaccount.providers.fxa\",\n    \"allauth.socialaccount.providers.gitea\",\n    \"allauth.socialaccount.providers.github\",\n    \"allauth.socialaccount.providers.gitlab\",\n    \"allauth.socialaccount.providers.globus\",\n    \"allauth.socialaccount.providers.google\",\n    \"allauth.socialaccount.providers.gumroad\",\n    \"allauth.socialaccount.providers.hubic\",\n    \"allauth.socialaccount.providers.hubspot\",\n    \"allauth.socialaccount.providers.instagram\",\n    \"allauth.socialaccount.providers.jupyterhub\",\n    \"allauth.socialaccount.providers.kakao\",\n    \"allauth.socialaccount.providers.lemonldap\",\n    \"allauth.socialaccount.providers.lichess\",\n    \"allauth.socialaccount.providers.line\",\n    \"allauth.socialaccount.providers.linkedin_oauth2\",\n    \"allauth.socialaccount.providers.mailchimp\",\n    \"allauth.socialaccount.providers.mailcow\",\n    \"allauth.socialaccount.providers.mailru\",\n    \"allauth.socialaccount.providers.mediawiki\",\n    \"allauth.socialaccount.providers.meetup\",\n    \"allauth.socialaccount.providers.microsoft\",\n    \"allauth.socialaccount.providers.miro\",\n    \"allauth.socialaccount.providers.naver\",\n    \"allauth.socialaccount.providers.netiq\",\n    \"allauth.socialaccount.providers.nextcloud\",\n    \"allauth.socialaccount.providers.notion\",\n    \"allauth.socialaccount.providers.odnoklassniki\",\n    \"allauth.socialaccount.providers.okta\",\n    \"allauth.socialaccount.providers.openid\",\n    \"allauth.socialaccount.providers.openid_connect\",\n    \"allauth.socialaccount.providers.openstreetmap\",\n    \"allauth.socialaccount.providers.orcid\",\n    \"allauth.socialaccount.providers.patreon\",\n    \"allauth.socialaccount.providers.paypal\",\n    \"allauth.socialaccount.providers.pinterest\",\n    \"allauth.socialaccount.providers.pocket\",\n    \"allauth.socialaccount.providers.questrade\",\n    \"allauth.socialaccount.providers.quickbooks\",\n    \"allauth.socialaccount.providers.reddit\",\n    \"allauth.socialaccount.providers.robinhood\",\n    \"allauth.socialaccount.providers.salesforce\",\n    \"allauth.socialaccount.providers.sharefile\",\n    \"allauth.socialaccount.providers.shopify\",\n    \"allauth.socialaccount.providers.slack\",\n    \"allauth.socialaccount.providers.snapchat\",\n    \"allauth.socialaccount.providers.soundcloud\",\n    \"allauth.socialaccount.providers.spotify\",\n    \"allauth.socialaccount.providers.stackexchange\",\n    \"allauth.socialaccount.providers.steam\",\n    \"allauth.socialaccount.providers.stocktwits\",\n    \"allauth.socialaccount.providers.strava\",\n    \"allauth.socialaccount.providers.stripe\",\n    \"allauth.socialaccount.providers.telegram\",\n    \"allauth.socialaccount.providers.tiktok\",\n    \"allauth.socialaccount.providers.trainingpeaks\",\n    \"allauth.socialaccount.providers.trello\",\n    \"allauth.socialaccount.providers.tumblr\",\n    \"allauth.socialaccount.providers.tumblr_oauth2\",\n    \"allauth.socialaccount.providers.twentythreeandme\",\n    \"allauth.socialaccount.providers.twitch\",\n    \"allauth.socialaccount.providers.twitter\",\n    \"allauth.socialaccount.providers.twitter_oauth2\",\n    \"allauth.socialaccount.providers.untappd\",\n    \"allauth.socialaccount.providers.vimeo\",\n    \"allauth.socialaccount.providers.vimeo_oauth2\",\n    \"allauth.socialaccount.providers.vk\",\n    \"allauth.socialaccount.providers.wahoo\",\n    \"allauth.socialaccount.providers.weibo\",\n    \"allauth.socialaccount.providers.weixin\",\n    \"allauth.socialaccount.providers.windowslive\",\n    \"allauth.socialaccount.providers.xing\",\n    \"allauth.socialaccount.providers.yahoo\",\n    \"allauth.socialaccount.providers.yandex\",\n    \"allauth.socialaccount.providers.ynab\",\n    \"allauth.socialaccount.providers.zoho\",\n    \"allauth.socialaccount.providers.zoom\",\n)\n\n# Instaling the necessary dependencies for testing SAML slows the CI pipeline\n# down considerably, as we need to:\n#\n#     pip install --no-binary xmlsec --no-binary lxml {opts} {packages}\n#\n# Also see: https://github.com/xmlsec/python-xmlsec/issues/320#issuecomment-2129076807\ntry:\n    import onelogin  # noqa\n\n    INSTALLED_SOCIALACCOUNT_APPS += (\"allauth.socialaccount.providers.saml\",)\nexcept ImportError:\n    pass\n\n\nIDP_OIDC_PRIVATE_KEY = \"\"\"\n-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDAvGhvhFJkUwEa\njq48SQ2rWHxPC/kbG9lJb0cl6qjaLA27atC/aCdmnlMnnng7PrjfOLtPatXjuKk3\nS8wpIqB74wuzEnBs+/3BaqylxN1pkazRv+w0i26B7igLQVjsUXkz/icSPoSkZSxO\nMB4vbGfwnbyUOqHaWumnDwXOZ4FKrxxXMSJcJVF141MaqANh90Wwsx7PK/Nb8hkj\nblKcbfSn9x5Q7jRN2e1yfC6xtsrR+q5o26m0H2uXiFaWtxH6GPKnsgA90RmIblQ7\nnYmg39C01Xli0z5ehzd5oAGpXEDP9uO9+1kVWor8TETl7vpaVqnauLx/tTl09qEM\nWpX6VmFVAgMBAAECggEAEdPbnSUSMfFzkq9L8ouXVhgTN4SWACntSVufqyQvhi64\n/nL86BeMPXO7oViJKoG8u/kVal0pd6znChRayBtJ2OvBc0jrWUldyXxCh/rTuCYf\nZC9qe9nB2QbccV4UCZfnrCWAG7HotwQcuwa8ZAqU+q68eMGLoxTxs+Ax20u7q9qp\nY+QNNZOuH+1pC8l+0CaTTpFa1sty+/xnGtM6UgaLVQ7E4ZvFRWyWfIAzWFzFfFWW\noVK7mYD8uVPMEpHPPlaNj+0C7LNM1NUpg/ifKPYl13OnhQr2WMji35LwrEsK0lpr\ntXw6wm7rl9NbXC93hpW9V252KNuL3LbN9lLAICSOAQKBgQD24BY4dCRErTZY8+Zp\nfBf+2h6RPHtukTFsyMdC903R4ZuLGSoteKTesAte2CfsG5YvgXx/eZHGRvnPBF7A\nPjb/ZJnk3HzsHirivZ19xvd5MVQRobUXmh42gJW5V5XixqMjBfpoWcOL5H1ly9m+\n2EZKeh7B8wNXTj/dCoOmNbF3QQKBgQDH3A8gkWT6udSMTVT1oxb1ifJUTWtwdfrn\nrZQtk1ov962sXwMqglt9sdt9+9gajF7LzxLxStRUY16U0QUMjfHVQiQQfzfnI2a7\nr2dg1g03msDg7QRVD/NHuzkQL37zeQQalrqTCbq43/CFbJDlGkr9xqNfAICya4Vp\ngJW2zdJZFQKBgQCcS4Rl20m23P5iVI+USscaRtdBVcxDVNK4r2hPwifXb4C9EIJ+\nZTnj7gpU0n574X80tkKupbWflQHEiVy/UuQYzoULunewOO0nvan+nj/Az3UM8Jao\nyZ7FHKUtwQCYoO9ZVgiRlfrSDydAkk1ZoKznq+bbHVIJLPYLqANu7+FZwQKBgQCn\nOq35rU7WMGn137soMgfC+mMnQQSWPFHuSyKCpBpBqrfKVFH83siZOxoSp4kiZbPo\nS2NpPRi/Z8o7MU5NO/RPYiF1IE3xfIC4qMMSlujGTxn22rvWRRtmOPU9YtCR/v99\nFAQXhnuTt+W0bqwq1z5KbExE8NG++RLPvYUISd4pJQKBgGxyMWgE2AeILIcrw/Ts\nzM1ct2vV7Iet8eVRPUAzESQu0aGBm7Eho9+mh3vUJtlStChJIvCT+lbEgXmsDGMk\nHxD4lATnNILRfRTdPgu8IYS3/A4LoXjjhsPmx8NQ6PwnKnseFtQMBKQsX2HVfMVP\nvOZ+KpqzUW/vig+SalRbQMIR\n-----END PRIVATE KEY-----\n\"\"\"\n\nHEADLESS_JWT_PRIVATE_KEY = IDP_OIDC_PRIVATE_KEY\n\nTEMPLATES = [\n    {\n        \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n        \"DIRS\": [Path(__file__).parent / \"templates\"],\n        \"APP_DIRS\": True,\n        \"OPTIONS\": {\n            \"context_processors\": [\n                \"django.template.context_processors.debug\",\n                \"django.template.context_processors.request\",\n                \"django.contrib.auth.context_processors.auth\",\n                \"django.contrib.messages.context_processors.messages\",\n            ],\n        },\n    },\n]\n"
  },
  {
    "path": "tests/projects/common/templates/test_403_csrf.html",
    "content": "{% load socialaccount %}\n<a href=\"{% provider_login_url \"google\" next=next %}\" class=\"nav-link\">Sign In</a>\n"
  },
  {
    "path": "tests/projects/common/urls.py",
    "content": "from django.urls import include, path\n\n\nurlpatterns = [\n    path(\"idp/\", include(\"tests.projects.common.idp.urls\")),\n    path(\"headless/\", include(\"tests.projects.common.headless.urls\")),\n    path(\"account/\", include(\"tests.projects.common.account.urls\")),\n]\n"
  },
  {
    "path": "tests/projects/headless_only/__init__.py",
    "content": ""
  },
  {
    "path": "tests/projects/headless_only/settings.py",
    "content": "from pathlib import Path\n\nfrom django.contrib.auth.hashers import PBKDF2PasswordHasher\n\nfrom tests.projects.common.settings import HEADLESS_JWT_PRIVATE_KEY  # noqa\nfrom tests.projects.common.settings import INSTALLED_SOCIALACCOUNT_APPS\n\n\nSECRET_KEY = \"psst\"\nSITE_ID = 1\nALLOWED_HOSTS = (\n    \"testserver\",\n    \"example.com\",\n)\nUSE_I18N = False\nUSE_TZ = True\n\nDATABASES = {\n    \"default\": {\n        \"ENGINE\": \"django.db.backends.sqlite3\",\n        \"NAME\": \":memory:\",\n        \"USER\": \"\",\n        \"PASSWORD\": \"\",\n        \"HOST\": \"\",\n        \"PORT\": \"\",\n    }\n}\n\nROOT_URLCONF = \"tests.projects.headless_only.urls\"\nLOGIN_URL = \"/login/\"\n\nTEMPLATES = [\n    {\n        \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n        \"DIRS\": [\n            Path(__file__).parent.parent\n            / \"examples\"\n            / \"regular-django\"\n            / \"example\"\n            / \"templates\"\n        ],\n        \"APP_DIRS\": True,\n        \"OPTIONS\": {\n            \"context_processors\": [\n                \"django.template.context_processors.debug\",\n                \"django.template.context_processors.request\",\n                \"django.contrib.auth.context_processors.auth\",\n                \"django.contrib.messages.context_processors.messages\",\n            ],\n        },\n    },\n]\n\nCACHES = {\n    \"default\": {\n        \"BACKEND\": \"django.core.cache.backends.dummy.DummyCache\",\n    }\n}\n\nMIDDLEWARE = (\n    \"django.contrib.sessions.middleware.SessionMiddleware\",\n    \"django.middleware.common.CommonMiddleware\",\n    \"django.middleware.csrf.CsrfViewMiddleware\",\n    \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n    \"django.contrib.messages.middleware.MessageMiddleware\",\n    \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n    \"allauth.account.middleware.AccountMiddleware\",\n)\n\nINSTALLED_APPS = (\n    \"django.contrib.auth\",\n    \"django.contrib.contenttypes\",\n    \"django.contrib.sessions\",\n    \"django.contrib.sites\",\n    \"django.contrib.messages\",\n    \"django.contrib.staticfiles\",\n    \"django.contrib.admin\",\n    \"django.contrib.humanize\",\n    \"allauth\",\n    \"allauth.account\",\n    \"allauth.mfa\",\n    \"allauth.usersessions\",\n    \"allauth.headless\",\n) + INSTALLED_SOCIALACCOUNT_APPS\n\nAUTHENTICATION_BACKENDS = (\n    \"django.contrib.auth.backends.ModelBackend\",\n    \"allauth.account.auth_backends.AuthenticationBackend\",\n)\n\nSTATIC_ROOT = \"/tmp/\"  # Dummy\nSTATIC_URL = \"/static/\"\n\n\nclass MyPBKDF2PasswordHasher(PBKDF2PasswordHasher):\n    \"\"\"\n    A subclass of PBKDF2PasswordHasher that uses 1 iteration.\n\n    This is for test purposes only. Never use anywhere else.\n    \"\"\"\n\n    iterations = 1\n\n\nPASSWORD_HASHERS = [\n    \"tests.projects.headless_only.settings.MyPBKDF2PasswordHasher\",\n    \"django.contrib.auth.hashers.PBKDF2PasswordHasher\",\n    \"django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher\",\n    \"django.contrib.auth.hashers.Argon2PasswordHasher\",\n    \"django.contrib.auth.hashers.BCryptSHA256PasswordHasher\",\n]\n\n\nSOCIALACCOUNT_QUERY_EMAIL = True\nSOCIALACCOUNT_PROVIDERS = {\n    \"openid_connect\": {\n        \"APPS\": [\n            {\n                \"provider_id\": \"unittest-server\",\n                \"name\": \"Unittest Server\",\n                \"client_id\": \"Unittest client_id\",\n                \"client_secret\": \"Unittest client_secret\",\n                \"settings\": {\n                    \"server_url\": \"https://unittest.example.com\",\n                },\n            },\n            {\n                \"provider_id\": \"other-server\",\n                \"name\": \"Other Example Server\",\n                \"client_id\": \"other client_id\",\n                \"client_secret\": \"other client_secret\",\n                \"settings\": {\n                    \"server_url\": \"https://other.example.com\",\n                },\n            },\n        ],\n    }\n}\n\nACCOUNT_LOGIN_BY_CODE_ENABLED = True\nACCOUNT_ADAPTER = \"tests.projects.common.adapters.AccountAdapter\"\n\nHEADLESS_ONLY = True\nHEADLESS_FRONTEND_URLS = {\n    \"account_confirm_email\": \"/spa/confirm-email?key={key}\",\n    \"account_reset_password\": \"/spa/password/reset/\",\n    \"account_reset_password_from_key\": \"/spa/password/reset/{key}/\",\n    \"account_signup\": \"/spa/signup\",\n    \"socialaccount_login_error\": \"/spa/error\",\n}\nHEADLESS_SERVE_SPECIFICATION = True\n\n\nMFA_SUPPORTED_TYPES = [\"totp\", \"webauthn\", \"recovery_codes\"]\nMFA_PASSKEY_LOGIN_ENABLED = True\nMFA_PASSKEY_SIGNUP_ENABLED = True\n"
  },
  {
    "path": "tests/projects/headless_only/urls.py",
    "content": "from django.urls import include, path\n\n\nurlpatterns = [\n    path(\"accounts/\", include(\"allauth.urls\")),\n    path(\"_allauth/\", include(\"allauth.headless.urls\")),\n    path(\"\", include(\"tests.projects.common.urls\")),\n]\n"
  },
  {
    "path": "tests/projects/login_required_mw/__init__.py",
    "content": ""
  },
  {
    "path": "tests/projects/login_required_mw/middleware.py",
    "content": "from django.contrib.auth.middleware import LoginRequiredMiddleware\n\n\nclass CustomLoginRequiredMiddleware(LoginRequiredMiddleware):\n    def handle_no_permission(self, request, view_func):\n        # Quick & dirty workaround for: https://github.com/vitalik/django-ninja/issues/1461\n        if \"/ninja/\" in request.path:\n            return None\n        return super().handle_no_permission(request, view_func)\n"
  },
  {
    "path": "tests/projects/login_required_mw/settings.py",
    "content": "from django.contrib.auth.hashers import PBKDF2PasswordHasher\n\nfrom tests.projects.common.settings import HEADLESS_JWT_PRIVATE_KEY  # noqa\nfrom tests.projects.common.settings import IDP_OIDC_PRIVATE_KEY  # noqa\nfrom tests.projects.common.settings import TEMPLATES  # noqa\nfrom tests.projects.common.settings import INSTALLED_SOCIALACCOUNT_APPS\n\n\nSECRET_KEY = \"psst\"\nSITE_ID = 1\nALLOWED_HOSTS = (\n    \"testserver\",\n    \"example.com\",\n)\nUSE_I18N = False\nUSE_TZ = True\n\nDATABASES = {\n    \"default\": {\n        \"ENGINE\": \"django.db.backends.sqlite3\",\n        \"NAME\": \":memory:\",\n        \"USER\": \"\",\n        \"PASSWORD\": \"\",\n        \"HOST\": \"\",\n        \"PORT\": \"\",\n    }\n}\n\nROOT_URLCONF = \"tests.projects.login_required_mw.urls\"\nLOGIN_URL = \"/accounts/login/\"\n\nCACHES = {\n    \"default\": {\n        \"BACKEND\": \"django.core.cache.backends.dummy.DummyCache\",\n    }\n}\n\nMIDDLEWARE = (\n    \"django.contrib.sessions.middleware.SessionMiddleware\",\n    \"django.middleware.common.CommonMiddleware\",\n    \"django.middleware.csrf.CsrfViewMiddleware\",\n    \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n    \"tests.projects.login_required_mw.middleware.CustomLoginRequiredMiddleware\",\n    \"django.contrib.messages.middleware.MessageMiddleware\",\n    \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n    \"allauth.account.middleware.AccountMiddleware\",\n)\n\nINSTALLED_APPS = (\n    \"django.contrib.auth\",\n    \"django.contrib.contenttypes\",\n    \"django.contrib.sessions\",\n    \"django.contrib.sites\",\n    \"django.contrib.messages\",\n    \"django.contrib.staticfiles\",\n    \"django.contrib.admin\",\n    \"django.contrib.humanize\",\n    \"allauth\",\n    \"allauth.account\",\n    \"allauth.mfa\",\n    \"allauth.usersessions\",\n    \"allauth.headless\",\n    \"allauth.idp.oidc\",\n) + INSTALLED_SOCIALACCOUNT_APPS\n\nAUTHENTICATION_BACKENDS = (\n    \"django.contrib.auth.backends.ModelBackend\",\n    \"allauth.account.auth_backends.AuthenticationBackend\",\n)\n\nSTATIC_ROOT = \"/tmp/\"  # Dummy\nSTATIC_URL = \"/static/\"\n\n\nclass MyPBKDF2PasswordHasher(PBKDF2PasswordHasher):\n    \"\"\"\n    A subclass of PBKDF2PasswordHasher that uses 1 iteration.\n\n    This is for test purposes only. Never use anywhere else.\n    \"\"\"\n\n    iterations = 1\n\n\nPASSWORD_HASHERS = [\n    \"tests.projects.login_required_mw.settings.MyPBKDF2PasswordHasher\",\n    \"django.contrib.auth.hashers.PBKDF2PasswordHasher\",\n    \"django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher\",\n    \"django.contrib.auth.hashers.Argon2PasswordHasher\",\n    \"django.contrib.auth.hashers.BCryptSHA256PasswordHasher\",\n]\n\n\nSOCIALACCOUNT_QUERY_EMAIL = True\nSOCIALACCOUNT_PROVIDERS = {\n    \"openid_connect\": {\n        \"APPS\": [\n            {\n                \"provider_id\": \"unittest-server\",\n                \"name\": \"Unittest Server\",\n                \"client_id\": \"Unittest client_id\",\n                \"client_secret\": \"Unittest client_secret\",\n                \"settings\": {\n                    \"server_url\": \"https://unittest.example.com\",\n                },\n            },\n            {\n                \"provider_id\": \"other-server\",\n                \"name\": \"Other Example Server\",\n                \"client_id\": \"other client_id\",\n                \"client_secret\": \"other client_secret\",\n                \"settings\": {\n                    \"server_url\": \"https://other.example.com\",\n                },\n            },\n        ],\n    }\n}\n\nACCOUNT_LOGIN_BY_CODE_ENABLED = True\nACCOUNT_ADAPTER = \"tests.projects.common.adapters.AccountAdapter\"\n\nMFA_SUPPORTED_TYPES = [\"totp\", \"webauthn\", \"recovery_codes\"]\nMFA_PASSKEY_LOGIN_ENABLED = True\nMFA_PASSKEY_SIGNUP_ENABLED = True\n\nHEADLESS_SERVE_SPECIFICATION = True\n"
  },
  {
    "path": "tests/projects/login_required_mw/templates/429.html",
    "content": "429\n"
  },
  {
    "path": "tests/projects/login_required_mw/urls.py",
    "content": "from django.contrib import admin\nfrom django.urls import include, path\n\nfrom allauth.account.decorators import secure_admin_login\n\n\nadmin.autodiscover()\nadmin.site.login = secure_admin_login(admin.site.login)\n\n\nurlpatterns = [\n    path(\"admin/\", admin.site.urls),\n    path(\"accounts/\", include(\"allauth.urls\")),\n    path(\"_allauth/\", include(\"allauth.headless.urls\")),\n    path(\"\", include(\"allauth.idp.urls\")),\n    path(\"\", include(\"tests.projects.common.urls\")),\n]\n"
  },
  {
    "path": "tests/projects/regular/__init__.py",
    "content": ""
  },
  {
    "path": "tests/projects/regular/settings.py",
    "content": "from django.contrib.auth.hashers import PBKDF2PasswordHasher\n\nfrom tests.projects.common.settings import HEADLESS_JWT_PRIVATE_KEY  # noqa\nfrom tests.projects.common.settings import IDP_OIDC_PRIVATE_KEY  # noqa\nfrom tests.projects.common.settings import TEMPLATES  # noqa\nfrom tests.projects.common.settings import INSTALLED_SOCIALACCOUNT_APPS\n\n\nSECRET_KEY = \"psst\"\nSITE_ID = 1\nALLOWED_HOSTS = (\n    \"testserver\",\n    \"example.com\",\n)\nUSE_I18N = False\nUSE_TZ = True\n\nDATABASES = {\n    \"default\": {\n        \"ENGINE\": \"django.db.backends.sqlite3\",\n        \"NAME\": \":memory:\",\n        \"USER\": \"\",\n        \"PASSWORD\": \"\",\n        \"HOST\": \"\",\n        \"PORT\": \"\",\n    }\n}\n\nROOT_URLCONF = \"tests.projects.regular.urls\"\nLOGIN_URL = \"/accounts/login/\"\n\nCACHES = {\n    \"default\": {\n        \"BACKEND\": \"django.core.cache.backends.dummy.DummyCache\",\n    }\n}\n\nMIDDLEWARE = (\n    \"django.contrib.sessions.middleware.SessionMiddleware\",\n    \"django.middleware.common.CommonMiddleware\",\n    \"django.middleware.csrf.CsrfViewMiddleware\",\n    \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n    \"django.contrib.messages.middleware.MessageMiddleware\",\n    \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n    \"allauth.account.middleware.AccountMiddleware\",\n)\n\nINSTALLED_APPS = (\n    \"django.contrib.auth\",\n    \"django.contrib.contenttypes\",\n    \"django.contrib.sessions\",\n    \"django.contrib.sites\",\n    \"django.contrib.messages\",\n    \"django.contrib.staticfiles\",\n    \"django.contrib.admin\",\n    \"django.contrib.humanize\",\n    \"allauth\",\n    \"allauth.account\",\n    \"allauth.mfa\",\n    \"allauth.usersessions\",\n    \"allauth.headless\",\n    \"allauth.idp.oidc\",\n) + INSTALLED_SOCIALACCOUNT_APPS\n\nAUTHENTICATION_BACKENDS = (\n    \"django.contrib.auth.backends.ModelBackend\",\n    \"allauth.account.auth_backends.AuthenticationBackend\",\n)\n\nSTATIC_ROOT = \"/tmp/\"  # Dummy\nSTATIC_URL = \"/static/\"\n\n\nclass MyPBKDF2PasswordHasher(PBKDF2PasswordHasher):\n    \"\"\"\n    A subclass of PBKDF2PasswordHasher that uses 1 iteration.\n\n    This is for test purposes only. Never use anywhere else.\n    \"\"\"\n\n    iterations = 1\n\n\nPASSWORD_HASHERS = [\n    \"tests.projects.regular.settings.MyPBKDF2PasswordHasher\",\n    \"django.contrib.auth.hashers.PBKDF2PasswordHasher\",\n    \"django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher\",\n    \"django.contrib.auth.hashers.Argon2PasswordHasher\",\n    \"django.contrib.auth.hashers.BCryptSHA256PasswordHasher\",\n]\n\n\nACCOUNT_ADAPTER = \"tests.projects.common.adapters.AccountAdapter\"\n\nSOCIALACCOUNT_QUERY_EMAIL = True\nSOCIALACCOUNT_PROVIDERS = {\n    \"openid_connect\": {\n        \"APPS\": [\n            {\n                \"provider_id\": \"unittest-server\",\n                \"name\": \"Unittest Server\",\n                \"client_id\": \"Unittest client_id\",\n                \"client_secret\": \"Unittest client_secret\",\n                \"settings\": {\n                    \"server_url\": \"https://unittest.example.com\",\n                },\n            },\n            {\n                \"provider_id\": \"other-server\",\n                \"name\": \"Other Example Server\",\n                \"client_id\": \"other client_id\",\n                \"client_secret\": \"other client_secret\",\n                \"settings\": {\n                    \"server_url\": \"https://other.example.com\",\n                },\n            },\n        ],\n    }\n}\n\nACCOUNT_LOGIN_BY_CODE_ENABLED = True\n\nMFA_SUPPORTED_TYPES = [\"totp\", \"webauthn\", \"recovery_codes\"]\nMFA_PASSKEY_LOGIN_ENABLED = True\nMFA_PASSKEY_SIGNUP_ENABLED = True\n\nHEADLESS_SERVE_SPECIFICATION = True\n"
  },
  {
    "path": "tests/projects/regular/urls.py",
    "content": "from django.contrib import admin\nfrom django.urls import include, path\n\nfrom allauth.account.decorators import secure_admin_login\n\n\nadmin.autodiscover()\nadmin.site.login = secure_admin_login(admin.site.login)\n\n\nurlpatterns = [\n    path(\"admin/\", admin.site.urls),\n    path(\"accounts/\", include(\"allauth.urls\")),\n    path(\"_allauth/\", include(\"allauth.headless.urls\")),\n    path(\"\", include(\"allauth.idp.urls\")),\n    path(\"\", include(\"tests.projects.common.urls\")),\n]\n"
  }
]